C언어 배열의 선언과 초기화 및 반복문 연계

C언어 배열은 종류가 같은 자료형의 변수를 대량 만들 때 사용하는 자료 구조입니다. 배열은  자료형, 배열명, 배열 개수, 배열 값 순서로 선언합니다. 배열명은 상수이므로 값을 직접 대입할 수 없습니다.

C언어 배열

C언어 배열은 종류가 같은 자료형의 변수를 대량으로 만들 때 짧은 코드로 구현 가능하게 합니다.

배열의 필요성

임의의 정수 20개를 순서대로 더하는 코드는 어떻게 작성해야 할까요? 변수 20개를 선언하고, 변수의 덧셈을 20회 작성해야 합니다.

#include<stdio.h>
void main() {
	int num1 = 3;
	int num2 = 5;
	int num3 = 9;
	int num4 = 2;
	int num5 = 7;
	int num6 = 1;
	int num7 = 2;
	int num8 = 9;
	int num9 = 3;
	int num10 = 1;
	int num11 = 1;
	int num12 = 7;
	int num13 = 6;
	int num14 = 9;
	int num15 = 4;
	int num16 = 2;
	int num17 = 5;
	int num18 = 6;
	int num19 = 8;
	int num20 = 3;

	int plus = num1 + num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9 + num10 + num11 + num12 + num13 + num14 + num15 + num16 + num17 + num18 + num19 + num20;

	printf("%d \n", plus);
}

결과

93

20개는 손으로 적을 수 있지만 변수의 개수가 200개, 2000개 등으로 늘어나면 능률이 떨어질 것입니다.

배열 기능과 반복문 코드를 사용하면, 작성해야 할 코드의 개수를 줄일 수 있습니다.

#include<stdio.h>
void main() {
	int num[20] = { 3, 5, 9, 2, 7, 1, 2, 9, 3, 1, 1, 7, 6, 9, 4, 2, 5, 6, 8, 3 }; //배열 선언

	int plus = 0; //덧셈 합계 초깃값 0
	int x;		  //덧셈 반복문용 변수

	for (x = 0; x <= 19; x++)
	{
		plus = plus + num[x];
	}			  //덧셈 반복문

	printf("%d \n", plus); //덧셈 출력문
}

결과

93

대량 작업이 가능한 이유는 배열을 이루고 있는 각 데이터의 저장 공간에는 각각 num[0], num[1], num[3], ~ num[19]와 같은 숫자 데이터가 같이 붙어 있기 때문입니다. 이 번호를 활용해서 반복문 등으로 대량 편집이 가능합니다.

배열의 구성

배열은 배열명, 원소, 값으로 구성됩니다.

c-array-1

배열의 선언

배열의 작성은 맨 앞에 자료형을 작성합니다. 그리고 배열명을 작성하고 바로 뒤에는 중괄호[n]안에 작성할 배열의 개수를 정수로 입력합니다.

int num[4]; //num이라는 이름의 배열 4칸을 생성

생성된 배열의 첫 칸은 숫자 [0]부터 시작합니다. 마지막 배열 칸의 이름은 (배열의 개수 -1)입니다. 각 원소에는 변수처럼 자료형이 일치하는 조건하에 원하는 데이터를 삽입할 수 있습니다.

num[0] = 1;
num[1] = 2;
num[2] = 3;
num[3] = 4;

중괄호 { }를 사용해서 원소명을 작성하지 않고, 배열값을 한 줄에 작성할 수 있습니다.

int num[4] = { 1, 2, 3, 4 };

배열의 초기화

배열 선언시 대괄호를 비워두면서 배열의 개수를 지정하지 않을 경우 자동으로 값의 개수만큼 배열 칸 개수가 지정됩니다.

int num[] = { 1, 2, 3, 4 }; //자동으로 배열 4칸이 생성

배열의 개수보다 배열값 개수가 더 적을 경우 빈 배열칸에는 0이 삽입됩니다.

