..

Search

24) 다차원 배열

24) 다차원 배열

다차원 배열


다차원 배열(multi-dimensional array)

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열 요소로 또 다른 배열을 가지는 배열을 의미합니다.

 

즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며,

3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고,

4차원 배열은 배열 요소로 3차원 배열을 가지는 배열인 것입니다.


2차원 배열(two dimensional array)

2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열입니다.

C++에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않습니다.

대신에 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있습니다.

 

2차원 배열은 다음과 같은 문법에 따라 선언할 수 있습니다.

문법

타입 배열이름[행의길이][열의길이];

 

타입은 배열 요소로 저장되는 변수의 타입을 설정합니다.

배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용됩니다.

 

다음 그림은 2차원 배열을 이해하기 쉽도록 도식적으로 표현한 그림입니다.

2차원 배열

 

하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아닌 선형 공간이므로 실제로는 다음 그림과 같이 저장됩니다.

 

 

다음 예제는 앞선 그림을 C++ 프로그램으로 작성한 예제입니다.

예제

 

int arr1[6] = {10, 20, 30, 40, 50, 60};

int arr2[2][3] = {10, 20, 30, 40, 50, 60};

 

코딩연습 ▶

실행 결과

arr1의 배열 요소의 값

10 20 30 40 50 60

arr2의 배열 요소의 값

10 20 30 40 50 60


배열의 선언과 동시에 초기화하는 방법

1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화할 수 있습니다.

2차원 배열은 1차원 배열과는 달리 다음과 같이 여러 방식으로 초기화할 수 있습니다.

 

1. 1차원 배열의 초기화 형태를 따르는 방식

2. 배열의 모든 요소를 초기화하는 방식

3. 배열의 일부 요소만을 초기화하는 방식


1차원 배열의 초기화 형태를 따르는 방식

C++에서는 2차원 배열을 1차원 배열의 초기화 형태로도 초기화할 수 있습니다.

문법

타입 배열이름[행의길이][열의길이] = {배열요소[0][0], 배열요소[0][1], ..., 배열요소[1][0], 배열요소[1][1], ..., 배열요소[2][0], 배열요소[2][1], ...};

 

이 방식으로는 2차원 배열의 배열 요소[0][0]부터 차례대로 초기화됩니다.

만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, 나머지 배열 요소는 모두 0으로 초기화됩니다.


배열의 모든 요소를 초기화하는 방식

C++에서는 2차원 배열의 모든 요소를 좀 더 직관적으로 초기화할 수도 있습니다.

문법

타입 배열이름[행의길이][열의길이] =

{

    {배열요소[0][0], 배열요소[0][1], ...},

    {배열요소[1][0], 배열요소[1][1], ...},

    {배열요소[2][0], 배열요소[2][1], ...},

    ...

};

 

이 방식은 앞서 살펴본 1차원 배열의 초기화 형태를 따르는 방식과 결과는 같습니다.

하지만 좀 더 직관적으로 2차원 배열의 모습을 알 수 있으므로, 보통 이 방식을 많이 사용합니다.

예제

int arr1[2][3] = {10, 20, 30, 40};

int arr2[2][3] = {

    {10, 20, 30},

    {40, 50, 60}

};

코딩연습 ▶

실행 결과

arr1의 배열 요소의 값

10 20 30 40 0 0

arr2의 배열 요소의 값

10 20 30 40 50 60


배열의 일부 요소만을 초기화하는 방식

C++에서는 2차원 배열의 일부 요소만을 초기화할 수도 있습니다.

 

이 방식으로는 다음 예제처럼 2차원 배열의 원하는 배열 요소만을 초기화할 수 있습니다.

이때 초기화하지 않은 배열 요소는 모두 0으로 자동 초기화됩니다.

예제

int arr_col_len, arr_row_len;

int arr[3][4] = {

    {10, 20},

    {30, 40, 50, 60},

    {0, 0, 70, 80}

};

 

arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]);              // 2차원 배열의 열의 길이를 계산함

arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 2차원 배열의 행의 길이를 계산함

 

cout << "arr의 배열 요소의 값" << endl;

for (int i = 0; i < arr_row_len; i++)

{

    for (int j = 0; j < arr_col_len; j++)

    {

        cout << setw(4) << arr[i][j];

    }

    cout << endl;

}

코딩연습 ▶

실행 결과

arr의 배열 요소의 값

  10  20   0   0

  30  40  50  60

   0   0  70  80

 

위의 예제에서 2차원 배열 열의 길이를 구할 때 사용하는 수식은 다음과 같습니다.

수식

arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]);

 

열의 길이는 sizeof(arr[0])으로 2차원 배열 한 행의 길이를 먼저 구한 후에, 그 값을 배열 타입의 크기로 나누어서 구합니다.

열의 길이를 이용하면 2차원 배열 행의 길이도 구할 수 있습니다.

수식

arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]);

 

행의 길이는 (sizeof(arr) / arr_col_len)으로 2차원 배열 한 열의 길이를 먼저 구한 후에, 그 값을 배열 타입의 크기로 나누어서 구할 수 있습니다.


배열의 길이 자동 설정

1차원 배열과 마찬가지로 2차원 배열도 배열의 길이를 명시하지 않고, 자동으로 배열의 길이를 설정할 수 있습니다.

단, 행의 길이는 생략할 수 있지만, 열의 길이는 반드시 명시해야 합니다.

 

다음 예제는 앞선 예제에서 행의 길이를 생략한 예제로, 같은 결과를 출력합니다.

이 예제에서 행의 길이를 명시하고, 열의 길이를 생략하면 컴파일할 때 오류가 발생하는 것을 확인할 수 있습니다.

예제

int arr_col_len, arr_row_len;

//int arr[3][] = {

int arr[][4] = {

    {10, 20},

    {30, 40, 50, 60},

    {0, 0, 70, 80}

};

 

arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]);                 // 2차원 배열의 열의 길이를 계산함

arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 2차원 배열의 행의 길이를 계산함

 

cout << "arr의 배열 요소의 값" << endl;

for (int i = 0; i < arr_row_len; i++)

{

    for (int j = 0; j < arr_col_len; j++)

    {

        cout << setw(4) << arr[i][j];

    }

    cout << endl;

}

코딩연습 ▶

실행 결과

arr의 배열 요소의 값

  10  20   0   0

  30  40  50  60

   0   0  70  80


연습문제