💁♀️ 다차원 배열(Dimensional Array)이란,
다차원 배열은 2차원 이상의 배열을 의미하며, 배열의 인덱스마다 또 다른 배열의 주소를 보관하는 배열
즉, 2차원 배열은 1차원 배열 여러 개를 하나로 묶어서 관리
int[][] iarr1;
int iarr2[][];
int[] iarr3[];
>>> 모두 가능
>>> 배열의 주소를 관리하는 배열의 길이는 앞 부분에 정수형으로 표기하며 반드시 크기를 지정해줘야함
// iarr1 = new int[][];
>>> 크기를 지정하지않으면 에러 발생
// iarr1 = new int[][4];
>>> 주소를 묶어서 관리할 배열의 크기를 지정하지 않으면 에러 발생
iarr1 = new int[3][];
>>> 관리할 배열이 총 3개
iarr1[0] = new int[5];
iarr1[1] = new int[5];
iarr1[2] = new int[5];
🙋 잠깐! 2차원 배열의 생성 및 할당을 동시에 할 수 있을까?
[1] 정변 배열
>> 관리하는 '여러 개의 배열의 길이가 동일한 경우' 아래와 같이 한 번에 할당 가능 iarr2 = new int[3][5];
[2] 가변 배열
>> 여러 개의 배열의 길이가 각각 다른 경우 위에서 했던 방식처럼 인덱스별로 배열을 따로 할당 >> 정변 배열 방식 불가능 iarr2[0] = new int[5]; iarr2[1] = new int[10]; iarr2[2] = new int[3];
>>> 0번 인덱스의 배열 값 출력
for(int i = 0; i < iarr1[0].length; i++) {
// iarr1[0].length : iarr1(레퍼런스 배열)의 0번 인덱스가 맡고있는 1차원 배열의 길이
System.out.print(iarr1[0][i] + " ");
}
System.out.println();
>>> 1번 인덱스의 배열 값 출력
for(int i = 0; i < iarr1[1].length; i++) {
// iarr1[1].length : iarr1(레퍼런스 배열)의 1번 인덱스가 맡고있는 1차원 배열의 길이
System.out.print(iarr1[1][i] + " ");
}
System.out.println();
>>> 2번 인덱스의 배열 값 출력
for(int i = 0; i < iarr1[2].length; i++) {
// iarr1[2].length : iarr1(레퍼런스 배열)의 2번 인덱스가 맡고있는 1차원 배열의 길이
System.out.print(iarr1[2][i] + " ");
}
System.out.println();
for(int i = 0; i < iarr1.length; i++) {
for(int j = 0; j < iarr1[i].length; j++) {
System.out.print(iarr1[i][j] + " ");
}
System.out.println();
}
정변 배열의 경우, 선언과 동시에 모든 배열을 할당할 수 있음
자료형[][] 변수명 = new 자료형[할당할 배열의 갯수][할당할 배열의 길이]
int[][] iarr = new int[3][5];
// 각 배열의 인덱스에 접근해서 값 대입 후 출력 (예시)
// 1 2 3 4 5
// 6 7 8 9 10
// 11 12 13 14 15
int value = 1;
for(int i = 0; i < iarr.length; i++) {
for(int j = 0; j < iarr[i].length; j++) {
iarr[i][j] = value++;
>>> 연산자의 우선순위에 따라 value의 값은 대입된 후 증가됨
}
}
>>> 값 출력
for(int i = 0; i < iarr.length; i++) {
for(int j = 0; j < iarr[i].length; j++) {
System.out.print(iarr[i][j] + " ");
}
System.out.println();
}
가변 배열의 경우, 선언과 동시에 모든 배열을 할당할 수 없으며, 할당할 배열의 갯수만 지정하고 각 인덱스에 서로 다른 길이의 배열을 따로 할당해야함
자료형[][] 변수명 = new 자료형[할당할 배열의 갯수][];
변수명[배열 인덱스] = new 자료형[배열의 길이]
>>> '주소를 관리하는 배열'의 주소를 보관하기 위한 변수 선언
int[][] iarr = new int[3][];
>>> 주소를 관리하는 배열의 각 인덱스마다 배열을 할당하여 주소값 대입
iarr[0] = new int[3];
// iarr[1] = new char[2]; >>> 자료형이 다른 배열은 하나로 묶어서 관리할 수 없다.
iarr[1] = new int[2];
int[] arr = new int[5];
iarr[2] = arr; >>> 미리 할당해둔 배열을 이용해서도 가능
>>> 각 배열의 인덱스마다 접근하여 값 대입 후 출력
>>> 값 대입
iarr[0][0] = 1;
iarr[0][1] = 2;
iarr[0][2] = 3;
// iarr[0][3] = 4;
>>> 위에서 iarr행을 3까지만 만들었으므로 오류 (공간이 만들어지지않음)
>>> java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 오류 발생
iarr[1][0] = 4;
iarr[1][1] = 5;
iarr[2][0] = 6;
iarr[2][1] = 7;
iarr[2][2] = 8;
iarr[2][3] = 9;
iarr[2][4] = 10;
>>> iarr[2]가 선언되지 않은 뒤, 이 문장을 실행하면 java.lang.NullPointerException 오류 발생
>>> (2번 인덱스에 배열이 할당되어있지 않다면 null 오류 발생)
// iarr[3][0] = 11;
>>> java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 오류 발생
>>> 가변 배열 역시 반복문을 이용해서 값을 대입하고 출력할 수 있다. */
for(int i = 0; i < iarr.length; i++) {
for(int j = 0; j < iarr[i].length; j++) {
System.out.print(iarr[i][j] + " ");
}
System.out.println();
}
int[][] iarr = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}};
for(int i = 0; i < iarr.length; i++) {
for(int j = 0; j < iarr[i].length; j++) {
System.out.print(iarr[i][j] + " ");
>>>" "의 역할은 그저 숫자 사이의 띄어쓰기 용도
}
System.out.println();
}
int[][] iarr2 = {{1, 2, 3}, {4, 5}, {6, 7, 8, 9, 10}};
for(int i = 0; i < iarr2.length; i++) {
for(int j = 0; j < iarr2[i].length; j++) {
System.out.print(iarr2[i][j] + " ");
}
System.out.println();
}
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = {6, 7, 8, 9, 10};
int[][] arr3 = {arr1, arr2};
for(int i = 0; i < arr3.length; i++) {
for(int j = 0; j < arr3[i].length; j++) {
System.out.print(arr3[i][j] + " ");
}
System.out.println();
}