int num[4] = { 1, 2 };

단, 0을 대입할 경우 모든 값이 0으로 변경됩니다.

int num[4] = { 0 };

배열은 선언만 하고, 아무 값도 삽입하지 않은 경우 변수 처럼 빈 값이 생성되는 것이 아니라 임의의 쓰레기 값이 자동 삽입되므로 유의합니다.

int num[4];

배열칸의 개수보다 배열값의 개수가 많을 경우 오류가 발생합니다.

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

배열과 반복문

배열의 각 원소 이름에는 a[0], a[1], .. 등과 같이 [ ]안의 정수값이 존재합니다.

c-array-loop-1

또한 배열 원소의 정수값은 친절하게도 0부터 1씩 증가합니다. 이 정수값을 변수로 교체할 수 있습니다.

c-array-loop-2

교체된 변수에 x++ 과 같은 증감 연산자를 사용한 반복문을 사용할 수 있습니다.

#include<stdio.h>
void main() {
	int a[5];
	a[0] = 1;
	a[1] = 2;
	a[2] = 3;
	a[3] = 4;
	a[4] = 5;

	int plus = 0; //덧셈 합계 초깃값 0
	int x;		  //덧셈 반복문용 변수

	for (x = 0; x <= 4; x++) //x <= 5가 아닌 이유는 원소 첨자[ ]의 마지막 숫자는 (배열 개수 - 1) 이기 때문입니다.
	{
		plus = plus + a[x]; //배열의 원소 a[ ]에 변수 x를 대입
	}			  //덧셈 반복문

	printf("%d \n", plus); //덧셈 출력문
}

결과

15

연산해야할 개수가 늘어날 경우 배열과 반복문 조합의 장점은 더 드러납니다.

#include<stdio.h>
void main() {
	//1~100 임의의 정수 100개
	int a[100] = { 94, 59, 19, 96, 80, 65, 51 ,80, 1, 96, 91, 6, 79, 52, 66, 28, 73, 84, 11, 7, 3, 95, 47, 91, 47, 32, 11, 65, 25, 41, 81, 87, 95, 4, 67, 100, 23, 15, 100, 8, 20, 8, 30, 5, 39, 76, 72, 81, 25, 92, 68, 59, 66, 11,75, 73, 2, 76, 75, 3, 60, 82, 78, 25, 70, 8, 12, 38, 80, 57, 38, 19, 56, 6, 20, 78, 74, 75, 32, 34, 70, 41, 21, 49, 74, 19, 23, 63, 20, 52, 91, 95, 26, 54, 1, 86, 9, 34, 18, 21 };

	int plus = 0; //덧셈 합계 초깃값 0
	int x;		  //덧셈 반복문용 변수

	for (x = 0; x <= 99; x++) //x <= 100가 아닌 이유는 원소 첨자[ ]의 마지막 숫자는 (배열 개수 - 1) 이기 때문입니다.
	{
		plus = plus + a[x]; //배열의 원소 [ ] 숫자에 변수 x를 대입
	}			  //덧셈 반복문

	printf("%d \n", plus); //덧셈 출력문
}

결과

4940

배열 선언 vs 일반 변수 선언 차이점

일반 자료형의 선언과 배열 선언의 가장 큰 차이점은 선언과 값 대입의 분리 유무입니다.

일반 자료형은 변수의 선언과 변수에 값을 대입하는 작업을 분리할 수 있습니다.

int x;
x = 1;

하지만 배열은 배열 선언과 배열값 대입을 분리할 수 없습니다. 왜냐하면 배열명인 x는 변수가 아니라 상수이기 때문입니다.

int x[];
x = 1; //오류입니다.

배열은 선언과 값 대입을 분리하려는 경우, 배열 원소에 따로 삽입을 해야 합니다.

int x[1];
x[0] = 1;

변수처럼 배열명에 바로 값을 대입하면 오류가 발생합니다.