Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어 다차원 배열 완벽 정리: 개념, 메모리 배치 방식부터 예제 코드까지


다차원 배열이란?

배열(array)은 기본적으로 동일한 자료형(homogeneous) 데이터들의 집합으로, 메모리상에 연속된 공간에 순서대로 저장됩니다. 하지만 모든 배열이 반드시 1차원일 필요는 없습니다. 실제 프로그래밍에서는 데이터를 더 직관적으로 표현하기 위해 2차원 또는 그 이상의 다차원 배열(multidimensional array) 형태가 필요한 경우가 많습니다.

예를 들어 행렬, 이미지 픽셀 데이터, 게임 보드 등은 2차원 배열로 표현하면 훨씬 자연스럽게 다룰 수 있습니다.

행 우선(Row-Major)과 열 우선(Column-Major) 방식

메모리는 선형 구조이기 때문에, 다차원 배열 역시 결국 1차원적인 메모리 주소에 매핑되어 저장됩니다. 이때 다차원 배열을 배치하는 방법은 크게 두 가지가 있습니다.

  • 행 우선(Row-Major) 방식: 같은 행(row)의 요소들을 먼저 나열
  • 열 우선(Column-Major) 방식: 같은 열(column)의 요소들을 먼저 나열

r개의 행과 c개의 열을 가진 2차원 배열을 생각해 봅시다. 이 배열의 전체 요소 개수는 n = r × c입니다. 배열의 임의의 위치 A[i, j](단, 0 ≤ i < r, 0 ≤ j < c)에 있는 요소는 [0, n-1] 범위의 정수 인덱스로 매핑됩니다.

행 우선 방식에서는 0번째 행의 요소들이 왼쪽에서 오른쪽 순서로 먼저 저장되고, 그다음 1번째 행, 2번째 행 순으로 이어집니다. 이 경우 매핑 함수(주소 계산 공식)는 다음과 같습니다.

인덱스 = i × c + j

반면 열 우선 방식에서는 각 열의 요소들을 위에서 아래로 먼저 저장하며, 이때의 매핑 함수는 다음과 같습니다.

인덱스 = i + j × r

C 언어는 기본적으로 행 우선(Row-Major) 방식을 사용한다는 점을 기억해 두면 좋습니다.

예제 코드

다음은 5행 2열짜리 2차원 배열을 선언하고, 중첩 for 문을 이용해 모든 요소의 값을 출력하는 C 프로그램입니다.

#include <stdio.h>

int main() {
    /* 5행 2열짜리 2차원 배열 */
    int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6}, {4,8} };
    int i, j;

    /* 배열의 각 요소 값 출력 */
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 2; j++) {
            printf("a[%d][%d] = %d\n", i, j, a[i][j]);
        }
    }

    return 0;
}

실행 결과

a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8

정리

다차원 배열은 동일한 자료형의 데이터를 논리적인 구조로 묶어 관리할 수 있게 해주는 강력한 도구입니다. 내부적으로는 연속된 메모리에 저장되며, 행 우선 또는 열 우선 방식에 따라 인덱스가 계산됩니다. 특히 C 언어에서는 i × c + j라는 행 우선 공식으로 실제 메모리 위치가 결정된다는 점을 이해하면, 포인터 연산이나 배열 성능 최적화에도 큰 도움이 됩니다.