Java 2차원 배열

자바는 1차원 배열 말고, 1차원에서 하나의 차원을 추가하여 2차원 배열이 있다.

2차원 배열은 행과 열이 필요한 데이터에서 자주 사용되고 있다.

2차원 배열의 각 인덱스

2차원 배열은 int[][] array = new int[2][4] 선언하고 생성하여 그림과 같이 표현된다.

int[2][4]은 먼저 행, 열 번호를 알아보도록 한다.

행은 영어로 row 이다.

코드에서 표현할 때 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