CodeGym /행동 /JAVA 25 SELF /2차원 배열

2차원 배열

JAVA 25 SELF
레벨 7 , 레슨 3
사용 가능

1. 소개

일반적인 배열을 피자 상자처럼 길쭉한 통으로 떠올려 보세요. 모든 조각이 한 줄로 놓여 있죠 — 맛있지만 단조롭습니다.

이번에는 작업 일정표나 체스판을 떠올려 봅시다. 거기서는 모든 것이 로 조직되어 있습니다 — 즉 죠. 이것이 바로 2차원 배열의 전형적인 사용 사례입니다.

현실 세계에서는 2차원 배열이 곳곳에서 쓰입니다:

  • 직원 급여 표(행 — 직원, 열 — 월).
  • 화면의 이미지(각 “셀”은 픽셀의 색으로, X와 Y 두 좌표를 가집니다).
  • 행렬 연산과 데이터 처리.
  • 체스판이나 틱택토 보드.

때때로 2차원 배열을 행렬이라고도 부릅니다(수학에서 온 이름입니다).

프로그래머로서 2차원 배열이 필요한 곳은 매우 많습니다. 거의 모든 보드게임의 구현은 곧바로 2차원 배열입니다: “체스”, “체커”, “틱택토”, “배틀십”:

2차원 배열 2

“체스”나 “배틀십”의 게임 보드는 2차원 배열에 딱 들어맞습니다. 칸의 좌표로 숫자만 사용하면 되죠. “폰 e2 ⟶ e4”가 아니라 “폰 (4,1) ⟶ (4,3)”처럼요. 프로그래머 입장에서는 이쪽이 훨씬 더 간단합니다.

2. 2차원 배열 선언 문법

처음 선언할 때만 겁이 납니다! 한 단계씩 살펴보죠.

일반 규칙


tip[][] imyaMassiva;
Java에서 2차원 배열 선언

여기서 빈 [] 대괄호 두 개는 컴파일러가 밤새 커피 마시고 낸 오타가 아니라, 배열이 2차원임을 나타냅니다.

예시

int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;

배열 생성

크기를 지정합니다: 수와 수.

matrix = new int[3][4]; // 3행, 4열

이는 3x4 표입니다. 3개의 행과 4개의 열을 가진 Excel 표를 떠올려 보세요.

변수를 선언하면서 바로 2차원 배열을 생성할 수도 있습니다:

int[][] matrix = new int[3][4];

값으로 바로 초기화할 수도 있습니다(1차원 배열과 비슷하게):

int[][] example = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
// 3행, 3열 표
2차원 배열을 값으로 초기화

시각적 도식

┌─────┬─────┬─────┬─────┐
│  0  │  1  │  2  │  3  │  ← 열 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │  ← 행 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │  ← 행 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │  ← 행 2 (Row 2)
└─────┴─────┴─────┴─────┘

각 요소는 [행, 열] 두 인덱스 쌍으로 지정됩니다.

3. 인덱싱과 요소 접근

2차원 배열에서는 요소에 접근할 때 두 개의 인덱스를 지정합니다:

  • 첫 번째 — 행 번호.
  • 두 번째 — 열 번호.

      // 두 번째 행(인덱스 1), 세 번째 열(인덱스 2)
      matrix[1][2] = 99;
2차원 배열 요소에 값 할당

체스에 익숙한 분들을 위해 덧붙이면, 인덱스는 0부터 시작합니다. 즉, 첫 번째 요소는 [0][0]입니다.

쓰기와 읽기

int[][] data = new int[5][2];
data[1][1] = 5;         // 쓰기
int value = data[1][1]; // 읽기

메모리에서는 다음과 같이 보입니다:

2차원 배열

4. 2차원 배열 채우기

1부터 12까지 연속된 숫자로 행렬을 채우는 코드를 작성해 보며 동작 방식을 이해해 봅시다.

int[][] matrix = new int[3][4];
int value = 1;

for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 4; col++)
    {
        matrix[row][col] = value;
        value++;
    }
}
2차원 배열을 순차 숫자로 채우기

그림:

실행 후:
┌────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │
├────┼────┼────┼────┤
│ 5  │ 6  │ 7  │ 8  │
├────┼────┼────┼────┤
│ 9  │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘

5. 2차원 배열의 구조

이제 2차원 배열이 실제로 어떻게 구성되는지 알아봅시다. 준비되셨나요?

2차원 배열은 사실 ‘배열의 배열’입니다!

다르게 말하면, 일반 배열에서는 “배열 변수는 배열 요소를 담는 컨테이너의 참조를 저장”하지만, 2차원 배열에서는 조금 더 복잡합니다. “2차원 배열 변수는 1차원 배열들에 대한 참조를 담는 컨테이너의 참조를 저장”합니다. 말로 설명하는 것보다 한 번 보는 게 낫죠:

2차원 배열의 구조

왼쪽에는 ‘2차원 배열 변수’가 있으며, 이는 ‘2차원 배열 객체’의 참조를 저장합니다. 가운데에는 ‘2차원 배열 객체’가 있고, 그 칸들에는 1차원 배열들 — 즉 2차원 배열의 각 행 — 에 대한 참조가 저장됩니다. 그리고 오른쪽에는 네 개의 1차원 배열, 곧 우리 2차원 배열의 행들이 보입니다.

이것이 2차원 배열의 실제 구조입니다. 이러한 설계는 Java 프로그래머에게 몇 가지 장점을 제공합니다:

첫째, ‘컨테이너의 컨테이너’가 ‘행 배열’에 대한 참조를 담고 있으므로 행을 매우 빠르고 간단히 바꿀 수 있습니다. ‘컨테이너의 컨테이너’에 접근하려면 두 인덱스 대신 하나만 지정하면 됩니다. 예:

int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];

다음과 같은 코드로 행을 서로 교체할 수 있습니다:

// 중요한 데이터가 있는 행렬
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;

2차원 배열의 요소에 접근하되 배열 이름 뒤에 인덱스를 하나만 지정하면, 일반 1차원 배열에 대한 참조들이 들어 있는 컨테이너의 컨테이너에 접근하게 됩니다.

6. 2차원 배열 출력

2차원 표를 출력할 때는 보통 이중 루프를 사용합니다 — 콘솔에 미로를 그리는 것과 비슷하죠. 예:

for (int row = 0; row < matrix.length; row++) 
{
    for (int col = 0; col < matrix[row].length; col++) 
    {
        System.out.print(matrix[row][col] + "\t"); 
    }
    System.out.println(); // 줄바꿈
}

출력 예:

1	2	3	4	
5	6	7	8	
9	10	11	12	

그런데, 이제 몇 줄의 코드만으로 표를 보기 좋게 “그리는” 방법을 배웠네요!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION