안녕하세요. c언어를 열심히 공부하고 있는 여러분, 게임플밍마스터 입니다.
함수를 통해 코드를 기능별로 정리하는 법을 배웠으니, 이제는 데이터를 효과적으로 관리하는 방법을 배울 차례입니다. 한 번에 여러 개의 데이터를 다뤄야 할 때 반드시 필요한 '배열'의 세계로 들어가 보겠습니다.
배열이 어렵다고 느끼는 사람이 많습니다. 저의 경우도 배열을 배울때 앞에서 배운 난이도에 비해서 어렵다고 느꼈던 부분이기도 합니다. 개념의 이해가 중요하니 차분하게 대상을 잘 보면서 누굴, 어디에 라는 개념으로 대상을 정확하게 보면서 생각하세요 .
만약 우리 반 학생 5명의 시험 점수를 저장해야 한다면 어떻게 해야 할까요? 지금까지 배운 방법으로는 이렇게 해야 합니다.
int score1, score2, score3, score4, score5;
5명이니 망정이지, 만약 30명, 100명이라면 어떨까요? 변수를 100개나 선언하는 것은 끔찍한 일입니다. 게다가 이 점수들의 평균을 구하려면 100개의 변수를 모두 더해야 합니다.
C언어는 이런 불편함을 해결하기 위해 배열(Array) 이라는 아주 강력한 도구를 제공합니다. 배열은 같은 자료형의 데이터 여러 개를 하나의 이름으로 묶어 놓은 연속된 메모리 공간입니다. 마치 '3학년 5반'이라는 이름 아래 여러 학생이 있거나, 똑같은 모양의 사물함들이 일렬로 늘어서 있는 것과 같습니다.
1. 배열 만들고 사용하기
배열 선언 (Array Declaration)
배열을 만드는 방법은 변수 선언과 비슷하지만, 이름 뒤에 를 붙여 그 안에 몇 개의 데이터를 저장할지 '크기'를 적어줍니다.
자료형 배열이름[크기];
예를 들어, int형 데이터 5개를 저장할 수 있는 배열 scores는 다음과 같이 선언합니다.
int scores[5];
이렇게 선언하는 순간, 컴퓨터는 int형 데이터를 저장할 공간 5개를 연속적으로 메모리에 마련하고, 그 묶음 전체에 scores라는 이름을 붙여줍니다.
배열의 요소와 인덱스(Index)
배열을 구성하는 각각의 데이터 하나하나를 요소(Element) 라고 부릅니다. 이 요소에 접근하기 위해서는 '방 번호'가 필요한데, 이 방 번호를 인덱스(Index) 또는 첨자(Subscript) 라고 합니다.
C언어 배열에서 가장 중요하고 헷갈리기 쉬운 규칙은, 인덱스가 항상 0부터 시작한다는 것입니다.
arr 배열의 경우, 5개의 공간이 있지만 방 번호는 0, 1, 2, 3, 4가 됩니다. 크기가 N인 배열의 인덱스는 0부터 N-1까지 입니다.
요소 1번째 요소 2번째 요소 3번째 요소 4번째 요소 5번째 요소
| 요소 | 1번째 요소 | 2번째 요소 | 3번째 요소 | 4번째 요소 | 5번째 요소 |
| 인덱스 | arr[0] | arr[1] | arr[2] | arr[3] | arr[4] |
그림으로 표현하면

