다차원 배열
1. 2차원 배열의 선언과 인덱스
- 배열의 요소로 다른 배열을 가지는 배열을 2차원 배열이라고 한다.
- 2차원 배열은 논리적으로 행과 열로 이루어진 표 형태로 존재한다고 생각하면 된다.
- 2차원 배열은 할당된 공간마다 인덱스 번호 두 개를 갖는다. (앞 번호는 행, 뒤 번호는 열)
2차원 배열의 선언
타입[ ][ ] 변수이름;
타입 변수이름[ ][ ];
타입[ ] 변수이름[ ];
2차원 배열의 생성
변수명 = new 타입[행 크기][열 크기];
타입[ ][ ] 변수명; = new 타입[행 크기][열 크기];
타입 변수명[ ][ ]; = new 타입[행 크기][열 크기];
int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 score를 생성
2. 2차원 배열의 초기화
괄호 {}를 사용해서 생성과 초기화를 동시에 할 수 있다.
다만, 1차원 배열보다 괄호 {}를 한번 더 써서 행별로 구분해 준다.
타입[ ][ ] 변수명 = new 타입[ ][ ] {{값, 값, ..}, {값, 값, ..}, ...};
타입 변수명[ ][ ] = new 타입[ ][ ] {{값, 값, ..}, {값, 값, ..}, ...};
타입[ ][ ] 변수명 = {{값, 값, ..}, {값, 값, ..}, ...};
타입 변수명[ ][ ] = {{값, 값, ..}, {값, 값, ..}, ...};
int[][] score = {{100, 100, 100}.
{20, 20, 20},
{30, 30, 30},
{40, 40, 40},
{50, 50, 50}
};
2차원 배열 사용 시 중첩 반복문을 활용하여 편리하게 사용이 가능하다.
for(int i = 0; i < iArray.length; i++) {
for(int j = 0; j < iArray[i].length; j++) {
iArray[i][j] = (j + 1) * 10;
System.out.println(iArray[i][j]);
}
}
- score.length의 값은 배열 참조변수 score가 참조하고 있는 배열의 길이 = 5
- score[0].length은 배열 참조변수 score[0]이 참조하고 있는 배열의 길이 = 3
score[0].length = score[1].length = score[2].length = score[3].length = score[4].length = 3
public void method1() {
// 메모리(Stack)에 정수형 2차원 배열의 주소를 보관할 공간이 할당된다. (참조변수)
int[][] iArray;
// int iArray[][];
// int[] iArray[];
// 2차원 배열의 생성
// 메모리(Heap)에 총 15개의 정수형 데이터를 저장할 수 있는 2차원 배열 생성
iArray = new int[3][5];
// 2차원 배열의 초기화
/*
* 1 2 3 4 5
* 6 7 8 9 10
* 11 12 13 14 15
*
* 바깥쪽 for문 -> 행의 개수만큼 반복
* 안쪽 for문 -> 열의 개수만큼 반복
*
* iArray.length = 행길이
* iArray[].length = 열길이
*
*/
// 행의 길이 출력
System.out.println(iArray.length); // 3
// 각 행별 열의 길이 출력
System.out.println(iArray[0].length); // 5
System.out.println(iArray[1].length); // 5
System.out.println(iArray[2].length); // 5
int value = 1;
// 값의 초기화
for(int i = 0; i < iArray.length; i++) {
for(int j = 0; j < iArray[i].length; j++) {
iArray[i][j] = value++;
}
}
// 값을 출력
for(int i = 0; i < iArray.length; i++) {
for(int j = 0; j < iArray[i].length; j++) {
System.out.printf("%2d ", iArray[i][j]);
}
System.out.println();
}
}
3. 가변 배열
2차원 이상의 배열을 ‘배열의 배열’의 형태로 처리한다는 사실을 이용하면 보다 자유롭게 배열을 구성할 수 있다.
다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.
즉, 가변 배열은 행은 정해졌으나 각 행에 대한 열의 개수가 정해지지 않은 배열이다.
2차원 배열은 배열 여러 개가 묶인 것으로 묶여있는 배열의 길이가 모두 같을 필요는 없다.
가변 배열 생성 및 초기화
int[ ][ ] iArray = new int[2][ ];
// 가변 배열 생성 (행의 크기는 3행)
// 생성과 동시에 초기화
double[][] dArray = {{1.1, 2.2}, {3.3}, {4.4, 5.5, 6.6}};
// 각 행에 다른 배열을 참조할 수 있도록 할당
iArray[0] = new int[3]; // 0행은 3열
iArray[1] = new int[2]; // 1행은 2열
// 중첩 for 문을 통한 가변 배열 초기화
for(int i = 0; i < iArray.length; i++) {
// iArray[i].length 필드로 각 열의 길이를 얻을 수 있다.
for(int j = 0; j < iArray[i].length; j++) {
iArray[i][j] = j + 1;
}
}
int[][] score = new int[5][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];
→ 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.
score.length의 값은 여전히 5이다.
일반적인 2차원 배열과 달리 score[0].length의 값은 4, score[1].length의 값은 3으로 서로 다르다.
4. 다차원 배열의 활용
public void method3() {
// 가변 배열의 선언과 생성을 동시에 진행
int arr1[][] = new int[3][];
int arr2[][] = { { 1, 2, 3 }, { 4 }, { 5, 6, 7, 8, 9 }, { 10, 11 } };
// 각 행에 다른 배열을 참조할 수 있도록 생성
arr1[0] = new int[2]; // 0행은 2열
arr1[1] = new int[3]; // 1행은 3열
arr1[2] = new int[5]; // 2행은 5열
// 가변 배열의 출력
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.printf("%2d", arr1[i][j]);
}
System.out.println();
}
System.out.println();
for (int i = 0; i < arr2.length; i++) {
for (int j = 0; j < arr2[i].length; j++) {
System.out.printf("%2d", arr2[i][j]);
}
System.out.println();
}
System.out.println();
// 2차원 배열의 복사 > 얕은 복사가 된다.
int[][] arr3 = arr1.clone();
for (int i = 0; i < arr3.length; i++) {
for (int j = 0; j < arr3[i].length; j++) {
System.out.printf("%2d", arr1[i][j]);
}
System.out.println();
}
System.out.println();
System.out.println(arr1[0].hashCode()); // 1792845110
System.out.println(arr1[1].hashCode()); // 896681694
System.out.println(arr1[2].hashCode()); // 687241927
System.out.println(arr3[0].hashCode()); // 1792845110
System.out.println(arr3[1].hashCode()); // 896681694
System.out.println(arr3[2].hashCode()); // 687241927
}
'Java' 카테고리의 다른 글
객체(Object) - 클래스와 객체 (0) | 2022.08.22 |
---|---|
객체(Object) - 객체 지향 언어 (0) | 2022.08.22 |
배열(Array) - 배열(Array)이란? (0) | 2022.08.20 |
조건문(conditional statements) - if & switch (0) | 2022.08.19 |
반복문(iteration statements) - for & while & do-while (0) | 2022.08.19 |