소년코딩

07.05 - 다차원 배열 (Multidimensional Arrays)

배열의 요소는 배열을 포함하여 모든 자료형일 수 있다. 배열을 가진 배열을 다차원 배열(multidimensional array)이라고 한다.

int array[3][5]; // a 3-element array of 5-element arrays

위 배열은 2개의 첨자를 가지고 있으므로 2차원 배열이다.

2차원 배열에서 첫 번째(왼쪽) 첨자를 행(row)으로 생각하고 두 번째(오른쪽) 첨자를 열(column)로 생각하는 것이 편리하다. 이것을 행-우선(row-major)순위라고 한다. 개념적으로, 위의 2차원 배열을 다음과 같이 배열된다.

[0][0]  [0][1]  [0][2]  [0][3]  [0][4] // row 0
[1][0]  [1][1]  [1][2]  [1][3]  [1][4] // row 1
[2][0]  [2][1]  [2][2]  [2][3]  [2][4] // row 2

2차원 배열의 요소에 접근하려면 두 개의 첨자를 사용하면 된다.

array[2][3] = 7;

2차원 배열 초기화 (Initializing two-dimensional arrays)

2차원 배열을 초기화하려면 각 숫자 집합이 행을 나타내는 중첩된 중괄호를 사용하게 가장 쉽다.

int array[3][5] =
{
    { 1, 2, 3, 4, 5 },     // row 0
    { 6, 7, 8, 9, 10 },    // row 1
    { 11, 12, 13, 14, 15 } // row 2
};

일부 컴파일러에서는 내부 중괄호를 생략할 수 있지만, 가독성을 위해 생략하지 않는 게 좋다. C++에서는 초기화 목록보다 적은 초기화 값이 있으면 나머지 요소는 0으로 초기화된다.

int array[3][5] =
{
    { 1, 2 },          // row 0 = 1, 2, 0, 0, 0
    { 6, 7, 8 },       // row 1 = 6, 7, 8, 0, 0
    { 11, 12, 13, 14 } // row 2 = 11, 12, 13, 14, 0
};

초기화 목록이 있는 2차원 배열은 왼쪽 첨자를 생략할 수 있다.

int array[][5] =
{
    { 1, 2, 3, 4, 5 },
    { 6, 7, 8, 9, 10 },
    { 11, 12, 13, 14, 15 }
};

컴파일은 배열 길이가 몇인지 계산할 수 있다.

그러나 다음은 허용되지 않는다:
int array[][] = 
{
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 }
};

일반 배열처럼, 다차원 배열은 다음과 같이 0으로 초기화 할 수 있다.

int array[3][5] = { 0 };

이것은 배열의 길이를 명시적으로 선언하는 경우에만 작동한다. 그렇지 않으면 1행이 있는 2차원 배열이 된다.


Accessing elements in a two-dimensional array

2 차원 배열의 모든 요소에 접근하려면 두 개의 루프가 필요하다. 하나는 행에, 다른 하나는 열에 대한 루프다. 일반적으로 2차원 배열은 행 단위로 접근되므로 행 인덱스는 대개 외부 루프로 사용된다.

for (int row = 0; row < numRows; ++row)     // 배열의 행들을 단계별로 살펴 본다.
    for (int col = 0; col < numCols; ++col) // 행의 각 요소를 단계별로 처리한다.
        std::cout << array[row][col];

C++ 11에서는 for-each 루프를 다차원 배열과 함께 사용할 수 있다. 나중에 for-each 루프에 대해 자세히 다룰 것이다.


2차원보다 큰 다차원 배열 (Multidimensional arrays larger than two dimensions)

다차원 배열은 2차원보다 클 수 있다. 다음은 3차원 배열의 선언이다.

int array[5][4][3];

3차원 배열은 초기화 목록을 사용하여 초기화하기에 복잡하므로 일반적으로 배열을 0으로 초기화하고 중첩 루프를 사용해서 값을 명시적으로 할당하는 것이 좋다.

3차원 배열의 요소에 접근하는 것은 2차원 배열과 유사하다.

std::cout << array[3][1][2];

2차원 배열 예제 (A two-dimensional array example)

2차원 배열의 실용적인 예를 살펴보자.

#include <iostream>

int main()
{
    // Declare a 10x10 array
    const int numRows = 10;
    const int numCols = 10;
    int product[numRows][numCols] = { 0 };

    // Calculate a multiplication table
    for (int row = 0; row < numRows; ++row)
        for (int col = 0; col < numCols; ++col)
            product[row][col] = row * col;

    // Print the table
    for (int row = 1; row < numRows; ++row)
    {
        for (int col = 1; col < numCols; ++col)
            std::cout << product[row][col] << "\t";

        std::cout << '\n';
    }

    return 0;
}

위 프로그램은 구구단을 계산하고 출력한다. 출력할 때 0행과 0열을 생략한다.

1    2    3    4    5    6    7    8    9
2    4    6    8    10   12   14   16   18
3    6    9    12   15   18   21   24   27
4    8    12   16   20   24   28   32   36
5    10   15   20   25   30   35   40   45
6    12   18   24   30   36   42   48   54
7    14   21   28   35   42   49   56   63
8    16   24   32   40   48   56   64   72
9    18   27   36   45   54   63   72   81

게임 같은 경우, 2차원 배열은 일반적으로 타일 기반 게임에서 사용되며, 각 배열 요소는 하나의 타일을 나타낸다. 도형을 회전, 크기 조절, 이동하기 위해 3차원 컴퓨터 그래픽(행렬)을 위해 3차원 배열을 사용한다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/65-multidimensional-arrays/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기