다차원 배열
배열은 동일한 자료형의 값 여러 개를 저장하는 연속된 메모리 공간입니다.
이렇게 연속된 메모리 공간이 하나 있는 배열을 1차원 배열이라고 합니다.
다차원 배열(mulit-dimensional array)은 1차원 배열에 배열을 하나 이상 추가한 2차원, 또는 그 이상의 배열을 의미합니다.
예를 들어 동일한 크기의 1차원 배열이 2개 이상 연속되면 이를 2차원 배열이라 합니다.
2차원 배열은 기존 1차원 배열에서 배열의 크기를 하나 더 적어줍니다.
그렇게 되면 배열명 옆에 총 2개의 배열 크기가 있고, 이를 왼쪽부터 "행", "열"로 볼 수 있습니다.
int arr[행][열] // 행 = 3, 열 = 4
[이미지 출처 : https://velog.io/@yjy9500/%ED%8C%8C%EC%9D%B4%EC%8D%AC-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4]
총 3 X 4 = 12 개의 행렬 지표가 만들어지는 걸 알아볼 수 있습니다.
여기서 더 나아가, 같은 원리로 2차원 배열이 2개 이상 연속되면 3차원 배열이 됩니다.
3차원 배열은 위에 이미지인 행렬 지표가 3개가 겹겹이 쌓이는 개념입니다.
[이미지 출처 : https://velog.io/@whddn0221/%EB%B0%B1%EC%A4%80-7569-%ED%86%A0%EB%A7%88%ED%86%A0-BFS-3%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4]
그럼 총 3(행) X 4(열) X 3(면) = 36으로 확인 가능합니다.
다차원 배열
다차원 배열 다루기(초기화)
다차원 배열을 초기화하려면, 차원의 개수만큼 중괄호로 씌어주면 됩니다.
예로 들어,
1차원 배열의 경우 {1, 2, 3};
2차원 배열의 경우 {
{1, 2, 3},
{4, 5, 6}
};
3차원 배열의 경우 {
{
{1, 2, 3},
{4, 5, 6}
},
{
{7, 8, 9},
{10, 11, 12}
},
{
{13, 14, 15},
{16, 17, 18}
}
}
차원의 개수만큼 중괄호의 개수를 맞춰주면 되지만 가독성을 위해 줄 바꿈을 해줬습니다.
다차원 배열도 1차원 배열처럼 크기를 명시하지 않고 초기화를 할 수 있습니다.
int arr[][2] = {1, 2, 3, 4};
코드에 명시된 '열'방향의 크기와 요소의 개수에 따라 첫 번째 대괄호('행')에 해당하는 크기가 자동으로 정해집니다. 위 코드의 경우 요소가 4개이므로 2 X 2 크기의 2차원 배열을 만들게 됩니다.
다차원 배열
다차원 배열 다루기(요소 접근)
1차원 배열에서는 인덱스 0부터 접근하였습니다.
2차원 배열에서도 동일하게 0부터 시작하는 인덱스로 접근하면 됩니다.
int arr[2][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10}
};
위 예시 코드를 기준으로 1~5는 0번째 행, 6~10은 1번째 행입니다.
또한, (1, 6)은 0번째 열, (2, 7)은 1번째 열, (3, 8)은 2번째 열, (4, 9)는 3번째 열, (5, 10)은 마지막 4번째 열입니다.
따라서 원하는 숫자(요소)에 접근하려면 각 위치에 있는 ['행']['열'] 인덱스를 넣어주면 됩니다.
2 : arr[0][1]
5 : arr[0][4]
6 : arr[1][0]
9 : arr[1][3]
10 : arr[1][4]
3차원 배열도 같은 방식으로 요소에 접근합니다.
위와 같이 원하는 요소로 접근하기 위해 직접 작성할 수도 있고, 때에 따라서 반복문(for문)을 통해서 접근할 수도 있습니다.
1차원 배열의 경우에는 반복문 한 번으로도 모든 요소에 접근이 가능하나, 2차원 이상일수록 차원수에 따라 반복문도 중첩해서 사용해야 접근이 용이합니다.
아래 예시 코드로 알아보겠습니다.
#include <stdio.h>
int main(void) {
// 3차원 배열 선언
int arr[3][3][3] = {
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
},
{
{11, 12, 13},
{14, 15, 16},
{17, 18, 19}
},
{
{21, 22, 23},
{24, 25, 26},
{27, 28, 29}
}
};
//반복문(for문)을 통해 각 요소의 접근
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
printf("3차원 배열 [%d][%d][%d]의 값 : %d\n", i, j, k, arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
output
3차원 배열 [0][0][0]의 값 : 1
3차원 배열 [0][0][1]의 값 : 2
3차원 배열 [0][0][2]의 값 : 3
3차원 배열 [0][1][0]의 값 : 4
3차원 배열 [0][1][1]의 값 : 5
3차원 배열 [0][1][2]의 값 : 6
3차원 배열 [0][2][0]의 값 : 7
3차원 배열 [0][2][1]의 값 : 8
3차원 배열 [0][2][2]의 값 : 9
3차원 배열 [1][0][0]의 값 : 11
3차원 배열 [1][0][1]의 값 : 12
3차원 배열 [1][0][2]의 값 : 13
3차원 배열 [1][1][0]의 값 : 14
3차원 배열 [1][1][1]의 값 : 15
3차원 배열 [1][1][2]의 값 : 16
3차원 배열 [1][2][0]의 값 : 17
3차원 배열 [1][2][1]의 값 : 18
3차원 배열 [1][2][2]의 값 : 19
3차원 배열 [2][0][0]의 값 : 21
3차원 배열 [2][0][1]의 값 : 22
3차원 배열 [2][0][2]의 값 : 23
3차원 배열 [2][1][0]의 값 : 24
3차원 배열 [2][1][1]의 값 : 25
3차원 배열 [2][1][2]의 값 : 26
3차원 배열 [2][2][0]의 값 : 27
3차원 배열 [2][2][1]의 값 : 28
3차원 배열 [2][2][2]의 값 : 29
지금까지 살펴봤듯이 다차원 배열은 1차원 배열에서 차원이 하나씩 늘어나는 개념입니다.
즉, 더 많은 값을 저장하기 위해서는 좀 더 넓은 공간을 사용합니다.