제 21강) 다차원배열1 - 다차원배열의 기본 |
오늘은 다차원배열의 첫 시간으로 다차원배열의 기본에 대해서 알아봅니다.
다차원배열은 2차원 이상의 배열을 다차원이라고 합니다.
1) 다차원 배열이란 |
일반적인 배열은
이렇게 1차원적인 배열을 뜻합니다.
(가로로만, 혹은 세로로만, x로만)
여기서 더 나아가서 다차원배열은
1차원을 넘어서는 배열을 뜻합니다.
(가로와 세로, x와 y)
위의 배열은 대표적인 2차원배열입니다.
세로로3, 가로로7인 배열이죠.
2) 2차원배열 |
가장 많이 쓰이는 배열은 1차원배열입니다.
그리고 그 다음으로 쓰이는 배열은 2차원배열입니다.
즉, int arr[3][2]로 선언된 2차원배열은 [0][0], [0][1], [1][0], [1][1], [2][0], [2][1] 총 3x2 2차원배열이 생성됩니다.
(배열의 번호는 0부터)
자료형 배열이름[세로길이][가로길이];
// 혹은
자료형 배열이름[세로길이][가로길이] = { 초기화값 };
// 예)
int arr3x3[3][3];
int arr3x2[3][2] = { 1, 2, 3, 4, 5, 6 };
int arr4x2[4][2] = { { 1, 2 } , { 3, 4 }, { 5, 6 }, { 7, 8 } };
배열은 위와 같이 선언 및 사용합니다.
여기서 7번줄과 8번줄을 보면 초기화하는 방법이 다른것처럼 보이지만
int arr3x2[3][2] = { 1, 2, 3, 4, 5, 6 };
↓↓↓↓
int arr3x2[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
7번줄의 선언은 사실상 8번줄의 선언과 같은 구분하여 초기화하는 것과 같은 뜻입니다.
(하지만 아래에서 반례를 보여드리겠습니다.)
int arr[3] = { 1 };
→ arr[0] = 1, arr[1] = 0, arr[2] = 0
우리가 1차원배열을 선언했을 때 선언된 공간보다 적게 초기화를 하면 나머지 공간의 값들은 0으로 초기화 됩니다.
2차원배열의 경우에도 같습니다.
int arr[3][2] = { 1, 2, 3 };
→ arr[0][0] = 1, arr[0][1] = 2
→ arr[1][0] = 3, arr[1][1] = 0
→ arr[2][0] = 0, arr[2][1] = 0
이렇게 순차적으로 값을 넣고 나머지 빈 구역에는 0으로 초기화를 시킵니다.
그런데 다음과 같이 선언되어 있다면
int arr[3][3] = { {1}, {2}, {3} };
어떻게 될까요?
방금 전에 본 2차원배열과 같이 봅시다.
int arr[3][2] = { 1, 2, 3 };
→ arr[0][0] = 1, arr[0][1] = 2
→ arr[1][0] = 3, arr[1][1] = 0
→ arr[2][0] = 0, arr[2][1] = 0
int arr[3][2] = { {1}, {2}, {3} };
→ arr[0][0] = 1, arr[0][1] = 0
→ arr[1][0] = 2, arr[1][1] = 0
→ arr[2][0] = 3, arr[2][1] = 0
사뭇 다른 결과를 보여줍니다.
1번줄의 선언에서는 행구분 없이 값을 초기화시켰기 때문에 차례대로 [0][0] ~ [2][1]에 값을 넣지만
6번줄의 선언에서는 행구분 있이(중괄호 안의 또 다른 중괄호) 값을 초기화시켰기 때문에 첫번째 열에만 값을 넣고 나머지 열에는 값이 없기때문에 0으로 초기화 합니다.
int arr[5][2] = { {1}, {2}, {3} };
→ arr[0][0] = 1, arr[0][1] = 0
→ arr[1][0] = 2, arr[1][1] = 0
→ arr[2][0] = 3, arr[2][1] = 0
→ arr[3][0] = 0, arr[2][1] = 0
→ arr[4][0] = 0, arr[2][1] = 0
그럼 위의 배열도 이해되시겠죠?
이제 2차원배열을 출력하는 예제를 봅시다.
#include <stdio.h>
int main()
{
int a[3][3] = { 1, 2, 3 };
int b[3][3] = { {1}, {2}, {3} };
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
// a[0][0] ~ a[2][2] 까지 반복하며 출력
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("\n");
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
// b[0][0] ~ b[2][2] 까지 반복하며 출력
printf("%d ", b[i][j]);
}
printf("\n");
}
return 0;
}
2차원배열은 위와같이 for문을 2개 겹쳐서 출력합니다.
보통 바깥의 for문은 행을, 안쪽의 for문은 열을 반복하도록 합니다.
3) 3차원배열 |
3차원 배열은 2차원을 넘어서는 배열입니다.
위와 같이 2차원배열이 더 겹치는 즉, 가로 세로에 높이까지 있다고 보시면 됩니다.
(6면체라고 생각하면 됩니다. x, y, z)
int arr[2][3][3] = {
{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }, // arr[0][][] 라인
{ { 11, 22, 33 }, { 44, 55, 66 }, { 77, 88, 99 } } // arr[1][][] 라인
}
2차원배열처럼 선언하지만 거기에 차원이 하나 더 붙어서 선언하시면됩니다.
#include <stdio.h>
int main()
{
int arr[2][3][3] = {
{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
{ { 11, 22, 33 }, { 44, 55, 66 }, { 77, 88, 99 } }
};
for(int i = 0; i < 2; i++)
{
printf("arr[%d][][]\n", i);
for(int j = 0; j < 3; j++)
{
// a[0][0] ~ a[2][2] 까지 반복하며 출력
for(int k = 0; k < 3; k++)
{
printf("%d ", arr[i][j][k]);
}
printf("\n");
}
printf("\n\n");
}
return 0;
}
3차원배열을 출력하거나 사용할 때는 보통 for문을 3개를 씁니다.
3차원은 사실상 많이 안쓰입니다.
(쓴다고 한다면 게임에서 많이 쓰입니다.)
많이 써봐야 2차원에서 대부분은 해결이 가능하고 나중에 배울 "구조체"를 사용하기 때문에 1차원으로도 많이 해결됩니다.
다음 시간에는 |
오늘은 다차원배열의 기본에 대해서 알아보았습니다.
위에서 소개한 3차원 이외에도 4차원 이상의 개념도 있지만 사실상 3차원도 잘 안씁니다.
하지만 2차원까지는 잘 알아두셔야 합니다.
다음 시간에는 이 다차원 배열에 포인터를 접목시켜보겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 23 [메모리 구조와 메모리 할당, 배열 동적할당(malloc, realloc, calloc, free)] (0) | 2018.10.28 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 22 [다차원배열2 - 다차원배열과 포인터, 이중 포인터, 다중 포인터] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 17 [포인터] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 18 [배열과 포인터] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 19 [문자열] (0) | 2018.10.17 |