본문 바로가기

p-languages/java

java/ 다차원 배열

다차원 배열

값들이 목록의 형태가 아닌 행과 열로 구성된 배열을 2차원 배열이라고 한다.

 

행과 열의 형태로 배열이 구성되었다는 뜻은 배열 안에 배열이 중첩되었다는 것을 의미한다. 즉, 다음과 같이 생성한 2차원 배열은 길이가 2인 배열 arr에 길이가 3인 배열이 중첩되었다는 뜻이다. 배열 변수는 길이가 2인 배열 arr을 참조하고, arr의 arr[0]은 다시 길이가 3인 배열을 참조하게 되는 구조이다.

 

int[][] arr = new int[2][3];

 

배열의 길이로 생성한 2차원 배열에 직접 값 목록을 주어서 살펴본다.

arr = new int[][] {{10, 20}, {30, 40}, {50, 60}};

 

위와 같이 2차원 배열 선언과 동시에 값을 주었다고 하면, 해당 배열 객체의 값들은 다음과 같이 저장되는 셈이다.

  0
1
2
0 arr[0] 10 arr[0][0] 30 arr[0][1] 50 arr[0][2]
1 arr[1] 20 arr[1][0] 40 arr[1][1] 60 arr[1][2]

행렬 형식으로 보면 2차원 배열이 가로 인덱스와 세로 인덱스를 사용한다는 것을 직관적으로 이해할 수 있다. 

 

arr.length //2
arr[0].length //3
arr[1].length //3

위 테이블에서 볼 수 있듯이 2차원 배열의 길이는 위와 같은 형식으로 반환된다.

 

배열이 행렬과 다른 점은 계단식 구조를 가질 수 있다는 점이다. 만약 행렬과 동일하게 길이가 일관되게 지정되는 경우,  배열의 초기값이 그대로 저장되어 있지만 사용하지 않는 공간이 발생할 수 있고 배열마다 일정하지 않은 공간이 남을 수 있기 때문에 메모리 사용 측면에서 비효율적이다. 배열에서는 이런 문제점을 가변 배열의 사용으로 해결한다.

 

int[][] arr = new int[2][];

처음 배열의 길이는 2으로 지정하지만 그 배열이 참조할 배열의 길이는 초기화하지 않고 놓아둔다. 이렇게 생성된 배열에는 각자 길이가 다른 배열을 다시 참조하게 할 수 있다.

arr = new int[][] { {15, 23, 29}, {25, 21} };
  0
1
2
0 arr[0] 15 arr[0][0] 23 arr[0][1] 29 arr[0][2]
1 arr[1] 25 arr[1][0] 21 arr[1][1]  

 

2차원 가변 배열 eg.

public class Main {
    public static void main(String[] args) {
        int[][] arr = new int[2][];
        arr = new int[][]{{15, 23, 29}, {25, 21}};
        System.out.println(arr.length);
        System.out.println(arr[0].length);
        System.out.println(arr[1].length);

        for(int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i].length; j++){
                System.out.printf("arr[%d][%d] = %d \n", i, j, arr[i][j] );
            }
        }
    }
}

2차원 가변 배열 eg. 출력

 

+String 객체를 참조하는 String[] 배열

String은 기본적으로 클래스 타입이다. 따라서 String[] 배열은 문자열을 직접적으로 저장하는 것이 아니라 String 객체의 번지, 즉 객체를 참조하게 된다.

String[] strArr = new String[4];
strArr =  new String[] {"아직도", "자바", "아직도", "어려워요"};
//strArr 배열 객체는 "자바" "아직도" "어려워요" 문자열을 참조한다
//문자열 "자바"는 String 클래스 타입으로 String 객체를 참조한다
//strArr는 String 클래스를 참조하고, String 클래스는 String 객체를 참조한다

기본적으로 새로 객체를 생성해주지 않는 이상 같은 문자열을 가지는 String 변수는 같은 객체를 참조하게 되므로 strArr[0]과 strArr[2]가 참조하는 객체의 번지는 같다.

 

 

+n차원 배열도 같은 식으로 사용 가능하다

 

 

reference. 신용권, 혼자 공부하는 자바, 한빛미디어, 2019