
자바에서 다차원 배열은 배열 안에 배열이 들어 있는 구조를 의미한다. 실무에서는 3차원 이상 배열을 사용하는 경우가 드물기 때문에, 보통 2차원 배열을 기준으로 학습한다.
2차원 배열은 행(row)과 열(column) 구조를 가지며, 테이블 형태의 데이터를 표현할 때 자주 사용된다.
2차원 배열은 다음과 같은 방식으로 선언할 수 있다.
int[][] arr01 = new int[3][2]; // 선언 방식 #1 (행과 열 모두 지정)
int[][] arr02 = new int[3][]; // 선언 방식 #2 (행만 지정, 열은 나중에)
int[][] arr03 = {{1, 2}, {3, 4}, {5, 6}}; // 선언 방식 #3 (선언과 동시에 초기화)
2차원 배열에서 반드시 지정해야 하는 것은 행(row)의 크기이다. 열(column)은 나중에 각각 다르게 할당할 수 있다.
구조를 그림으로 표현하면 다음과 같다.
{
{1, 2}, → 1행(row)
{3, 4}, → 2행(row)
{5, 6} → 3행(row)
}
2차원 배열은 [행][열] 구조로 접근한다.
int[][] arr03 = {{1,2}, {3,4}, {5,6}};
// 값 접근
System.out.println(arr03[2][0]); // 5
2차원 배열에서 각 요소는 "배열"이기 때문에, 단순 출력 시 주소값이 출력된다.
System.out.println(arr03); // [[I@36baf30c
System.out.println(arr03[2]); // [I@7a81197d
System.out.println(Arrays.toString(arr03)); // [[I@..., [I@..., [I@...]
따라서 내부 값 출력은 반복문을 통해 처리해야 한다.
for (int i = 0; i < arr03.length; i++) {
for (int j = 0; j < arr03[i].length; j++) {
System.out.print(arr03[i][j] + " / ");
}
System.out.println();
}
각 행(row)마다 열(column)을 순회해야 하므로 중첩 for문 구조가 된다.
1차원 배열 단위로 출력할 경우 다음과 같이 사용할 수 있다.
for (int i = 0; i < arr03.length; i++) {
System.out.println(Arrays.toString(arr03[i]));
}
2차원 배열도 향상된 for문을 사용할 수 있다. 단, 내부 구조가 배열이기 때문에 이중 향상된 for문이 필요하다.
for (int[] arr1 : arr03) { // 1차 배열 단위
for (int arr2 : arr1) { // 각 요소 접근
System.out.print(arr2 + " - ");
}
System.out.println();
}
출력 결과:
1 - 2 -
3 - 4 -
5 - 6 -
향상된 for문은 index를 사용하지 않고 값을 순차적으로 읽기만 할 때 매우 간결하다.
일반 for문을 이용해 2차원 배열에 값을 채우는 예제이다.
int[][] nums = new int[10][10];
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
nums[i][j] = (10 * i) + j + 1;
System.out.print(nums[i][j] + " ");
}
System.out.println();
}
값 입력 후, 향상된 for문으로 출력하면 다음과 같다.
for (int[] number : nums) {
System.out.println(Arrays.toString(number));
}
또는 다차원 배열 전용 출력 메소드인 Arrays.deepToString()을 사용할 수 있다.
System.out.println(Arrays.deepToString(nums));
기존 1차원 배열 방식:
int[] lottoNums = new int[6];
for (int j = 0; j < 5; j++) {
for (int i = 0; i < lottoNums.length; i++) {
lottoNums[i] = (int)(Math.random()*45 + 1);
}
Arrays.sort(lottoNums);
System.out.println(Arrays.toString(lottoNums));
}
int[][] lotto = new int[5][6];
for (int i = 0; i < lotto.length; i++) {
for (int j = 0; j < lotto[i].length; j++) {
lotto[i][j] = (int)(Math.random() * 45) + 1;
}
Arrays.sort(lotto[i]);
System.out.println(Arrays.toString(lotto[i]));
}
2차원 배열을 사용하면 여러 묶음 데이터 관리가 훨씬 직관적으로 가능하다.
2차원 배열의 특징:
2차원 배열은 배열 안에 배열이 들어 있는 구조로, 표 형태의 데이터를 처리할 때 매우 유용하다. 일반 for문을 사용하면 인덱스 기반 제어가 가능하고, 향상된 for문을 사용하면 가독성이 크게 향상된다.
데이터를 수정하거나 위치 기반 처리가 필요할 경우에는 일반 for문, 단순 출력이나 순차 접근만 필요할 경우에는 향상된 for문을 사용하는 것이 가장 이상적인 방식이다.