POST

C언어 다차원 배열 - 2차원배열

다차원 배열이란?


기본적인 1차원 배열과 2차원 배열, 3차원 배열이라는 것들을 통틀어 다차원 배열이라한다.

배열이란? - 바로가기


위의 링크를 클릭하여 배열을 살펴보면 알겟지만 1차원 배열은 논리적으로 1차원의 형태를 띤다.

그럼 2차원 배열과 3차원 배열은 마찬가지로 논리적으로 2차원과 3차원의 형태를 띄고 있다.

2차원 배열은 가로와 세로을 가지는 평면구조의 사각형의 형태를 가지지만 

3차원 배열은 가로와 세로, 높이를 가지는 직육면체의 구조를 가진다.


여기서 알아두어야 할것은 C언어에서는 문법적으로 4차원 5차원 또는 그이상을 허용을 하지만 불필요 하기도하고 논리적으로 이해하기힘들어 사용하지 않는다. 따라서 다차원 배열이라 하면 1차원, 2차원, 3차원 배열을 의미한다고 보면된다.


먼저 2차원 배열을 선언 하는 것을 살펴보자.

int arr[2][3]; 와 같이 선언을 한다.

이것의 전체적인구조는 이렇다.

1열      2열      3열

1행 [0][0] [0][1] [0][2]

2행 [1][0] [1][1] [1][2]


이런식으로 앞의 수가 행이며 뒤의수가 열이되며 2행 3열과 같다고 할수있다.

그리고 이배열의 갯수는 6개(2 x 3) 이며  이배열의 크기는 24(6개 x 4)이다.

배열의 크기를 구할 때 4를 곱하는 이유는 이 배열의 자료형이 int형이라 그 크기는 4byte이기 때문이다.

자료형 - 바로가기


일반적인 1차원 배열을 사용할때는 반복문이 한개만 필요하지만  이처럼 2차원 배열을 사용하게 될경우 이중 반복문을 사용하여야한다.

ex)

for(int i =0 ; i<2 ; i++) { // 행

for(int i=0; j<3 ; j++) { // 열

printf("%d\n",arr[i][j]);

}

}


어느정도 이해가 되었다면 

한층에 두가구씩 4층짜리 건물이 있다면.

각 세대별 인구수를 입력하여 층별 총 인구수를 구하는 프로그램을 만들어보자




#include<stdio.h>

#pragma warning(disable:4996) // scanf 보안 경고 제거용


int main(void) {

int villa[4][2];

int popu, i, j;

/*가구별 거주인원 입력*/

for (i = 0; i < 4; i++) {

for (j = 0; j < 2; j++) {

printf("%d층 %d호 인구수: ",i+1,j+1);

scanf("%d", &villa[i][j]);

}

}


/*빌라의 층별 인구수 출력*/

for (i = 0; i < 4; i++) {

popu = 0;

popu += villa[i][0];

popu += villa[i][1];

printf("%d층 인구수: %d\n", i+1, popu);

}

return 0;

}



그럼 2차원 배열의 초기화는 어떻게 할까?

그다지 어렵지는 않다.

int arr[2][3]; 이라는 배열을 선언을 한다면 초기화 할시에는 아래처럼 작성을 할 수 있다.

int arr[2][3] = { {1,2,3}, {4,5,6} };


위의 예처럼 선언과 동시에 초기화가 가능하다. 하지만 어렵게 보일수도있다.

그러면 아래의 예를 한번보자

int arr[2][3] = { 

{1,2,3}, // 1행

{4,5,6} // 2행

 };

어때요. 정말 쉽죠?


여기서 0으로 초기화하는 방법도 1차원배열과 다르지않다.

아래의 예를 보자

int arr[2][3] = { 

{0}, // 1행

{3} // 2행

 };

이것을 보면 1행에는 0이 입력이 되었다. 이것은 첫번째 값이 0이며 나머지 두번쨰 세번째 열의 값도 0이 된다.

그럼 2행은 어떤가 2행에 첫번째 값이 3이며 나머지 열의 값은 0으로 자동 초기화가 이루어진다.


또한 1차원 배열처럼 배열의 크기를 지정하지않은 int arr[]={1,2,3,4,5}; 식의 배열의 선언도 가능하다.

하지만 2차원 배열에서는 int arr[][]={1,2,3,4,5,6,7,8,9}; 처럼 사용할 수 없다.


크기가 지정되지않은 2차원 배열을 선얼 할때는 반드시 '열' 부분의 크기를 지정해 주어야 초기화가 가능하다.

생각해보라, 저 위의 것을 보고 누가 알 수 있을까? 컴퓨터도 마찬가지이다.

위의 잘못된 선언을 수정을 한다면 이렇게 할수 있다.

int arr[][3]={1,2,3,4,5,6,7,8,9}

이것의 전체적인 구조는  아래와 같다.

 1열  2열   3열

1행    1     2     3

2행    4     5     6

3행    7     8     9