C#에서 2차원 배열을 다루는 방법은 두 가지입니다.
int[,]: 다차원 배열 (Rectangular Array)int[][]: 가변 배열 (Jagged Array)
겉보기에는 비슷하지만 내부 구조와 사용 방식은 다릅니다.
1. 다차원 배열 (Rectangular Array) - int[,]
다차원 배열은 모든 행의 열 수가 같은 고정 크기 배열입니다. 메모리 상에서 연속적으로 저장되며 2차원 이상의 배열도 지원합니다.
int[,] matrix = new int[3, 4]; // 3행 4열
matrix[0, 0] = 1;
matrix[0, 1] = 2;
// ...
배열은 이중 루프로 순회합니다.
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
특히 큰 데이터에서 반복 접근이 많을 경우, int[,]는 메모리 지역성 (locality) 덕분에 CPU 캐시를 더 효율적으로 활용할 수 있어 성능면에서 유리합니다.
참고:
int[,]는Length가 전체 요소 개수를 반환하고 각 차원의 길이는GetLength(dimension)으로 가져와야 합니다.
행렬 계산에 적합한 형태이며 모든 행의 열 개수가 같을 때 쓰기 좋습니다.
2. 가변 배열 (Jagged Array) - int[][]
가변 배열은 배열의 배열로, 각 행의 열 수가 다를 수 있습니다. 각 행은 별도의 배열로 존재하며 메모리 상에서 연속적으로 저장되지 않습니다.
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2]; // 첫 번째 행은 2열
jaggedArray[1] = new int[3]; // 두 번째 행은 3열
jaggedArray[2] = new int[1]; // 세 번째 행은 1열
배열은 이중 루프로 순회합니다.
for (int i = 0; i < jaggedArray.Length; i++)
{
for (int j = 0; j < jaggedArray[i].Length; j++)
{
Console.Write(jaggedArray[i][j] + " ");
}
Console.WriteLine();
}
가변 배열은 유연성이 뛰어나지만 메모리 비연속 구조로 인해 캐시 효율이 떨어지고 성능도 다소 불리합니다.
참고:
int[][]는 일반 배열이므로Length와arr[i].Length를 사용합니다.
그래프(Adjacency List), 트리, 가변 데이터 구조에 사용하기 좋습니다.
결론
- 단순 2D →
int[,] - 유동 구조 →
int[][] - 그래프 →
int[][]또는List[]