안녕하세요 피터입니다.
오늘은 C언어의 배열 (Array)에 대해 알려드리겠습니다.
개요
배열은 이전 시간에 포스팅했던 루프(반복문) 과 단짝입니다.
배열 자체가 같은 크기의 메모리 공간을 연속적으로 할당한 것이기 때문에 각 요소(Element)들을 개별적으로 다루는 것보다 루프를 이용해서 접근하면 훨씬 코드가 심플해지고 효율적이기 때문입니다.
루프와 함께 사용하지 않는다면 배열은 단순히 변수를 여러 개 선언한 것과 다를 바 없습니다.
루프의 반복자(iterator)는 배열의 각 항목(item)들에 접근하는 인덱스(index)로 사용하기에 매우 적합합니다.
문법(Syntax)
배열의 선언
배열을 선언하는 기본적인 문법은 아래와 같습니다.
datatype arrayname[arraysize];
문법 자체는 변수를 선언하는 것과 크게 다르지 않습니다.
지정된 datatype으로 arraysize 만큼의 메모리 공간을 할당하고, 이 메모리 공간에 접근할 때 arrayname을 이용해서 접근하는 것이죠.
단, arraysize 는 반드시 상수여야 합니다.
int 타입의 크기가 10인 배열을 아래와 같이 선언하면 연속된 영역의 메모리 공간을 할당받게 됩니다.
int cost[10];
따라서 배열 전체 크기는 int 타입의 크기에 arraysize를 곱한 값이 됩니다.
4* 10 = 40
여기에서 한 가지 알아두셔야 할 것은 배열의 이름만 쓰게 되면 첫 번째 요소의 주소와 의미가 같다는 점입니다.
아직은 이 말이 무슨 뜻인지 정확하게 이해가 안되실 수도 있습니다.
이후에 포스팅할 예정인 포인터를 보시고 나면 이해가 좀 더 수월하실 거에요.
배열 요소 접근
이렇게 선언된 배열의 각 요소(element)는 아래와 같이 접근할 수 있습니다.
arrayname[index]
이때 주의하셔야 할 부분은 index 값은 0부터 시작하기 때문에 index의 최대값은 arraysize - 1이 된다는 점입니다.
Write: 배열 요소에 값을 저장
element에 값을 넣을 때는 = 연산자의 좌항(left value)에 넣어주면 됩니다.
int cost[10];
cost[0] = 10;
cost[5] = 30;
cost[9] = 50;
배열의 크기가 10으로 지정되었기 때문에 사용 가능한 인덱스 값은 0부터 9까지입니다.
이 범위를 벗어나는 인덱스를 사용하여 배열을 참조할 경우 스택영역의 메모리 overwrite으로 인해 프로그램이 오동작 하거나 메모리 참조 오류를 만나보실 수 있습니다.
Read: 배열 요소의 값을 읽기
element의 값을 읽어올 때는 = 연산자의 우항(right value)에 넣어주면 됩니다.
int last_cost;
last_cost = cost[9];
다음과 같이 printf 문에서 직접 읽어올 수도 있습니다.
printf("first array value is %d\n", cost[0]);
루프와 배열
int main(void)
{
int score[5];
scanf("%d", &score[0]);
scanf("%d", &score[1]);
scanf("%d", &score[2]);
scanf("%d", &score[3]);
scanf("%d", &score[4]);
printf("%dst score is %d\n", 1, score[0]);
printf("%dst score is %d\n", 2, score[1]);
printf("%dst score is %d\n", 3, score[2]);
printf("%dst score is %d\n", 4, score[3]);
printf("%dst score is %d\n", 5, score[4]);
return 0;
}
위 코드는 크기가 5인 배열을 선언하고 각 요소에 값을 표준 입력(키보드 입력)으로 받아서 할당한 뒤 모든 배열의 요소를 순차적으로 출력하는 코드입니다.
배열을 사용하긴 했지만 특정 구문이 계속해서 반복되는 비효율적인 코드가 되어버렸습니다.
루프를 활용해서 코드를 개선해보겠습니다.
int main(void)
{
int score[5];
int i;
for(i=0; i<5; i++)
{
scanf("%d", &score[i]);
}
for(i=0; i<5; i++)
{
printf("%dst score is %d\n", i+1, score[i]);
}
return 0;
}
루프 안에 scanf() 구문과 printf() 구문을 넣고 i 값을 인덱스로 접근하도록 바꾸니 코드가 훨씬 단순해지고 보기좋아졌습니다.
제가 항상 강조하는 것 중에 하나가 코드의 가독성인데 가동성을 높이기 위해서는 이런 작은 부분부터 신경을 써야 합니다.
여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.
-Peter의 우아한 프로그래밍
'프로그래밍 > C' 카테고리의 다른 글
[C언어 강좌-12] 함수 (Function) (0) | 2018.05.26 |
---|---|
[C언어 강좌-11] 포인터 (Pointer) (0) | 2018.05.23 |
[C언어 강좌-9] 반복문 (Loop) (0) | 2018.05.04 |
[C언어 강좌-8] 조건문 (IF, SWITCH) (0) | 2018.04.12 |
[C언어 강좌-7] 연산자 (Operator) (0) | 2017.02.27 |