배열은 같은 타입의 데이터를 여러개 저장할 수 있는 공간이다. 배열의 각 저장공간은 '인덱스(index)'를 따라 연속적으로 배치되어 있다. 인덱스는 배열의 저장공간마다 붙여진 일련번호다. 배열에 저장되어 있는 각각의 값을 '배열의 요소(element)'라고 한다. 배열에 저장할 수 있는 데이터의 개수를 배열의 '크기' 혹은 '길이'라고 한다. 배열의 특징은 다음과 같다.
선언
int[] array;
정수형 배열의 '주소값'을 저장하는 변수 `array`를 선언한다.
생성
array = new int[5]
크기가 5인 정수형 배열을 생성하고 그 주소값을 `array`에 저장한다.
일반적으로 위 두 문장을 이어 다음과 같이 쓴다.
int[] array = new int[5]
자료형[] 참조변수명 = new 자료형[크기]
정수 5개를 담는 배열을 생성하고, 배열의 '주소값'을 변수 `array`에 대입한다.
배열을 처음 생성하면 배열의 자료형에 맞는 기본값들이 저장되어 있다.
예를 들어, 크기가 5인 정수형 배열이라면 0
이 5개 저장되어 있다. 각 자료형의 기본값은 다음과 같다.
자료형 | 기본값 |
---|---|
int | 0 |
double | 0.0 |
char | 유니코드 첫 번째 문자 |
String | null (주소값 없음) |
boolean | false |
또한, 배열의 길이를 나타내는 특별한 상수가 저장된다. 이미 생성된 배열의 길이는 변경할 수 없기 때문에 상수다. 배열이름.length
를 통해 조회할 수 있다.
int[] array = new int[5]
길이가 5인 정수형 배열을 생성하고, 배열의 주소값을 변수 array에 대입한다.
int length = array.lengt
배열 array의 길이(5)를 변수 length에 대입한다.
배열에 원하는 값을 저장하는 방법은 두 가지이다.
인덱스를 활용해 저장하거나 선언과 동시에 원하는 값을 저장하면된다.
int[] array = new [5]
array[0] = 10 배열 array의 첫 번째에 10을 저장한다.
array[1] = 20 배열 array의 두 번째에 10을 저장한다.
5개의 인덱스 중 나머지에는 기본값이 저장된다.
int [] array = { 10, 20 }
배열 array의 첫 번째, 두 번째에 각각 10과 20이 저장된다.
배열의 길이는 자동으로 2가 된다.
String
의 저장일반적으로 정수같이 기본형을 저장하는 배열은 배열의 타입에 맞는 값이 저장되어 있다. 그러나 String배열은 각 인덱스에 String객체의 '주소값'이 저장되어 있다. 이처럼 객체를 저장하는 배열도 생성할 수 있다.
배열에 저장된 값은 해당 값이 저장된 인덱스를 활용해서 조회할 수 있다. 배열에 저장된 값의 타입과 그 값을 저장하려는 변수의 타입은 일치해야 한다.
public class ArrayApp {
public static void main(String[] args) {
int[] intArray = {1, 2, 3};
// 배열 생성
int value1 = intArray[0];
int value2 = intArray[1];
int value3 = intArray[2];
// 배열의 값들을 변수에 저장
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
// 배열의 값들이 저장된 변수를 활용하여 배열의 요소들 출력
}
}
출력
1
2
3
for
문의 활용위에서 배운 배열이름.length
와 for
문을 활용해 배열의 처음 요소부터 마지막 요소까지 접근할 수 있다. 아래 예제를 보자.
public class ArrayApp {
public static void main(String[] args) {
// 시험성적이 1등인 학생의 이름, 국어, 영어, 수학, 총점, 평균 출력하기
String[] names = {"AAA", "BBB", "CCC", "DDD",};
int[] korScores = {100, 90, 80, 85,};
int[] engScores = {52, 87, 44, 82,};
int[] mathScores = {72, 53, 81, 99,};
int maxTotalScore = 0;
int savedIndex = -1;
for (int index = 0; index < names.length; index++) {
int kor = korScores[index];
int eng = engScores[index];
int math = mathScores[index];
int totalScore = kor + eng + math;
if (totalScore > maxTotalScore) {
maxTotalScore = totalScore;
savedIndex = index;
}
}
String name = names[savedIndex];
int kor = korScores[savedIndex];
int eng = engScores[savedIndex];
int math = mathScores[savedIndex];
int totalScore = kor + eng + math;
double average = totalScore/3.0;
System.out.println("이름: " + name);
System.out.println("국어: " + kor);
System.out.println("영어: " + eng);
System.out.println("수학: " + math);
System.out.println("총점: " + totalScore);
System.out.println("평균: " + average);
}
}
각 배열의 첫 번째 인덱스부터 for문 내부에 선언된 변수에 저장하여
총점을 구한다.
현재 인덱스로부터 꺼낸 값이 maxTotalScore
보다 크면 그 값을 maxTotalScore
에 저장하고 현재 인덱스도 savedIndex
에 저장한다.
현재 인덱스로부터 꺼낸 값이 maxTotalScore
보다 작으면 다음 인덱스로 넘어간다.
1~3과정을 배열의 마지막까지 반복한 후, savedIndex
를 이용해 총점이 1등인 학생의 값들을 출력한다.
Enhanced-for
문의 활용자료형[] 배열변수명 = {값1, 값2, 값3}
for (자료형 변수명 : 배열변수명) {
수행문1
수행문2
}
* 자료형 : 배열에 저장된 값의 타입이다.
* 변수명 : 배열의 각 요소를 저장할 변수의 이름이다.
* 배열변수 : 향상된 for문을 사용해서 반복처리할 대상배열이다.
* 향상된 for문은 지정된 배열변수의 배열의 모든 요소를 처음부터 끝까지 자동을 순회한다.
* 향상된 for문은 지정된 배열의 값을 순서대로 변수에 저장하고, 수행문을 실행한다.
Enhanced-for
문을 활용하면 배열의 요소를 처음부터 끝까지 접근하기 위한 코드를 훨씬 간편하게 작성할 수 있다.
아래 예제는 크기가 5인 정수형 배열을 생성한 후, 배열의 모든 값을 출력하는 코드이다.
public class EnhancedForApp {
public static void main(String[] args) {
int[] intArray = new int[5];
intArray[0] = 10;
intArray[1] = 15;
intArray[2] = 20;
intArray[3] = 25;
intArray[4] = 30;
for (int element : intArray) {
System.out.print(element + " ");
}
}
}
출력
10 15 20 25 30
아래 예제는 Enhanced-for
문을 응용하여 배열에서 최대값과 최소값을 찾는 코드이다.
public class EnhancedForApp {
public static void main(String[] args) {
int[] numbers = {10, 20, 5, 2, 99, 52, 44, 61};
int min = Integer.MAX_VALUE; // int 자료형의 최대값 저장
int max = Integer.MIN_VALUE; // int 자료형의 최소값 저장
for (int value : numbers) {
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
}
System.out.println("최소값: " + min);
System.out.println("최대값: " + max);
}
}
변수min
의 초기값이 정수형의 최대값인 이유는 순회하고자하는 배열의 최소값보다 더 작은 값이 min
에 저장되는 것을 방지하기 위함이다.
예를 들어 min
의 초기값이 0이라면 배열의 최소값은 2지만, 배열을 순회하면서 그 어떤 값도 min
에 저장되지 못할 것이다. max
의 초기값이 정수형의 최소값인 이유도 마찬가지이다.
1차원 배열과 다차원 배열
1차원 배열
자료형[] 변수명 = new 자료형[크기];
자료형[] 변수명 = {값, 값, 값, 값, ...};
2차원 배열
자료형[][]변수명 = new 자료형[크기][크기];
자료형[][]변수명 = {{값, 값, 값}, {값, 값, 값}, {값, 값, 값}, ...};
2차원 배열을 포함해 배열 내부에 또 다른 배열을 가지는 구조를 다차원 배열이라고 한다. 2차원 배열은 행렬을 표현하는 데 사용할 수 있다.
아래 예제는 중첩 for문을 사용해서 2차원 배열에 저장된 값들을 출력하는 예제이다.
public class Array6 {
public static void main(String[] args) {
// 2차원 배열 생성
int[][] scores = new int[2][3];
// 2차원 배열에 값 저장
scores[0][0] = 40;
scores[0][1] = 60;
scores[0][2] = 30;
scores[1][0] = 80;
scores[1][1] = 90;
scores[1][2] = 70;
// 중첩 for문을 사용하여 2차원 배열에 저장된 값 출력
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(scores[i][j] + " ");
}
System.out.println();
}
// 향상된 for문을 사용하여 2차원 배열에 저장된 값 출력
for (int[] row : scores) {
for (int value : row) {
System.out.print(value + " ");
}
System.out.println();
}
}
}
위 예제의 2차원 배열을 도식화하면 다음과 같다.