반응형

c언어 배열의 선언과 사용(다차원 배열)

반응형

지난번에는 1차원 배열에 대해서 공부했습니다. 이번에는 1차원 배열에 이어서 2차원 배열 또는 2차원 배열 보다 많은 다차원 배열에 대해서 공부해보는 시간을 가져보겠습니다. 배열(Array)이란?은 1차원 배열에서 공부할때 같은 형태의 데이터를 반복해서 처리할때 쉽고 빠르게 하기 위해 메모리에 연속적으로 저장하는 공간을 만드는 것이라고 했습니다. 2차원 배열 또한 크게 다르지 않습니다. 

 

2차원 배열

1차원 배열 int array[10];

먼저 2차원 배열을 시작하기 전 1차원 배열을 공부할때 1차원 배열 int array[10]을 선언할때 만들어지는 데이터 공간을 보여주었던 그림입니다. 여기서 array의 인덱스0~9까지의 공간을 가지고 데이터를 저장한다고 생각해보면 어떤한 방식으로 데이터를 처리할 수 있게 될까?? 만약 학생 a, b, c 의 성적을 기록하는 프로그램을 만든다고 가정해봅시다!

 

void main(void){
	int a[5]; //a학생의 국어,영어,수학,사회,과학 성적
    int b[5]; //b학생의 국어,영어,수학,사회,과학 성적
    int c[5]; //c학생의 국어,영어,수학,사회,과학 성적
}

1차원 배열이라면 a학생의 국어, 영어, 수학, 사회, 과학 성적을 입력할 배열 a[5]를 선언하고 또다시 b학생의 성적을 입력할 b[5]배열을 선언해주어야 합니다 a, b, c 학생처럼 3명의 학생만 있다고 한다면 위에처럼 각각의 변수를 선언해서 사용할 수 있지만 만약 한 반의 학생의 성적을 모두 처리한다고 생각해 보면 30~40명정도의 학생을 처리하기 위해서는 30~40개의 배열변수를 선언해 주어야 합니다.. 쓸모없는 노가다가 되어지겠죠?? 

 

하지만 2차원 배열을 사용하게 되면 3명의 학생의 5개의 성적을 저장하는 배열변수를 쉽게 선언시킬 수 있습니다. 1차원 배열을 사용하는 것은 하나의 열로만 데이터를 정리하는 것이지만 2차원 배열을 사용하는 것은 배열을 엑셀처럼 사용하는 것입니다. 

 

즉 int score[3][5]로 선언한 배열은 3행 5열의 저장공간을 만들어 두는 것입니다. score[0번째학생][0번재성적]정보로 이해하실 수 있겠습니다. 엑셀 표로 본다면 행의 1,2,3 번호는 score[1,2,3][A,B,C,D]선언의 앞쪽 그리고 A,B,C,D는 뒷쪽 

 

자, 그럼 바로 a, b, c 학생 성적을 입력받아 출력하는 2차원 배열을 사용한 프로그램을 만들어 보도록 하겠습니다~!! 

 

#include <stdio.h>

int main(void) {

	char stu[3] = { 'a','b','c' };    // 학생을 구분하기 위한 배열
	int score[3][5];  // 성적을 저장할 수 있는 3행 5열의 score배열 선언 

	for (int a = 0; a < 3; a++) {
		printf("%c학생의 국, 영, 수, 사, 과 성적입력: ", stu[a]);
		scanf("%d %d %d %d %d", &score[a][0], &score[a][1], &score[a][2], &score[a][3], &score[a][4]);
	}

	printf("\n");

	for (int b = 0; b < 3; b++) {
		printf("%c 학생의 성적 : ", stu[b]);

		for (int c = 0; c < 5; c++) {
			printf("%d\t", score[b][c]);
		}

		printf("\n");
	}
}

소스코드를 보면 int score[3][5]의 배열을 선언하고 for문에서 3회 반복문을 실행시켜 score변수에 값을 scanf로 입력하는 프로그램 소스입니다. 반복문에서 score[a]에 저장된 score[a][0] ~ score[a][4] 까지의 데이터를 입력받고 입력이 끝나면 다시 반복문을 실행하는 프로그램입니다.

 

사용한 변수 stu는 score[a]번지와 stu[a]번지를 매칭시켜서 어떤 학생의 성적인지 확인하기 위해서 넣어두었습니다. score[0][0]에 있는 성적은 1행 1열의 값이지 1행이 누구인지 모르지만 1행의 이름을 저장하는 변수가 있다면 1행이 누구인지 쉽게 알 수 있게되겠죠?? 

 

2차원 배열의 초기화

int a[5][5]

 

2차원 배열의 선언은 1차원 배열의 선언에 배열을 하나 더 추가하는 형식으로 사용하는 것을 확인할 수 있었습니다. 그렇다면 초기값의 세팅은 어떻게 될까?

 

int array[5]={1,2,3,4,5}   1차원의 초기화 
int array[3][5] = {
         {1,2,3,4,5},               // array[0]행의 값 
         {5,4,3,2,1},               // array[1]행의 값
         {1,3,5,2,4}                // array[2]행의 값
} 2차원의 초기화

1차원의 배열의 초기화 방법는 {} 중괄호에 배열의 값을 초기화 해주었습니다. 2차원 배열도 1차원 배열과 똑같이 {}중괄호를 사용하고 행마다 {}중괄호를 사용해주고 행의 사이에는 콤마,를 사용해 영역을 나눠줍니다. 그외 선언에 대한 규칙은 1차원 배열과 동일합니다. 

 

다차원 배열

2차원에서는 한 반에 있는 학생을 예로 들어서 공부했습니다. 한반에 번호 1번 학생부터 번호 40번까지의 학생이 있고 해당 학생들의 성적을 저장하는 프로그램이라면? 위에 배웠던 2차원 배열을 사용해 stu[40번학생][성적]의 배열을 만들어서 사용하면 된다!라는 것을 배웠습니다. 이게 만약 1학년 전체라면?? 1학년에는 1반부터 10반까지의 반이 있다고 한다면 stu[40][5] 의 배열을 총 10개를 만들어 줘야합니다. 하지만 다행이도 c언어에는 다차원 배열을 사용할 수 있어 stu[10][40][5]의 형태로 배열을 선언할 수 있습니다. 

 

2차원 배열을 엑셀로 비교하면 엑셀의 시트 하나에서의 행과 열을 저장하는 배열이었다면 다차원 배열에서는 엑셀의 시트까지 모두 사용한다고 생각하시면 됩니다. stu[10][40][5]로 예를 들어보면 1~10반까지의 시트가 있고 각각의 시트에는 40행 5열의 표가 있는 것입니다. 

 

2차원 배열을 1차원 배열을 묶어 세트화 시켰다고 본다면 3차원에서는 1차원을 세트로 묶은 2차원을 또다시 세트로 묶어서 사용하는 형식입니다~ 

 

이제 1차원과 2차원 그리고 다차원 배열까지 모두 공부해봤습니다. 배열을 가지고 어떤 것들을 할 수 있을지 한번 생각해보고 원하는 프로그램이 있다면 지금까지 공부했던것 들을 모아서 간단한 프로그램을 만들어 보시는것을 추천드립니다! 

예) 성적입력 프로그램 -> 학생별로 성적입력을 받아서 평균점수를 구하는 프로그램 

 

반응형

댓글

Designed by JB FACTORY