1. 소개
일반 배열을 피자 박스처럼 길게 생각해봐. 모든 조각이 한 줄로 쭉 놓여 있지 — 맛있긴 한데 좀 단조롭지.
이제 작업 스케줄이나 체스판을 상상해봐. 거긴 이미 모든 게 행과 열로 정리되어 있어 — 즉 테이블이지. 이게 바로 2차원 배열이 필요한 고전적인 상황이야.
실생활에서 2차원 배열은 진짜 자주 나와:
- 직원 급여표 (행 — 직원, 열 — 월).
- 화면의 그림 (각 "칸" — 픽셀 색상, 두 개의 좌표: X와 Y).
- 행렬 계산과 데이터 처리.
- 체스판이나 틱택토 게임판.
가끔 2차원 배열을 행렬이라고도 해 (이건 수학에서 온 말이야).
프로그래머로서 2차원 배열이 필요한 곳은 진짜 많아. 거의 모든 보드게임을 구현할 때 2차원 배열이 바로 필요하지: "체스", "체커", "틱택토", "배틀쉽":
"체스"나 "배틀쉽"의 게임판은 2차원 배열에 딱 맞아. 칸의 좌표로 숫자만 쓰면 되거든. "폰 e2 → e4"가 아니라 "폰 (4,1) → (4,3)" 이런 식이지. 프로그래머 입장에선 이게 훨씬 편해.
2. 2차원 배열 선언 문법
처음 선언할 때만 좀 무서울 뿐이야! 하나씩 같이 보자.
일반 규칙
타입[,] 배열이름;
여기서 괄호 안의 쉼표 ,는 컴파일러가 커피 마시고 실수한 게 아니라, 배열이 2차원이라는 표시야.
예시
int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;
배열 만들기
크기를 정해줘: 행과 열의 개수.
matrix = new int[3, 4]; // 3행, 4열
이건 3x4 표야: 엑셀에서 3행 4열짜리 표를 생각해봐.
변수 선언과 동시에 2차원 배열을 만들 수도 있어:
int[,] matrix = new int[3, 4];
값을 바로 넣어서 초기화할 수도 있어 (1차원 배열이랑 비슷하게):
int[,] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 3행 3열 표
중요: 이렇게 초기화할 땐 모든 행의 길이가 같아야 해. 첫 번째 행에 3개, 두 번째 행에 2개 이런 건 안 돼.
시각적 도식
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← 열 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← 행 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← 행 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← 행 2 (Row 2)
└─────┴─────┴─────┴─────┘
각 요소는 [행, 열] 인덱스 쌍으로 지정해.
3. 인덱싱과 요소 접근
2차원 배열에서 요소에 접근하려면 인덱스 두 개를 써야 해:
- 첫 번째 — 행 번호
- 두 번째 — 열 번호
matrix[1, 2] = 99; // 두 번째 행(인덱스 1), 세 번째 열(인덱스 2)
체스에 익숙하다면, 인덱스는 0부터 시작한다는 걸 기억해. 즉, 첫 번째 요소는 [0, 0]이야.
쓰기와 읽기
int[,] data = new int[5, 2];
data[1, 1] = 5; // 쓰기
int value = data[1, 1]; // 읽기
이게 메모리에서 어떻게 보일지:
4. 2차원 배열 채우기
1부터 12까지 순서대로 숫자를 넣어서 행렬을 채우는 코드를 써보자. 어떻게 동작하는지 바로 알 수 있을 거야.
int[,] matrix = new int[3, 4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row, col] = value;
value++;
}
}
여기서 바깥 for문은 행을, 안쪽 for문은 열을 돈다.
그림으로 보면:
실행 후:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. 크기: 행과 열 개수 구하기
배열 크기를 "실행 중"에 알아야 할 때가 많아. C#에서는 GetLength() 메서드가 있어서 편해.
int[,] matrix = new int[3, 4];
int rows = matrix.GetLength(0); // 행 개수 (첫 번째 차원) - 3
int columns = matrix.GetLength(1); // 열 개수 (두 번째 차원) - 4
Console.WriteLine($"행: {rows}, 열: {columns}");
Length랑 헷갈리지 마 — 2차원 배열에서 이건 전체 요소 개수야 (행 × 열).
6. 2차원 배열 출력하기
2차원 표를 출력할 땐 보통 이중 for문을 써 — 콘솔에 미로 그리는 느낌이지. 예시:
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
Console.Write(matrix[row, col] + "\t"); // "\t" — 보기 좋게 탭
}
Console.WriteLine(); // 줄 바꿈
}
출력 예시:
1 2 3 4
5 6 7 8
9 10 11 12
이렇게 하면 코드 몇 줄로 표를 예쁘게 "그릴" 수 있다는 거, 이제 알았지!
7. 다차원 배열
그리고 배열에 대해 하나 더 재밌는 사실! 2차원 배열이 된다면, 3차원 배열도 만들 수 있지 않을까?
맞아, 원하는 차수만큼 배열을 만들 수 있어. 이런 배열을 다차원 배열이라고 해.
다차원 배열 선언 방법
필요한 차원 수만큼 쉼표로 구분해서 써주면 돼:
int[,,,] matrix = new int[2, 3, 4, 5];
여기선 4차원 배열이야:
- 첫 번째 좌표에 2개,
- 두 번째에 3개,
- 세 번째에 4개,
- 네 번째에 5개.
메모리에서는 이런 배열이 하나의 큰 "큐브" 데이터로 연속적으로 저장돼.
요소에 접근하는 방법
모든 인덱스를 한 번에 써서 접근해:
matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
- 인덱스는 항상 C#에서처럼 0부터 시작해.
- 이런 배열엔 2 × 3 × 4 × 5 = 120개의 요소가 있어.
다차원 배열 실전 예시
- 2D — 표, 체스판, 이미지.
- 3D — 컴퓨터 그래픽의 "큐브", 과학 계산 데이터(예: 공간과 시간의 온도).
- 4D 이상 — 잘 쓰진 않지만, 고급 수학, 시뮬레이션, 머신러닝 등에서 나와.
GO TO FULL VERSION