배열이란, 동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다. 즉, 값들이 같은 의미를 지니면서 서로 연관성이 있을 때, 이들을 하나의 덩어리로 묶을 수 있으며, 이렇게 묶여진 값들의 집합을 배열이라고 한다.
배열은 아래와 같이 값을 넣어줄 수 있다.
double[] temperatureOfJuly = {27.4, 30.1, ..., 31.8};
배열을 선언할 때는 대괄호([]
)를 사용해 선언하고 중괄호({}
)를 사용해 값들을 묶을 수 있다.
여기서 배열이 가진 각 값들을 배열의 요소(element)라고 한다. 그리고, 배열의 각 요소는 0에서부터 시작하는 번호를 부여받는데, 이처럼 배열의 각 요소가 부여받는 순번을 인덱스(index)라고 한다.
1차원 배열은 가장 일반적인 배열의 형태로, 배열의 요소가 아닌 배열을 의미한다.
double[] temperatureOfJuly;
temperatureOfJuly = new double[31];
참고로, 선언과 초기화는 아래와 같이 하나의 문장으로도 작성할 수 있다.
double[] temperatureOfJuly = new double[31];
이제 배열의 값에 접근하는 방법을 알아보겠다.
배열 내 특정 요소에 할당되어져 있는 값에 접근하려면 배열 찹조 변수의 이름과 배열의 인덱스를 활요하면 된다. 즉, 배열_참조_변수_이름[인덱스]
로 배열의 요소에 접근할 수 있다.
예를 들어 아래와 같이 배열을 선언한 경우,
double[] temperatureOfJuly = { 27.4, 30.1, 31.1, 32.4, ..., 31.8 };
인덱스는 0부터 시작하므로,
temperatureOfJuly[0]
의 값은 27.4가 되고, temperatureOfJuly[1]
의 값은 30.1, temperatureOfJuly[2]
의 값은 31.1, temperatureOfJuly[3]
의 값은 32.4, temperatureOfJuly[30]
의 값은 31.8이 되게 된다.
배열이 가진 요소의 개수를 배열의 길이 또는 크기라고 한다. 배열의 길이는 배열_참조_변수_이름.length
로 얻을 수 있다.
double[] temperatureOfJuly = new double[31];
System.out.println(temperatureOfJuly.length); // 31
배열의 길이가 31이라면 배열 마지막 요소의 인덱스는 30이 된다. 즉, 배열의 길이 - 1이 배열 마지막 요소의 인덱스가 된다.
2차원 배열은 배열의 각 요소가 또 다른 배열인 구조일 뿐, 1차원 배열과 크게 다른 점은 없다.
2차원 배열을 선언하고 초기화하는 방법은 1차원 배열과 유사하다.
int[][] kcal;
kcal = new int[31][3];
위 코드는 1차원 배열에서와 마찬가지로 한 줄로 줄여서 작성 가능하다.
int[][] kcal = new int[31][3];
이 2차원 배열의 내부 배열은 int
형의 기본값인 0을 3개씩 저장하고 있으며, 외부 배열은 내부 배열({0, 0, 0}
) 31개를 저장하고 있다.
엄밀히 말하면, 내부 배열은 3개의 0을 요소로 가지지만, 외부 배열의 각 요소는 내부 배열의 주소값을 저장하고 있다.
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
...
{ 0, 0, 0 }
}
2차원 이상의 다차원 배열에서는 1차원보다는 자유로운 형태로 배열을 만들 수 있다. 즉, 배열이 2차원 이상일 때, 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며, 이러한 배열을 가변 배열이라고 한다.
가변 배열을 선언하고 초기화 하는 방법은 다음과 같다.
int[][] ages = new int[5][];
위 예제의 new int[5][[]
에서 , 외부 배열은 크기를 5로 지정했으나, 마지막 차수에 해당하는 내부 배열에는 크기를 지정하지 않았다. 이처럼 마지막 차수에 해당하는 배열의 크기를 지정하지 않으면 가변 배열이 생성된다.
이 때 생성된 것은 내부 배열의 크기를 자유롭게 지정할 수 있는 외부 배열이다. 즉, 외부 배열만 생성된 상태이다.
int[][] ages = new int[5][];
System.out.println("Arrays.toString(ages) = " + Arrays.toString(ages));
// 결과
// Arrays.toString(ages) = [null, null, null, null, null]
내부 배열을 생성하려면 new int[]
를 사용하여 외부 배열의 각 요소에 할당해주면 된다.
int[][] ages = new int[5][];
ages[0] = new int[5];
ages[1] = new int[6];
ages[2] = new int[7];
ages[3] = new int[8];
ages[4] = new int[9];
System.out.println("Arrays.toString(ages[0]) = " + Arrays.toString(ages[0]));
System.out.println("Arrays.toString(ages[1]) = " + Arrays.toString(ages[1]));
System.out.println("Arrays.toString(ages[2]) = " + Arrays.toString(ages[2]));
System.out.println("Arrays.toString(ages[3]) = " + Arrays.toString(ages[3]));
System.out.println("Arrays.toString(ages[4]) = " + Arrays.toString(ages[4]));
// 결과
// Arrays.toString(ages[0]) = [0, 0, 0, 0, 0]
// Arrays.toString(ages[1]) = [0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[2]) = [0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[3]) = [0, 0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[4]) = [0, 0, 0, 0, 0, 0, 0, 0, 0]
앞서 배운 반복문을 활용하여 배열을 탐색할 수 있으며, 기본적으로 인덱스와 배열의 크기(length)를 활용하여 탐색한다는 점에서 문자열 탐색과 비슷하다.
일반적인 for
문으로 배열을 순회하여 총합을 구하는 코드는 다음과 같다.
int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
System.out.println(sum); // 470
while
문을 통한 배열 순회는 다음과 같이 할 수 있다.
int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;
int i = 0;
while (i < scores.length) {
sum += scores[i++];
}
System.out.println(sum); // 470
향상된 for문(Enhanced for
문)으로도 배열의 각 요소에 접근할 수 있다.
int[] scores = { 100, 90, 85, 95, 100 };
int sum = 0;
for (int score: scores) {
sum += score;
}
System.out.println(sum); // 470
향상된 for
문을 사용할 때 주의해야 할 사항이 있습니다. 향상된 for
문을 통해 배열을 순회하는 것은 배열의 값을 읽어오는 것만 가능합니다. 즉, 향상된 for
문으로 배열을 순회하면서 배열의 값을 수정할 수는 없습니다.
int[] scores = { 100, 90, 85, 95, 100 };
// 일반적인 for문 및 while문을 사용하면 배열 요소의 값을 바꿀 수 있습니다.
for (int i = 0; i < scores.length; i++) {
scores[i] = 0;
}
System.out.println("for문 사용 : " + Arrays.toString(scores));
int j = 0;
while (j < scores.length) {
scores[j++] = 1;
}
System.out.println("while문 사용 : " + Arrays.toString(scores));
// 향상된 for문을 사용하면 배열 요소의 값을 바꿀 수 없습니다.
for (int score: scores) {
score = 2;
}
System.out.println("향상된 for문 사용 : " + Arrays.toString(scores));
/*
실행 결과
for문 사용 : [0, 0, 0, 0, 0]
while문 사용 : [1, 1, 1, 1, 1]
향상된 for문 사용 : [1, 1, 1, 1, 1]
*/