C#에서 2차원 배열: int[,] vs int[][]

2차원 배열의 차이점과 사용법

By 전경원

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[][]는 일반 배열이므로 Lengtharr[i].Length를 사용합니다.

그래프(Adjacency List), 트리, 가변 데이터 구조에 사용하기 좋습니다.

결론

  • 단순 2D → int[,]
  • 유동 구조 → int[][]
  • 그래프 → int[][] 또는 List[]
Share: LinkedIn