Java

배열(Array) - 다차원 배열

제주니어 2022. 8. 21. 22:00

다차원 배열

1. 2차원 배열의 선언과 인덱스

  • 배열의 요소로 다른 배열을 가지는 배열을 2차원 배열이라고 한다.
  • 2차원 배열은 논리적으로 행과 열로 이루어진 표 형태로 존재한다고 생각하면 된다.
  • 2차원 배열은 할당된 공간마다 인덱스 번호 두 개를 갖는다. (앞 번호는 행, 뒤 번호는 열)

2차원 배열의 선언

타입[ ][ ] 변수이름;
타입 변수이름[ ][ ];
타입[ ] 변수이름[ ];

 

2차원 배열의 생성

변수명 = new 타입[행 크기][열 크기];
타입[ ][ ] 변수명; = new 타입[행 크기][열 크기];
타입 변수명[ ][ ]; = new 타입[행 크기][열 크기];

 

int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 score를 생성

2. 2차원 배열의 초기화

괄호 {}를 사용해서 생성과 초기화를 동시에 할 수 있다.

다만, 1차원 배열보다 괄호 {}를 한번 더 써서 행별로 구분해 준다.

타입[ ][ ] 변수명 = new 타입[ ][ ] {{값, 값, ..}, {값, 값, ..}, ...};
타입 변수명[ ][ ] = new 타입[ ][ ] {{값, 값, ..}, {값, 값, ..}, ...};
타입[ ][ ] 변수명 = {{값, 값, ..}, {값, 값, ..}, ...};
타입 변수명[ ][ ] = {{값, 값, ..}, {값, 값, ..}, ...};

 

int[][] score = {{100, 100, 100}. 
                {20, 20, 20}, 
                {30, 30, 30}, 
                {40, 40, 40}, 
                {50, 50, 50}
            };

 

2차원 배열 사용 시 중첩 반복문을 활용하여 편리하게 사용이 가능하다.

for(int i = 0; i < iArray.length; i++) {
    for(int j = 0; j < iArray[i].length; j++) {
        iArray[i][j] = (j + 1) * 10;

        System.out.println(iArray[i][j]);
    }
}

  • score.length의 값은 배열 참조변수 score가 참조하고 있는 배열의 길이 = 5
  • score[0].length은 배열 참조변수 score[0]이 참조하고 있는 배열의 길이 = 3
score[0].length = score[1].length = score[2].length = score[3].length = score[4].length = 3
public void method1() {
		// 메모리(Stack)에 정수형 2차원 배열의 주소를 보관할 공간이 할당된다. (참조변수)
        int[][] iArray; 
//		int iArray[][]; 
//		int[] iArray[];

        // 2차원 배열의 생성
        // 메모리(Heap)에 총 15개의 정수형 데이터를 저장할 수 있는 2차원 배열 생성
        iArray = new int[3][5]; 

        // 2차원 배열의 초기화
        /*
         *  1   2   3   4   5 
         *  6   7   8   9  10
         * 11  12  13  14  15
         * 
         * 바깥쪽 for문 -> 행의 개수만큼 반복
         * 안쪽 for문 -> 열의 개수만큼 반복
         * 
         * iArray.length = 행길이
         * iArray[].length = 열길이
         * 
         */

        // 행의 길이 출력
        System.out.println(iArray.length); // 3

        // 각 행별 열의 길이 출력
        System.out.println(iArray[0].length); // 5
        System.out.println(iArray[1].length); // 5
        System.out.println(iArray[2].length); // 5

        int value = 1;

        // 값의 초기화
        for(int i = 0; i < iArray.length; i++) {
            for(int j = 0; j  < iArray[i].length; j++) {
                iArray[i][j] = value++;
            }
        }

        // 값을 출력
        for(int i = 0; i < iArray.length; i++) {
            for(int j = 0; j < iArray[i].length; j++) {
                System.out.printf("%2d ", iArray[i][j]);
            }
            System.out.println();
			}
		}

 

3. 가변 배열

2차원 이상의 배열을 ‘배열의 배열’의 형태로 처리한다는 사실을 이용하면 보다 자유롭게 배열을 구성할 수 있다.

다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 보다 유동적인 가변 배열을 구성할 수 있다.

즉, 가변 배열은 행은 정해졌으나 각 행에 대한 열의 개수가 정해지지 않은 배열이다.

2차원 배열은 배열 여러 개가 묶인 것으로 묶여있는 배열의 길이가 모두 같을 필요는 없다.

 

가변 배열 생성 및 초기화

int[ ][ ] iArray = new int[2][ ];

 

// 가변 배열 생성 (행의 크기는 3행) 
// 생성과 동시에 초기화
double[][] dArray = {{1.1, 2.2}, {3.3}, {4.4, 5.5, 6.6}};

 

// 각 행에 다른 배열을 참조할 수 있도록 할당
iArray[0] = new int[3]; // 0행은 3열
iArray[1] = new int[2]; // 1행은 2열

// 중첩 for 문을 통한 가변 배열 초기화
for(int i = 0; i < iArray.length; i++) {
    // iArray[i].length 필드로 각 열의 길이를 얻을 수 있다.
    for(int j = 0; j < iArray[i].length; j++) {
        iArray[i][j] = j + 1;
    }
}

int[][] score = new int[5][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

 

→ 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.

score.length의 값은 여전히 5이다.

일반적인 2차원 배열과 달리 score[0].length의 값은 4, score[1].length의 값은 3으로 서로 다르다.

4. 다차원 배열의 활용

public void method3() {
		// 가변 배열의 선언과 생성을 동시에 진행
		int arr1[][] = new int[3][];
		int arr2[][] = { { 1, 2, 3 }, { 4 }, { 5, 6, 7, 8, 9 }, { 10, 11 } };

		// 각 행에 다른 배열을 참조할 수 있도록 생성
		arr1[0] = new int[2]; // 0행은 2열
		arr1[1] = new int[3]; // 1행은 3열
		arr1[2] = new int[5]; // 2행은 5열
		
		
		// 가변 배열의 출력
		for (int i = 0; i < arr1.length; i++) {
			for (int j = 0; j < arr1[i].length; j++) {
				System.out.printf("%2d", arr1[i][j]);
			}

			System.out.println();
		}
		System.out.println();

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

			System.out.println();
		}
		System.out.println();

		// 2차원 배열의 복사 > 얕은 복사가 된다. 
		int[][] arr3 = arr1.clone();

		for (int i = 0; i < arr3.length; i++) {
			for (int j = 0; j < arr3[i].length; j++) {
				System.out.printf("%2d", arr1[i][j]);
			}
			System.out.println();
		}

		System.out.println();
		
		System.out.println(arr1[0].hashCode()); // 1792845110
		System.out.println(arr1[1].hashCode()); // 896681694
		System.out.println(arr1[2].hashCode()); // 687241927
		System.out.println(arr3[0].hashCode()); // 1792845110
		System.out.println(arr3[1].hashCode()); // 896681694
		System.out.println(arr3[2].hashCode()); // 687241927
	}