포스트

[C#] 다차원 배열

[C#] 다차원 배열

C#의 다차원 배열(Multidimensional Arrays)

C#에서는 [,], [,,]와 같이 쉼표를 사용하여 고정된 형태의 다차원 배열을 선언할 수 있습니다. 또한 [][] 또는 [][][] 형태로 배열의 배열(Jagged Array) 도 선언할 수 있으며, 두 방식은 메모리 구조, 성능, 유연성 면에서 중요한 차이를 가집니다.


1. 다차원 배열이란?

다차원 배열은 여러 차원의 데이터를 테이블 형태로 저장할 수 있는 구조입니다.

예시 선언

1
2
int[,] matrix2D = new int[3, 4];       // 2차원 배열 (3행 4열)
int[,,] cube3D = new int[2, 3, 4];     // 3차원 배열 (2×3×4)
  • [i, j], [i, j, k] 형식으로 접근
  • 배열의 모든 차원이 고정된 크기를 가짐

2. 배열의 배열 (Jagged Array)와의 차이

구분다차원 배열 ([,], [,,])Jagged 배열 ([][], [][][])
구조정방형, 고정된 형태각 차원이 독립된 배열
접근 방식array[i, j], array[i, j, k]array[i][j], array[i][j][k]
메모리 구조연속된 메모리 블록분산된 개별 배열
성능캐시 친화적 (일관된 메모리 접근)유연하지만 캐시 효율 낮음
유연성고정 크기각 행/면의 크기가 다를 수 있음
사용 예격자맵, 고정 데이터, 행렬 연산가변 행/열, JSON-like 구조
  • Jagged Array는 중첩 배열, 가변 배열 이라고 부른다.

3. 예제 비교

다차원 배열 (2차원)

1
2
int[,] matrix = new int[2, 3];
matrix[0, 1] = 5;

Jagged 배열 (2차원)

1
2
3
4
int[][] jagged = new int[2][];
jagged[0] = new int[3];
jagged[1] = new int[2];
jagged[0][1] = 5;

4. 메모리 구조 차이

다차원 배열 ([,], [,,])

  • 하나의 연속된 메모리 블록에 데이터가 배치됨
  • CPU 캐시 활용도가 높음 → 성능 우수

Jagged 배열 ([][], [][][])

  • 참조 타입 배열로 이루어져 있음
  • 각각의 하위 배열이 메모리 여기저기에 존재할 수 있음
  • 캐시 미스가 자주 발생 → 성능 저하 가능

5. 성능 차이 예시

1
2
3
4
5
6
7
8
9
10
11
12
int[,] matrix = new int[1000, 1000];
for (int i = 0; i < 1000; i++)
    for (int j = 0; j < 1000; j++)
        matrix[i, j]++; // 연속 메모리 접근 → 빠름

int[][] jagged = new int[1000][];
for (int i = 0; i < 1000; i++)
    jagged[i] = new int[1000];

for (int i = 0; i < 1000; i++)
    for (int j = 0; j < 1000; j++)
        jagged[i][j]++; // 분산 접근 → 느릴 수 있음

6. 언제 어떤 배열을 쓸까?

사용 상황추천 배열
고정된 크기의 2D/3D 격자[,], [,,]
동적 크기의 데이터 (ex. JSON)[][], [][][]
성능 민감한 계산 (수치 해석, 시뮬레이션 등)[,], [,,]
구조가 유연해야 하는 UI 데이터Jagged 배열

7. 요약

항목다차원 배열 ([,], [,,])Jagged 배열 ([][])
구조고정 크기유동적
성능빠름 (캐시 효율 높음)느릴 수 있음
메모리연속분산
선언int[,] a = new int[3, 3]int[][] a = new int[3][]
접근a[1, 2]a[1][2]

다차원 배열은 성능과 메모리 연속성 측면에서 우수하며,
Jagged 배열은 유연한 데이터 구조에 적합합니다.


6. C++과의 비교 (간략)

  • C++에서 int arr[3][4]연속된 메모리 구조
  • C#의 int[][]항상 분산된 힙 구조이며 C++의 int arr[3][4]와 다름
  • C#에서 정적으로 선언한 Jagged 배열이라도 절대 연속 메모리가 아님

C#은 C++과 달리 배열은 항상 참조 타입(reference type) 입니다. 즉, 배열을 선언하는 순간 객체가 힙에 생성되며, 이로 인해 [][]는 항상 분산된 메모리 구조를 가집니다. 정적으로 선언하더라도 이 구조는 바뀌지 않습니다.


참고 : 마이크로 소프트 문서

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.