코린이의 소소한 공부노트

배열 (4) 2차원 배열 본문

Java

배열 (4) 2차원 배열

무지맘 2022. 1. 24. 15:07

2차원 배열은 테이블(표) 형태의 데이터를 저장하기 위한 배열로, 1차원 배열 여러 개가 합쳐진 모양이라고 생각하면 된다.

1) 왼쪽

  - 길이가 3인 1차원 배열(굵은 테두리)들이 보인다.

  - 그 1차원 배열이 4줄 쌓여있다.

  - 즉, 이 테이블의 데이터는 4행 3열이다.

  - 2차원 배열을 생성할 때는 배열 기호 [ ]를 2개 쓴다.

2) 오른쪽

  - 테이블이 여러 개 쌓여있다.

  - 2차원 배열이 여러 개 모이면 3차원 배열이 된다.

 

그럼 2차원 배열의 인덱스는 어떻게 봐야 하는 걸까?

1) 행

  - 가로로 한 줄이 한 행을 나타낸다. 그래서 행 인덱스는 세로로 쓰게 된다.

  - 4행이므로 행 인덱스의 범위는 0 ~ 4-1 -> 0부터 3까지다.

2) 열

  - 세로로 한 줄이 한 열을 나타낸다. 그래서 열 인덱스는 가로로 쓰게 된다.

  - 3열이므로 열 인덱스의 범위는 0 ~ 3-1 -> 0부터 2까지다.

3) 2차원 배열의 요소 출력

  - 배열 이름과 함께 행열 인덱스를 입력하면 해당 요소가 출력된다.

  - 인덱스 범위를 넘어가게 되면 에러가 발생한다.

>> 2차원이기 때문에 인덱스가 하나 더 늘어난 것일 뿐, 1차원 배열과 같은 방식으로 인덱스가 정해진다.

 

2차원 배열의 초기화도 1차원 배열과 마찬가지다. 초기화를 하지 않는다면 해당 타입의 기본값으로 자동 초기화된다.

// 1부터 15까지의 수를 담은 3행 5열 int 2차원 배열 만들기

// 1) new 키워드를 이용한 생성. 거의 안씀
int[][] num = new int[][]{ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };

// 2) 기본형처럼 사용
int[][] num = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };

// 3) 2차원 배열의 모양이 나오게 2)를 약간 조정. 가장 많이 쓰는 형태
int[][] num = {
            {1,2,3,4,5},
            {6,7,8,9,10},
            {11,12,13,14,15}
        };

 

 

3행 5열 int 배열이니까 int를 담을 15개의 공간이 생기는데, 1차원 배열처럼 15개가 다 붙어있을까?

1) num

  - 2차원 배열의 참조변수로, (3행이므로) 길이가 3인 배열의 시작주소(0x100)를 담고 있다.

  - 배열의 각 요소에는 각 행을 표현하는 배열의 시작주소(0x200, 0x300, 0x400)가 담겨있다.

2) num[0]

  - num 배열의 첫 번째 요소로, 1행에 대응되는 1차원 배열의 시작주소(0x200)을 담고 있는 참조변수이다.

  - 0x200으로 가면 배열이름이 num[0]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.

  - 각 배열의 요소는 1행의 요소인 1, 2, 3, 4, 5이다.

3) num[1]

  - num 배열의 두 번째 요소로, 2행에 대응되는 1차원 배열의 시작주소(0x300)을 담고 있는 참조변수이다.

  - 0x300으로 가면 배열이름이 num[1]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.

  - 각 배열의 요소는 2행의 요소인 6, 7, 8, 9, 10이다.

4) num[2]

  - num 배열의 세 번째 요소로, 3행에 대응되는 1차원 배열의 시작주소(0x400)을 담고 있는 참조변수이다.

  - 0x400으로 가면 배열이름이 num[2]이고, (5열이므로) 길이가 5인 1차원 배열이 기다리고 있다.

  - 각 배열의 요소는 3행의 요소인 11, 12, 13, 14, 15이다.

5) 저장공간의 연속성

  - 2차원 배열의 참조변수 num을 따라가면 각 행의 시작주소가 담긴 1차원 배열이 있고, 공간은 연속적이다.

  - num의 각 요소를 따라가면 각 행의 내용을 담고 있는 1차원 배열이 있고, 공간은 연속적이다.

  - 그러나 각 행은 불연속적이다. 즉, 2차원 배열이 생성되어도 모든 저장공간이 다 붙어있는 형태는 아니다.

 

지금까지 예시로 본 2차원 배열들은 각 행의 요소의 개수가 모두 같았는데, 각 행마다 열의 개수가 달라도 상관없다.

int[][] num = new int[][]{ 
        {1,2,3,4,5},	// 1행은 5열
        {6,7,8},	// 2행은 3열
        {9, 10},	// 3행은 2열
        {11,12,13,14}	// 4행은 4열
        };

for (int i=0 ; i<num.length ; i++) { // 행 인덱스
    for (int j=0 ; j<num[i].length ; j++) { // 열 인덱스
        System.out.print(num[i][j] + " ");
    } // for j 끝
    System.out.println(); // 한 행이 모두 출력된 후 줄바꿈
} // for i 끝

// 결과
1 2 3 4 5 
6 7 8 
9 10 
11 12 13 14

1) i

  - 행 인덱스를 나타낸다.

  - 2차원 배열 num의 경우 행은 총 4개이므로 i = 0, 1, 2, 3

2) j

  - 열 인덱스를 나타낸다.

  - i가 달라질 때마다 반복 횟수도 달라진다. i = 0, 1, 2, 3일 때 num[i].length = 5, 3, 2, 4

  - j의 조건식에 특정 리터럴 아닌 상황마다 변하는 수(num[i].length)를 써놨으므로 열의 개수의 관계없이 출력된다.

'Java' 카테고리의 다른 글

배열 (5) Arrays클래스  (0) 2022.02.20
String 클래스  (0) 2022.02.06
배열 (3) 활용 예시  (0) 2022.01.20
배열 (2) 초기화, 출력  (0) 2022.01.19
배열 (1) 선언과 생성, 인덱스  (0) 2022.01.14