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차원 배열을 사용한다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/65-multidimensional-arrays/ 입니다.