배열 — 데이터 관리
100명의 학생 점수를 저장하려면 100개의 변수가 필요할까요? 아닙니다! 같은 종류의 수많은 데이터를 단 하나의 이름으로 묶어서 효율적으로 관리하는 '배열'에 대해 배웁니다.
학습 목표
이번 단계를 완료하면 다음 능력을 갖추게 됩니다.
sizeof 연산자를 이용해 배열의 요소 개수를 자동 계산한다.배열이란?
배열(Array)은 같은 종류의 데이터를 여러 개 저장할 수 있는 연속된 저장 공간입니다.
예를 들어 int score[5]; 라고 선언하면 다음과 같이 정수를 담을 수 있는 5칸짜리 상자가 만들어집니다.
각 상자의 고유 번호(0부터 시작)를 인덱스(Index)라고 부릅니다.
배열 선언과 초기화
1. 선언 후 값 하나씩 넣기
int score[5]; // 5칸짜리 정수 배열 생성 score[0] = 90; score[1] = 80; score[2] = 75; score[3] = 95; score[4] = 85;
2. 선언과 동시에 초기화 (가장 많이 씀)
// 중괄호 {} 안에 값을 순서대로 나열합니다. int score[5] = {90, 80, 75, 95, 85}; // 초기값을 넣는다면 크기(5)를 생략해도 컴파일러가 자동으로 알아냅니다. int score2[] = {90, 80, 75, 95, 85};
배열의 인덱스는 무조건 0부터!
int data[10]; 배열은 10개의 공간을 갖지만, 번호표(인덱스)는 0부터 시작해서 9에서 끝납니다.
만약 실수로 data[10] = 99; 처럼 접근하면 프로그램이 튕기거나 다른 중요한 메모리를 건드려 심각한 버그(해킹 취약점 등)를 유발할 수 있습니다. C언어는 이걸 자동으로 막아주지 않으니 개발자가 꼭 주의해야 합니다!
배열과 for문의 강력한 조합
배열은 for 반복문과 만날 때 진정한 힘을 발휘합니다. 인덱스 자리에 변수 i를 넣으면 됩니다.
#include <stdio.h> int main() { int score[5] = {90, 80, 75, 95, 85}; // i는 0부터 4까지 증가합니다 (총 5번) for (int i = 0; i < 5; i++) { printf("%d번째 학생 점수: %d\n", i + 1, score[i]); } return 0; }
실습: 합계와 평균 구하기
사용자로부터 5명의 점수를 입력(scanf) 받아서 배열에 차곡차곡 쌓은 뒤, 한꺼번에 연산합니다.
#include <stdio.h> int main() { int score[5]; int sum = 0; double avg; // 1. 입력 받기 (scanf와 배열) for (int i = 0; i < 5; i++) { printf("%d번째 학생 점수: ", i + 1); scanf("%d", &score[i]); // 주소 기호 &를 잊지 마세요! sum += score[i]; // 입력받자마자 sum에 누적 } // 2. 평균 계산 및 출력 avg = sum / 5.0; printf("\n총점: %d점 | 평균: %.2lf점\n", sum, avg); return 0; }
최댓값 찾기 및 검색 알고리즘
일단 배열의 첫 번째 칸([0]) 값을 챔피언(최댓값)이라고 가정합니다.
그리고 두 번째 칸부터 끝까지 반복문을 돌며 현재 챔피언보다 더 강한 값(더 큰 값)이 나오면 챔피언 타이틀을 넘겨줍니다.
int max = score[0]; // 첫 번째 값을 임시 최댓값으로! for (int i = 1; i < 5; i++) { if (score[i] > max) { max = score[i]; // 새 챔피언 등극 } } // 반복문이 끝나면 max에는 진짜 최댓값이 남아있습니다.
내가 원하는 값을 배열에서 찾으려면 처음부터 끝까지 하나씩 확인(==)해 보는 수밖에 없습니다.
int target = 75; int found = 0; // 못 찾았다는 상태 플래그(깃발) for (int i = 0; i < 5; i++) { if (score[i] == target) { found = 1; // 찾았다! 깃발 올리기 printf("%d 인덱스에 존재합니다.\n", i); break; // 찾았으니 더 이상 반복할 필요 없음 } }
sizeof 연산자로 배열 크기 자동 계산
배열의 크기가 나중에 바뀔 것에 대비해, 하드코딩(5 같은 숫자를 직접 치는 것) 대신 요소의 개수를 자동으로 구하는 공식입니다.
int score[] = {90, 80, 75, 95, 85, 100, 60}; // 나중에 데이터가 늘어나도 // 배열 요소의 개수 = (배열 전체의 메모리 크기) / (한 칸의 메모리 크기) int count = sizeof(score) / sizeof(score[0]); // 7 이라는 숫자 대신 count 변수를 사용하면 코드를 수정할 필요가 없습니다. for (int i = 0; i < count; i++) { ... }
배열 복사 시 주의사항
int a[5] = {1, 2, 3}; int b[5]; b = a; (X) 에러 발생!
배열을 복사하려면 반드시 for 반복문을 돌며 한 칸씩 b[i] = a[i]; 로 옮겨 담아야 합니다.
STEP 07 최종 프로젝트
학생 성적 종합 관리 프로그램
10명의 학생 점수를 입력받아 배열에 저장하고, 통계를 도출해 내는 프로그램을 작성하세요.
- 1. 입력: 10명의 점수 입력 (for문, scanf)
- 2. 출력: 10명 점수 리스트 나열
- 3. 통계: 총점, 평균, 최고점, 최저점 계산 및 출력
- 4. 분류: 60점 이상 합격자 수, 60점 미만 불합격자 수 계산
[도전 과제] 배열 역순 출력
입력된 10개의 점수를 배열 인덱스를 뒤에서부터 접근(for(int i = 9; i >= 0; i--))하여 입력된 순서의 역순으로 출력해 보세요.
STEP 07 완료 체크리스트
이제 여러분은 10개든, 10,000개든 엄청난 양의 데이터를 단 하나의 배열 변수로 손쉽게 관리할 수 있게 되었습니다. "입력 → 배열 저장 → 반복+조건 처리 → 출력"의 파워를 실감해 보세요.