본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/3. 참조 타입

6. Java 자바 참조 타입 - 다차원 배열

다차원 배열

 

수학 행렬처럼 가로 인덱스와 세로 인덱스를 사용한다.

 

2행 3열 행렬을 만들기 위해서는 아래와 같이 2차원 배열을 생성한다.

 

int[ ][ ] scores = new int[2][3]


위의 코드는 아래와 같이 세 개의 배열 객체를 생성한다.

 

2차원 배열의 스택, 힙 영역 생성 방식

배열 변수 scores는 길이 2인 배열 A를 참조한다.

scores[0]은 다시 길이 3인 배열 B를 참조하고 scores[1]은 다시 길이 3인 배열 C를 참조한다.

 

scores[0] 과 scores[1]은 모두 배열을 참조하는 변수 역할을 한다.

 

따라서 각 배열의 길이는 아래와 같이 얻을 수 있다.

 

  scores.length      // 2 (배열 A의 길이)

  scores[0].length   // 3 (배열 B의 길이)

  scores[1].length   // 3 (배열 C의 길이)

 

즉 scores[0][1] 은 배열 B의 인덱스 1 의 값, scores[1][0] 은 배열 C의 인덱스 0의 값에 해당된다.

 

 

자바는 일차원 배열이 서로 연결된 구조로 배열을 구현하기 때문에 행렬 구조가 아닌 계단식 구조를 가질 수 있다.

 

  int[ ][ ] scores = new int[2][ ];      // 배열 A 생성

  scores[0] = new int[2];    // 0 1      배열 B 생성

  scores[1] = new int[3];    // 0 1 2   배열 C 생성

 

위 코드는 아래와 같이 메모리에 배열 객체를 생성한다.

 

계단형 2차원 배열 생성 방식

 

  scores.length;      // 2 (배열 A의 길이)

  scores[0].length;   // 2 (배열 B의 길이)

  scores[1].length;   // 3 (배열 C의 길이)

 

계단형 배열에서 주의할 점

 

- 배열의 길이를 알고 인덱스를 사용해야 한다!

 

  scores[0][2];   // ArrayIndexOutOfBoundsException 발생

  배열 B 의 객체의 마지막 인덱스는 1이기 때문이다.

 

  scores[1][2]는 배열 C 객체의 세 번째 항목을 가리킨다.

 

 

- 만약 그룹화된 값 목록을 가지고 있다면, 중괄호 안에 중괄호를 이용해서 값 목록으로 생성할 수 있다.

 

  타입[ ][ ] 변수 = { {값1, 값2, . . . }, { 값1, 값2, . . . }, . . . };

 

ex)

    int[ ][ ] scores = { {95, 80}, {92, 96} };

 

    int score = scores[0][0]    // 95

    int score = scores[1][1]    // 96

 

ex) 배열 속의 배열

public class ArrayInArrayExam {
	public static void main(String[] args) {
    	
        int[][] mathScores = new int[2][3];
        for(int i = 0; i < mathScores.length; i++) {
        	for(int k = 0; k < mathScores[i].length; k++) {
            	System.out.println("mathScores["+i+"]["+k+"]="+mathScores[i][k]);
            }
        }
        System.out.println();
        
        int[][] englishScores = new int[2][];
        englishScores[0] = new int[2];
        englishScores[1] = new int[3];
        
        for(int i = 0; i < englishScores.length; i++) {
        	for(int k = 0; k < englishScores[i].length; k++) {
            	System.out.println("englishScores["+i+"]["+k+"]="+englishScores[i][k]);
            }
        }
        System.out.println();
        
        int[][] javaScores = { {95, 80}, {92, 96, 80} };
        for(int i = 0; i < javaScores.length; i++) {
        	for(int k = 0; k < javaScores[i].length; k++) {
            	System.out.println("javaScores["+i+"]["+k+"]="+javaScores[i][k]);
            }
        }
    }
}