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]
와 같은 숫자 데이터가 같이 붙어 있기 때문입니다. 이 번호를 활용해서 반복문 등으로 대량 편집이 가능합니다.
배열의 구성
배열은 배열명, 원소, 값으로 구성됩니다.
배열의 선언
배열의 작성은 맨 앞에 자료형을 작성합니다. 그리고 배열명을 작성하고 바로 뒤에는 중괄호[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]
, .. 등과 같이 [ ]
안의 정수값이 존재합니다.
또한 배열 원소의 정수값은 친절하게도 0
부터 1
씩 증가합니다. 이 정수값을 변수로 교체할 수 있습니다.
교체된 변수에 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;
변수처럼 배열명에 바로 값을 대입하면 오류가 발생합니다.