자료형이 같은 1차원 배열의 묶음으로 배열 안에 다른 배열이 존재
2차원 배열은 할당된 공간마다 인덱스 번호 두 개 부여(앞 번호는 행, 뒷 번호는 열([0][0]))
1차원 배열 : 변수를 묶음으로 다루는 것
2차원 배열 : 1차원 배열을 묶음으로 다루는 것
3차원 배열 : 2차원 배열을 묶음으로 다루는 것

자료형[][] 배열명;
자료형 배열명[][];
자료형[] 배열명[];
int[][] arr;
=> int 2차원 배열을 참조하는 참조변수 arr 선언
참조변수 == 참조형 == 레퍼런스 변수 == 레퍼런스
자료형[][]배열명 = new 자료형[행크기][열크기];
자료형 배열명[][] = new 자료형[행크기][열크기];
자료형[] 배열명[] = new 자료형[행크기][열크기]
ex)
int[][] arr = new int[3][4];
int arr[][] = new intt[3][4];
arr = new int[2][3];
heap 영역에 int 2차원 배열 2행 3열 공간을 할당

ex)
arr[0][0] = 1;
arr[1][1] = 2;
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
ex)
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = j;
}
}
int num = 10; // 배열 요소 초기화에 사용할 변수
for(int row = 0; row < arr.length; row++) { // 행 반복 (0,1) 2회 반복
for(int col = 0 ; col < arr[row].length; col++) { // 열 반복 3회 반복
arr[row][col] = num;
num += 10;
}
}
결과값
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
배열 길이
-> 배열명.length 는 변수가 직접 참조하고 있는 배열의 길이를 반환
System.out.println(arr.length); // 2 (행길이)
// arr이 참조하고 있는 2차원 배열의 행의 길이
System.out.println(arr[0].length); // 3 (열길이)
System.out.println(arr[1].length); // 3 (열길이)
참조하고 있는 1차원 배열 값을 문자열로 반환
System.out.println("Arrays.toString() : " + Arrays.toString(arr));
결과값
Arrays.toString() : [[I@626b2d4a, [I@5e91993f]
참조하고 있는 배열의 데이터가 나오는 부분까지 파고 들어가서
모든 값을 문자열로 반환
System.out.println("Arrays.deeptoString() : " + Arrays.deepToString(arr));
결과값
Arrays.deeptoString() : [[10, 20, 30], [40, 50, 60]]
ex)
int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int[][] arr = new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}};
String fruit[][] = {{"사과", "딸기", "석류"}, {"바나나", "참외", "레몬"}};
int[][] arr = { {1,2,3},
{4,5,6},
{7,8,9} };
출력 예)
0 행의 합 : 6
1 행의 합 : 15
2 행의 합 : 24
for (int row = 0 ; row < arr.length ; row++) { // 행 반복 3번
int sum = 0;
for (int col = 0 ; col < arr[row].length ; col++) {
// 열 반복
sum += arr[row][col];
// 첫번째 row 는 0 고정
// arr[0][0] == 1
// arr[0][1] == 2
// arr[0][2] == 3
// sum == 6
// 두번째 row 는 1 고정
// arr[1][0] == 4
// arr[1][1] == 5
// arr[1][2] == 6
// sum == 15
// 세번째 row 는 2 고정
// arr[2][0] == 7
// arr[2][1] == 8
// arr[2][2] == 9
// sum == 24
}
System.out.printf("%d행의 합 : %d\n", row, sum);
}
출력 예)
0열의 합 : 12
1열의 합 : 15
2열의 합 : 18
// col 고정 row 증가
for (int col = 0 ; col < arr.length ; col++) { // 행 반복 3번
int sum = 0;
for (int row = 0 ; row < arr[col].length ; row++) {
// 열 반복
sum += arr[row][col];
}
System.out.printf("%d열의 합 : %d\n", col, sum);
}
다차원 배열 생성 시 마지막 배열차수의 크기를 지정하지 않고 나중에 서로 크기가 다른 배열로 지정한 배열.
2차원 가변 배열
자료형[ ][ ] 배열명 = new 자료형[행크기][ ];
ex)
int[][] arr = new int[4][];
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[5];
arr[3] = new int[2];

char ch = 'a'; // 문자형
for(int row = 0 ; row < arr.length ; row ++) { // 행
for (int col = 0 ; col < arr[row].length ; col++) {
// row 값에 따라 도는 횟수 다름
arr[row][col] = ch++;
}
}
System.out.println(Arrays.deepToString(arr));
결과값
[[a, b, c], [d, e, f, g], [h, i, j, k, l], [m, n]]