[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 라이센스를 따릅니다.