배열 요소에 접근하기
배열 이름과 인덱스를 사용하면, 일반 변수처럼 값을 저장하거나 읽어올 수 있습니다.
scores[0] = 95; // 첫 번째 요소(0번 인덱스)에 95를 저장
scores[4] = 88; // 다섯 번째 요소(4번 인덱스)에 88을 저장
printf("첫 번째 학생의 점수: %d\\n", scores[0]);
2. 배열과 찰떡궁합, for 반복문
배열의 진정한 힘은 반복문과 만났을 때 발휘됩니다. 인덱스가 0, 1, 2, ... 와 같이 규칙적으로 증가하기 때문에, for 문의 카운터 변수 i를 인덱스로 활용하면 배열의 모든 요소에 아주 쉽게 접근할 수 있습니다.
예제: 5명 학생의 점수를 입력받아 총점과 평균 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int scores[5]; // 5개의 점수를 저장할 배열
int sum = 0;
double avg;
// for문을 이용해 5명의 점수를 입력받아 배열에 저장
for (int i = 0; i < 5; i++)
{
printf("%d번째 학생의 점수를 입력하세요: ", i + 1);
scanf("%d", &scores[i]); // i가 0,1,2,3,4로 변하며 각 요소에 접근
}
// for문을 이용해 배열의 모든 점수를 더함
for (int i = 0; i < 5; i++)
{
sum += scores[i];
}
avg = (double)sum / 5; // 정확한 평균을 위해 형 변환
printf("점수 총합: %d\\n", sum);
printf("점수 평균: %.1f\\n", avg);
return 0;
}
3. 배열을 만드는 동시에 값 채우기 - 초기화
배열을 선언할 때 중괄호 {}를 이용해 초기값을 바로 지정해 줄 수 있습니다. 이를 배열 초기화라고 합니다.
// 방법 1: 크기와 초기값을 모두 지정
int numbers[5] = {10, 20, 30, 40, 50};
// 방법 2: 크기 생략. 컴파일러가 초기값의 개수를 보고 자동으로 크기를 정함 (5로 결정됨)
int numbers[] = {10, 20, 30, 40, 50};
// 방법 3: 부분 초기화. 크기는 5지만 초기값은 3개만 지정
// 이 경우, 지정되지 않은 나머지 요소(numbers[3], numbers[4])는 자동으로 0으로 채워짐
int numbers[5] = {10, 20, 30}; // 결과: {10, 20, 30, 0, 0}
4. [꿀팁] 배열의 크기 알아내기 - sizeof
배열의 크기가 5라는 것을 코드에 직접 for (int i = 0; i < 5; ...) 와 같이 쓰는 것을 '하드 코딩'이라고 합니다. 나중에 배열 크기를 10으로 바꾸려면 for 문도 함께 고쳐야 해서 번거롭고 실수를 유발할 수 있습니다.
sizeof 연산자를 사용하면 배열의 크기를 동적으로 알아낼 수 있습니다.
- sizeof(scores): 배열 전체의 크기를 바이트(byte) 단위로 알려줍니다. (예: int가 4바이트라면 4 * 5 = 20)
- sizeof(scores[0]): 배열의 요소 하나의 크기를 알려줍니다. (예: 4)
따라서 배열 전체 크기 / 요소 하나 크기 를 계산하면 배열의 요소 개수를 알 수 있습니다.
int scores[] = {88, 92, 100, 76, 81, 95, 84};
int count = sizeof(scores) / sizeof(scores[0]); // count는 7이 됨
printf("학생 수는 %d명 입니다.\\n", count);
for (int i = 0; i < count; i++) { // 이제 배열 크기가 바뀌어도 for문은 고칠 필요 없음!
// ...
}
5. [도전! 프로그래밍] 최고점, 최저점 찾기
배열과 반복문을 사용하여, 5명의 학생 점수 중 최고점과 최저점을 찾아 출력하는 프로그램을 작성해 보세요.
힌트:
- 결과를 저장할 max_score와 min_score 변수를 만듭니다.
- 두 변수를 일단 배열의 첫 번째 값(scores[0]) 으로 초기화합니다.
- for 문으로 배열의 두 번째 요소부터 끝까지 순회합니다.
- 반복문 안에서 현재 요소가 max_score보다 크면 max_score를 현재 요소 값으로 바꾸고, min_score보다 작으면 min_score를 현재 요소 값으로 바꿉니다.
이번 장 정리
- 배열은 같은 자료형의 데이터를 하나의 이름으로 묶어 관리하는 효율적인 방법입니다.
- 배열의 각 요소에 접근할 때는 0부터 시작하는 인덱스를 사용합니다. (크기 N인 배열의 마지막 인덱스는 N-1)
- 배열은 인덱스가 규칙적으로 증가하므로 for 반복문과 함께 사용할 때 가장 강력합니다.
- sizeof(배열) / sizeof(배열[0]) 공식을 사용하면 배열의 크기가 바뀌어도 코드를 수정할 필요 없는 유연한 프로그램을 만들 수 있습니다.
배열은 C언어에서 데이터를 다루는 가장 기본적인 방법이며 매우 중요합니다. 다음 장에서는 C언어의 꽃이자 가장 어려운 개념으로 알려진 '포인터'에 대해 배우게 됩니다. 놀랍게도 배열과 포인터는 사실 매우 깊은 관계를 맺고 있는데, 이 관계를 이해하면 C언어를 한 단계 더 깊이 이해하게 될 것입니다.
'C, C++ 언어' 카테고리의 다른 글
| C언어 기초 15. 문자들의 배열, 문자열 (0) | 2025.10.23 |
|---|---|
| C언어 기초 14. 포인터 기초 (0) | 2025.10.20 |
| C언어 기초 12. 함수 (0) | 2025.10.17 |
| C언어 기초 11. break 와 continue (0) | 2025.10.16 |
| C언어 기초 10. 반복문 while 문과 do-while 문 (0) | 2025.10.15 |