다차원 배열이란?
배열(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라는 행 우선 공식으로 실제 메모리 위치가 결정된다는 점을 이해하면, 포인터 연산이나 배열 성능 최적화에도 큰 도움이 됩니다.