배열 (Array)
💡 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
💡 String[] classGroup = { "김철수", "김영희", "한소희",...}
➡️ classGroup이라는 변수에 문자열로 된 배열이 담긴다.
1) 배열의 선언과 생성
선언방법 | 선언 예 |
타입[] 변수이름; | int[] score;
String[] name;
|
타입 변수이름[]; | int score[];
String name[];
|
a. 배열의 생성
타입[] 변수이름; // 배열을 선언 (배열을 다루기 위한 참조변수 선언)
변수이름 = new 타입[길이]; // 배열을 생성 (실제 저장공간을 생성)
📍 각 배열요소는 자동적으로 int의 기본값(default)인 0으로 초기화
2) 배열의 길이와 인덱스
🚀 생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.
🚀 인덱스(index)는 배열의 요소마다 붙여진 일련번호
➡️ 인덱스의 범위는 0부터 '배열길이 -1'까지
➡️ 인덱스로 상수 대신 변수나 수식도 사용할 수 있다
score[0] = 0 ;
score[1] = 10;
score[2] = 20;
score[3] = 30;
score[4] = 40;
* [0],[1],[2],[3],.. : '인덱스'(위치를 알려주는 원리)
for (int i = 0; i < 5; i++) {
score[i] = i * 10;
}
a. 배열의 길이
· 배열의 길이는 양의 정수(0도 포함) 이어야 하며 최대값은 int 타입의 최대값, 약 20억이다
b. 배열이름.length
· 배열은 한번 생성하면 길이를 변경할 수 없기 때문에, 이미 생성된 배열의 길이는 변하지 않는다.
· '배열이름.length'는 상수다.
· for문의 조건식에 배열의 길이를 직접 적어주는 것보다. '배열이름.length'를 사용하는 것이 좋다.
c. 배열의 길이 변경하기
1) 더 큰 배열을 새로 생성
2) 기존 배열의 내용을 새로운 배열에 복사
3) 배열의 초기화
🚀 배열은 생성과 동시에 자동적으로 기본값으로 초기화 됨
➡️ 원하는 값을 저장하려면 각 요소마다 값을 지정해줘야 함
➡️ 배열의 길이가 큰 경우에는 요소 하나하나에 값을 지정하기 보다는 for문을 사용
int score = new int [] { a , b, c, d, e }; // 배열의 생성과 초기화를 동시에
int score = { a , b, c, d, e }; // new int[] 를 생략할 수 있음
(단, 배열의 선언과 생성을 따로하는 경우에는 생략 불가)
int[] score = new int[0]; // 길이가 0인 배열
int[] score = new int[]{}; // 길이가 0인 배열
int[] score = {}; // 길이가 0인 배열, new int [ ] 가 생략됨
4) 배열의 출력
🚀 for문 사용 또는 Arrays.toString(배열이름) 메서드 사용
→ 배열의 모든 요소를 '[첫번째 요소, 두번째 요소, ...]' 와 같은 형식의 문자열로 만들어서 반환
🚀 아래 변수 iArr 값을 바로 출력하면 '타입 @ 주소' 형식으로 출력된다.
→참조변수는 heap 영역에, 지역변수&매개변수는 stack 영역에 저장 됨.
-> 그렇기 때문에 참조 변수는 주소로 출력됨.
int[] iArr = {100, 95, 80, 70, 60};
for(int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i] + ",");
}
System.out.println();
System.out.prinln(iArr); // [I@7344699f
System.out.prinln(Arrays.toString(iArr)); // [100, 95, 80, 70, 60]
✓ 메모리 구조
public class Exam01 {
public static void main(String[] args) {
int[] student; // 힙공간의 배열의 주소가 저장될 변수 생성.
student = new int[3]; // 힙공간의 길이가 3인 배열 생성(연속된 주소를 가짐)하고 주소를 반환.
// 정수 배열이 생성이 되고, 초기화를 하지 않으면 자동으로 0으로 초기화.
System.out.println("현재 자동으로 초기화된 값: " + student[0]); // 0
// 인덱스를 이용하여 개별 요소의 값을 변경.
student[0] = 30; // 배열의 첫 번째 요소에 30을 저장
student[1] = 20; // 배열의 두 번째 요소에 20을 저장
student[2] = 10; // 배열의 세 번째 요소에 10을 저장
System.out.println("현재 첫 번째 요소의 값: " + student[0]); // 30
}
}
배열 출력 3가지 방법
📍 for문 출력 | foreach문 출력 | Array.toString() 출력
public class Exam02 {
public static void main(String[] args) {
// for문으로 배열 초기화
int[] c = new int[10];
for(int i = 0; i < c.length; i++) {
c[i] = i;
}
// 배열의 요소를 출력하는 방법 3가지.
// for문을 이용한 출력
System.out.println(c.length);
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
// foreach 문을 이용한 출력
System.out.println();
for(int d: c) { // (배열의 요소 : 배열).
// 반복시에 변수 d에 순서대로 요소가 들어감. 자바스크립트의 for of문과 유사.
System.out.println(d);
}
// Arrays.toString 메서드 사용. 문자열로 출력.
System.out.println();
System.out.println(Arrays.toString(c));
}
}
배열 사용 X VS. 배열 사용 O
✔️ 학생 5명의 성적 총점과 평균
public class MyArray_01 {
public static void main(String[] args) {
// 1. 배열을 사용하지 않는 경우
int score_001 = 95;
int score_002 = 76;
int score_003 = 67;
int score_004 = 56;
int score_005 = 87;
int total = score_001 + score_002 + score_003 + score_004 + score_005;
double avg = (double)total / 5;
System.out.println("총점은 " + total + "점이고, 평균은 " + avg + "입니다.");
// 2. 배열을 사용하는 경우
// 총점은 for문을 이용해서 구할 수 있고, 배열의 갯수가 늘어난다 해도
// 총점을 구하는 for문과 평균을 구하는 코드를 수정할 필요가 없음
total = 0;
int[] scores = {95, 76, 67, 56, 87}; // 배열 생성
for (int i = 0; i < scores.length; i++) {// scores.length -> 배열의 갯수
total += scores[i];
}
avg = (double)total / scores.length;
System.out.println("총점은 " + total + "점이고, 평균은 " + avg + "입니다.");
}
}
최대값 최소값 구하기
public class MyArray_03 {
public static void main(String[] args) {
/* 최대값, 최소값 구하기 */
int[] score = { 79, 88, 91, 33, 100, 55, 95 };
int max = score[0]; // 배열의 첫 번째 값으로 최대값을 초기화 한다.
int min = score[0]; // 배열의 첫 번째 값으로 최소값을 초기화 한다.
for(int i = 1; i < score.length; i++) {
if(score[i] > max) {
max = score[i];
System.out.println("max: " + max); // 값이 변경되는 것이 안 보이기 때문에 이해가 안될 때 써보기.
}
if(score[i] < min) {
min = score[i];
}
} // end of for
System.out.println("최대값 : " + max);
System.out.println("최소값 : " + min);
}
}
응용 문제
public class Ex_01_Array_03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean run = true; // 반복문의 조건으로 사용 -> 값이 false가 된다면 반복문이 종료
int studentNum = 0; // 학생수
int[] scores = null; // 점수를 입력 받을 빈 배열 생성. 사용자에게 입력받은 학생수를 기준으로 배열 생성.
while (run) {
System.out.println("-----------------------------------------------------");
System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
System.out.println("-----------------------------------------------------");
System.out.print("선택> ");
int selectNo = scanner.nextInt();
if (selectNo == 1) { // 학생수를 입력 받아서 배열 생성
System.out.print("학생수> ");
studentNum = scanner.nextInt();
scores = new int[studentNum];
System.out.println(Arrays.toString(scores));
} else if (selectNo == 2) { // 생성된 배열의 갯수 만큼 점수 입력
for(int i = 0; i < scores.length; i++) {
System.out.print("scores["+i+"] : ");
scores[i] = scanner.nextInt();
}
} else if (selectNo == 3) { // 입력받은 배열의 값을 출력
for(int i = 0; i < scores.length; i++) {
System.out.println("score["+i+"] : " + scores[i]);
}
} else if (selectNo == 4) { // 최고 점수, 평균 점수 출력
int max = 0;
int sum = 0;
double avg = 0;
for(int i = 0; i < scores.length; i++) {
max = (max < scores[i]) ? scores[i] : max;
sum += scores[i];
}
avg = (double) sum / studentNum; // 평균
System.out.println("최고 점수: " + max);
System.out.println("평균 점수: " + avg);
} else if (selectNo == 5) { // run 값 변경
run = false;
}
}
System.out.println("프로그램 종료");
scanner.close();
}
}
실행 예)
-----------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
-----------------------------------------------------
선택> 1
학생수> 3
[0, 0, 0]
-----------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
-----------------------------------------------------
선택> 2
scores[0]> 90
scores[1]> 80
scores[2]> 70
-----------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
-----------------------------------------------------
선택> 3
scores[0]: 90
scores[1]: 80
scores[2]: 70
-----------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
-----------------------------------------------------
선택> 4
최고 점수: 90
평균 점수: 80.0
-----------------------------------------------------
1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료
-----------------------------------------------------
선택> 5
프로그램 종료
* 내용 참고 : 학원강의 및 자바의 정석 3rd
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 메소드 (method) 선언과 구현 · 호출 · 종류 (0) | 2024.08.09 |
---|---|
[Java] Array | 배열의 활용 · 2차원 배열 (0) | 2024.08.09 |
[Java] while 문 · break문 · continue 문 (0) | 2024.08.09 |
[Java] Switch문 · for문 (0) | 2024.05.22 |
[Java] 비트 연산자 · if 문 (0) | 2024.05.21 |