배열
지난 편에서는 for, while, do-while 반복문으로 같은 코드를 여러 번 실행하는 방법을 배웠습니다. 그런데 만약 학생 5명의 점수를 각각 저장하고 싶다면 어떻게 해야 할까요? score1, score2, score3… 이렇게 변수를 하나씩 만드는 것도 방법이지만, 학생이 100명이 되면 변수 이름도 100개가 필요해지고 반복문으로 처리하기도 어려워집니다. 이럴 때 사용하는 것이 바로 배열입니다. 배열은 같은 자료형의 여러 데이터를 하나의 이름으로 묶어서 관리할 수 있게 해주는 자료구조입니다.
배열이란 무엇인가
배열은 메모리에 연속으로 늘어선 같은 타입의 변수 여러 개를 하나의 이름으로 다룰 수 있게 해주는 것입니다. 각 칸에는 순서가 매겨져 있는데, 이 순서를 인덱스(index)라고 부르며 C언어에서는 항상 0부터 시작합니다.
int scores[5];
위 코드는 int형 데이터를 5개 담을 수 있는 scores라는 배열을 선언한 것입니다. scores[0]부터 scores[4]까지 총 5칸이 만들어지며, 각 칸에 개별적으로 값을 넣거나 꺼낼 수 있습니다.
배열 선언과 초기화
배열은 선언할 때 바로 값을 채워 넣을 수도 있습니다.
int scores[5] = {90, 85, 100, 70, 95};
이렇게 하면 scores[0]은 90, scores[1]은 85, … scores[4]는 95가 됩니다. 만약 크기를 생략하고 초기값만 나열하면 컴파일러가 알아서 개수를 세어 크기를 정해줍니다.
int scores[] = {90, 85, 100, 70, 95}; /* 크기가 자동으로 5로 결정됨 */
주의할 점은, 배열의 인덱스는 0부터 시작해서 (크기 - 1)까지만 유효하다는 것입니다. scores[5]처럼 범위를 벗어난 인덱스에 접근하면 C언어는 이를 막아주지 않기 때문에 예상치 못한 값이 나오거나 프로그램이 비정상 종료될 수 있습니다. 이런 실수를 “배열 범위를 벗어난 접근”이라고 부르는데, 초보자가 가장 흔히 저지르는 실수 중 하나이니 항상 인덱스 범위를 확인하는 습관을 들이는 것이 좋습니다.
반복문과 배열을 함께 사용하기
배열의 진짜 힘은 반복문과 함께 쓸 때 나타납니다. 배열의 크기만큼 for문을 돌리면 모든 원소에 순서대로 접근할 수 있습니다.
int scores[5] = {90, 85, 100, 70, 95};
for (int i = 0; i < 5; i++) {
printf("scores[%d] = %d\n", i, scores[i]);
}
i가 0부터 4까지 하나씩 증가하면서 scores[i]로 각 칸의 값을 순서대로 출력합니다. 이렇게 하면 배열의 크기가 몇이든 코드 한 줄 수정 없이 모든 원소를 다룰 수 있습니다.
예제 코드로 확인해보기
학생 5명의 점수를 배열에 저장하고, 평균과 최고점을 구하는 프로그램을 작성해보겠습니다.
#include <stdio.h>
int main(void) {
int scores[5] = {90, 85, 100, 70, 95};
int sum = 0;
int max = scores[0];
for (int i = 0; i < 5; i++) {
sum += scores[i];
if (scores[i] > max) {
max = scores[i];
}
}
double average = (double)sum / 5;
printf("점수 목록: ");
for (int i = 0; i < 5; i++) {
printf("%d ", scores[i]);
}
printf("\n");
printf("합계: %d\n", sum);
printf("평균: %.1f\n", average);
printf("최고점: %d\n", max);
return 0;
}
코드 동작 설명 및 실행 결과
scores배열에 다섯 명의 점수를 저장한 뒤, 첫 번째for문에서 모든 원소를 순회하며sum에 누적으로 더하고, 동시에scores[i]가 지금까지의max보다 크면max를 갱신합니다.- 평균을 구할 때는
sum이 정수형이라 나눗셈을 하면 소수점이 버려지기 때문에,(double)sum / 5처럼 형변환을 해줘야 소수점까지 정확한 평균이 나옵니다. - 두 번째
for문은 배열 전체 값을 화면에 출력하기 위한 용도로, 첫 번째 반복문과는 별개로 다시 처음부터 순회합니다. - 이 코드를
gcc arrays.c -o arrays로 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.
점수 목록: 90 85 100 70 95
합계: 440
평균: 88.0
최고점: 100
다섯 개의 점수를 더한 440을 5로 나눈 88.0이 평균으로 나오고, 가장 높은 점수인 100이 최고점으로 정확히 출력되는 것을 확인할 수 있습니다.
핵심 요약
- 배열은 같은 자료형의 여러 데이터를 하나의 이름으로 묶어서 관리하는 자료구조이며, 인덱스는 0부터 시작합니다.
int arr[5];처럼 크기를 지정해 선언하거나,int arr[] = {1, 2, 3};처럼 초기값으로 크기를 자동 결정할 수 있습니다.- 배열의 유효 범위(0 ~ 크기-1)를 벗어난 인덱스에 접근하면 컴파일러가 막아주지 않으므로 항상 범위를 주의해야 합니다.
- 반복문과 배열을 함께 사용하면 데이터 개수가 아무리 많아도 짧은 코드로 순회, 합계, 최댓값 계산 등을 처리할 수 있습니다.
다음 편에서는 문자들을 배열로 다루는 특별한 방식인 “문자열과 문자 처리”에 대해 알아보겠습니다. 배열의 기본 개념을 알고 나면 문자열이 왜 문자들의 배열로 취급되는지 훨씬 쉽게 이해할 수 있을 것입니다.