Java 2차원 배열
자바는 1차원 배열 말고, 1차원에서 하나의 차원을 추가하여 2차원 배열이 있다.
2차원 배열은 행과 열이 필요한 데이터에서 자주 사용되고 있다.
2차원 배열은 int[][] array = new int[2][4] 선언하고 생성하여 그림과 같이 표현된다.
int[2][4]은 먼저 행, 열 번호를 알아보도록 한다.
코드에서 표현할 때 array[row][column] 형태로 작성된다. 행은 서로 다른 값의 묶음으로 접근한다고 생각하면 이해하기 편하다.
첫 번째 row[0] 행은 1, 2, 3, 4 값을 접근할 수 있다.
두 번째 row[1] 행은 5, 6, 7, 8 값을 접근할 수 있다.
행에서 다음 행을 넘어갈 때 타입의 메모리 크기만큼 Padding이 있다.
또는 최적화된 JVM 제품군에서는 이 Padding 제거한 것도 있다.
행과 열을 알면 원하는 데이터를 가져올 수 있다. 설명보다는 코드를 살펴보는게 이해가 빠르다.
이제부터 2차원 배열을 사용하고 활용해보는 시간을 갖도록 한다.
Java 코드. 2차원 배열 데이터 가져오기
public class Array1 {
public static void main(String[] args) {
int[][] array;
array = new int[2][4];
array[0][0] = 1; // 0행 0열
array[0][1] = 2; // 0행 1열
array[0][2] = 3; // 0행 2열
array[0][3] = 4; // 0행 3열
array[1][0] = 5; // 1행 0열
array[1][1] = 6; // 1행 1열
array[1][2] = 7; // 1행 2열
array[1][3] = 8; // 1행 3열
System.out.println("0행 0열 :" + array[0][0]);
System.out.println("0행 1열 :" + array[0][1]);
System.out.println("0행 2열 :" + array[0][2]);
System.out.println("0행 3열 :" + array[0][3]);
System.out.println("1행 0열 :" + array[1][0]);
System.out.println("1행 1열 :" + array[1][1]);
System.out.println("1행 1열 :" + array[1][2]);
System.out.println("1행 1열 :" + array[1][3]);
}
}
데이터를 리터럴 값을 할당하고 데이터에 접근하여 출력하는 모습을 볼 수 있다.
이제부터 코드를 행열을 활용해 리팩토링을 해보고자 한다.
row 반복문 추가하여 개선하기
자바 코드
public class Array1 {
public static void main(String[] args) {
int[][] array;
array = new int[2][4];
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[0][3] = 4;
array[1][0] = 5;
array[1][1] = 6;
array[1][2] = 7;
array[1][3] = 8;
for (int row = 0; row < 2; row++) {
System.out.print(array[row][0] + " ");
System.out.print(array[row][1] + " ");
System.out.print(array[row][2] + " ");
System.out.print(array[row][3] + " ");
System.out.println();
}
}
}
- row에 대한 반복문을 추가하였다.
- column에 대한 처리가 되지 않아 아직은 코드가 깔끔하지 않다.
출력
1 2 3 4
5 6 7 8
column 이중 반복문 추가하여 개선하기
public class Array2 {
public static void main(String[] args) {
int[][] array;
array = new int[2][4];
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[0][3] = 4;
array[1][0] = 5;
array[1][1] = 6;
array[1][2] = 7;
array[1][3] = 8;
for (int row = 0; row < 2; row++) {
for(int column = 0; column < 4; column++) {
System.out.print(array[row][column] + " ");
}
System.out.println();
}
}
}
- 반복하여 작성된
System.out.print()
이 이중 for문으로 구조화 되었다.
리터럴 값 할당 개선하기
리터럴 값을 array[0][0] = 1;
형식으로 하나 씩 기입하였는데. 괄호로 사용하여 줄여서 표현할 수 있다.
public class Array3 {
public static void main(String[] args) {
int[][] array = {
{1, 2, 3, 4},
{5, 6, 7, 8}
};
for (int row = 0; row < 2; row++) {
for(int column = 0; column < 4; column++) {
System.out.print(array[row][column] + " ");
}
System.out.println();
}
}
}
{ {1, 2, 3, 4}, {5, 6, 7, 8} };
가독성이 필요한 경우 줄바꿈으로 표현하기 좋게 사용하도록 한다.- 만약
{ {1, 2, 3, 4}, {5, 6, 7, 8} };
리터럴을 수정하면 에러가 발생한다. 에러가 발생되지 않게 이중 for문을 수정해보도록 한다.
동적으로 크기 늘려도 문제 없이 동작하게 개선하기
2중 배열을 int[2][4] 사용하고 포맷에 맞게 for문을 구성했다. 만약 배열 크기가 다르게 줘야한다면 for문의 조건식을 수정해야한다. 이를 방지하기 위해 개선해보도록 한다.
Java 코드
public class Logical1 {
public static void main(String[] args) {
int[][] array = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
for (int row = 0; row < array.length; row++) {
for(int column = 0; column < array[row].length; column++) {
System.out.print(array[row][column] + " ");
}
System.out.println();
}
}
}
- . 점은 array 변수의 메소드를 접근할 수 있도록 해준다. array.length 붙어서 length 라는 메소드를 호출하면 행의 길이를 불려온다.
- array[row].length 메소드를 접근한 모습을 볼 수 있는데, 이는 열의 길이를 불려와 for문을 반복해주도록 하고 있다.
출력
1 2 3 4
5 6 7 8
9 10 11 12