1. 배열이란?
배열은 같은 자료형의 데이터를 여러 개 저장할 수 있는 데이터 구조입니다.
배열이 필요한 이유
학생 5명의 점수를 저장하려면 어떻게 해야 할까요?
배열을 사용하지 않는 경우:
int score1 = 85;
int score2 = 90;
int score3 = 78;
int score4 = 92;
int score5 = 88;
변수가 너무 많아서 관리하기 어렵습니다!
배열을 사용하는 경우:
int scores[5] = {85, 90, 78, 92, 88};
하나의 변수로 여러 개의 값을 관리할 수 있습니다!
배열 = 같은 자료형 데이터의 집합
배열을 사용하면 많은 데이터를 효율적으로 관리할 수 있습니다.
배열을 사용하면 많은 데이터를 효율적으로 관리할 수 있습니다.
2. 배열의 선언과 초기화
배열 선언 방법
배열을 선언하려면 세 가지 요소가 필요합니다:
- 자료형: 배열에 저장할 데이터의 타입
- 배열 이름: 배열을 식별하는 이름
- 배열 크기: 저장할 수 있는 데이터의 개수
자료형 배열이름[배열크기];
예시:
int numbers[5]; // 정수 5개를 저장할 수 있는 배열
double values[10]; // 실수 10개를 저장할 수 있는 배열
char letters[26]; // 문자 26개를 저장할 수 있는 배열
배열의 메모리 구조
int arr[3];
위 배열을 선언하면 메모리에는 다음과 같이 공간이 할당됩니다:
| arr[0] | arr[1] | arr[2] |
|---|---|---|
| 4바이트 | 4바이트 | 4바이트 |
💡 메모리 할당
int형은 4바이트이므로
int형은 4바이트이므로
int arr[3]은 총 12바이트(4×3)의 메모리를 차지합니다.
배열 초기화 방법
방법 1: 선언과 동시에 초기화
int arr[5] = {10, 20, 30, 40, 50};
방법 2: 크기 생략 (컴파일러가 자동으로 크기 결정)
int arr[] = {10, 20, 30, 40, 50}; // 크기는 자동으로 5
방법 3: 일부만 초기화 (나머지는 0으로 자동 초기화)
int arr[5] = {10, 20}; // arr[0]=10, arr[1]=20, arr[2]=0, arr[3]=0, arr[4]=0
방법 4: 모두 0으로 초기화
int arr[5] = {0}; // 모든 요소가 0
⚠️ 주의
배열을 선언만 하고 초기화하지 않으면 쓰레기 값이 들어있습니다!
배열을 선언만 하고 초기화하지 않으면 쓰레기 값이 들어있습니다!
실습 1
다음 코드의 실행 결과를 확인해보세요:
#include <stdio.h>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
int values[] = {1, 2, 3};
int zeros[5] = {0};
printf("numbers 배열의 크기: %d바이트\n", sizeof(numbers));
printf("values 배열의 크기: %d바이트\n", sizeof(values));
printf("zeros[0] = %d\n", zeros[0]);
printf("zeros[4] = %d\n", zeros[4]);
return 0;
}
실행 결과 보기
numbers 배열의 크기: 20바이트 values 배열의 크기: 12바이트 zeros[0] = 0 zeros[4] = 0
numbers: int 5개 × 4바이트 = 20바이트values: int 3개 × 4바이트 = 12바이트zeros: {0}으로 초기화하면 모든 요소가 0
3. 배열 요소 접근하기
인덱스(Index)
배열의 각 요소는 인덱스(색인)를 통해 접근합니다.
중요: 인덱스는 0부터 시작합니다!
int arr[5] = {10, 20, 30, 40, 50};
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 값 | 10 | 20 | 30 | 40 | 50 |
배열 요소 읽기와 쓰기
읽기:
printf("%d\n", arr[0]); // 10 출력
printf("%d\n", arr[2]); // 30 출력
쓰기:
arr[1] = 100; // 두 번째 요소를 100으로 변경
arr[4] = 200; // 다섯 번째 요소를 200으로 변경
⚠️ 배열 범위 초과 주의
크기가 5인 배열의 유효한 인덱스는 0~4입니다.
크기가 5인 배열의 유효한 인덱스는 0~4입니다.
arr[5], arr[10] 같은 접근은 오류를 발생시킵니다!
실습 2
#include <stdio.h>
int main() {
int scores[3];
// 배열 요소에 값 저장
scores[0] = 85;
scores[1] = 90;
scores[2] = 78;
// 배열 요소 출력
printf("첫 번째 점수: %d\n", scores[0]);
printf("두 번째 점수: %d\n", scores[1]);
printf("세 번째 점수: %d\n", scores[2]);
// 평균 계산
double average = (scores[0] + scores[1] + scores[2]) / 3.0;
printf("평균: %.2f\n", average);
return 0;
}
실행 결과 보기
첫 번째 점수: 85 두 번째 점수: 90 세 번째 점수: 78 평균: 84.33
4. 배열과 반복문
배열은 for 반복문과 함께 사용하면 매우 효율적입니다.
for문으로 배열 순회하기
#include <stdio.h>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
int i;
// 배열의 모든 요소 출력
for (i = 0; i < 5; i++) {
printf("numbers[%d] = %d\n", i, numbers[i]);
}
return 0;
}
실행 결과 보기
numbers[0] = 10 numbers[1] = 20 numbers[2] = 30 numbers[3] = 40 numbers[4] = 50
실습 3 - 배열의 합과 평균 구하기
#include <stdio.h>
int main() {
int scores[5] = {85, 90, 78, 92, 88};
int sum = 0;
int i;
// 합계 계산
for (i = 0; i < 5; i++) {
sum += scores[i];
}
// 평균 계산
double average = sum / 5.0;
printf("총점: %d\n", sum);
printf("평균: %.2f\n", average);
return 0;
}
실행 결과 보기
총점: 433 평균: 86.60
💡 배열 크기 자동 계산
배열의 크기를 코드에 직접 쓰지 않고 계산할 수 있습니다:
배열의 크기를 코드에 직접 쓰지 않고 계산할 수 있습니다:
int size = sizeof(scores) / sizeof(scores[0]);
5. 문자 배열과 문자열
문자 배열
문자를 저장하는 배열은 char형 배열을 사용합니다.
char letters[5] = {'H', 'e', 'l', 'l', 'o'};
문자열
C 언어에서 문자열은 널 문자(\0)로 끝나는 문자 배열입니다.
char greeting[6] = "Hello"; // 자동으로 '\0' 추가
| H | e | l | l | o | \0 |
|---|---|---|---|---|---|
| [0] | [1] | [2] | [3] | [4] | [5] |
널 문자(\0)란?
• 문자열의 끝을 나타내는 특수 문자
• 문자열을 저장할 때 자동으로 추가됨
• 실제 문자열보다 1바이트 더 큰 배열이 필요
• 문자열의 끝을 나타내는 특수 문자
• 문자열을 저장할 때 자동으로 추가됨
• 실제 문자열보다 1바이트 더 큰 배열이 필요
문자열 선언과 초기화
방법 1: 큰따옴표 사용 (권장)
char str1[6] = "Hello"; // 널 문자 포함 6바이트
방법 2: 문자 배열로 초기화
char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 수동으로 널 문자 추가
방법 3: 크기 생략
char str3[] = "Hello"; // 컴파일러가 자동으로 크기 6으로 설정
문자열 입출력
출력:
char name[] = "Kim";
printf("%s\n", name); // %s: 문자열 출력
입력:
char name[50];
scanf("%s", name); // & 연산자 없이 사용!
⚠️ scanf의 문자열 입력 제한
•
• "Hello World" 입력 시 "Hello"만 저장됨
• 공백 포함 입력은
•
scanf("%s", ...)는 공백에서 입력이 끝남• "Hello World" 입력 시 "Hello"만 저장됨
• 공백 포함 입력은
fgets() 함수 사용
실습 4
#include <stdio.h>
int main() {
char str1[20] = "Good";
char str2[20];
printf("문자열 입력: ");
scanf("%s", str2);
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
// 문자열 길이 확인 (널 문자 포함)
printf("str1 크기: %d바이트\n", sizeof(str1));
return 0;
}
실행 결과 보기
문자열 입력: Morning str1: Good str2: Morning str1 크기: 20바이트
6. 종합 실습
문제 1 - 배열 크기 (기초)
문제 1
int형 배열 arr[10]의 전체 크기는 몇 바이트입니까?
1차원 배열
문제 2 - 배열 인덱스 (기초)
문제 2
다음 코드의 실행 결과는?
1차원 배열
#include <stdio.h>
int main() {
int arr[5] = {2, 4, 6, 8, 10};
printf("%d", arr[2] + arr[4]);
return 0;
}
문제 3 - 배열 초기화 (기초)
문제 3
다음 코드에서 arr[3]의 값은?
1차원 배열
#include <stdio.h>
int main() {
int arr[5] = {10, 20};
printf("%d", arr[3]);
return 0;
}
문제 4 - 배열과 반복문 (중급)
문제 4
다음 코드의 실행 결과는?
1차원 배열
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int i, sum = 0;
for (i = 0; i < 5; i++) {
if (arr[i] % 2 == 0) {
sum += arr[i];
}
}
printf("%d", sum);
return 0;
}
문제 5 - 문자열 길이 (중급)
문제 5
문자열 “C Language”를 저장하려면 최소 몇 바이트의 char 배열이 필요합니까?
1차원 배열
문제 6 - 최댓값 찾기 (중급)
문제 6
다음 코드의 실행 결과는?
1차원 배열
#include <stdio.h>
int main() {
int arr[5] = {23, 67, 45, 89, 12};
int max = arr[0];
int i;
for (i = 1; i < 5; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
printf("%d", max);
return 0;
}
핵심 요약
1. 배열 기본
• 같은 자료형의 데이터를 여러 개 저장하는 구조
• 선언:
• 인덱스는 0부터 시작
2. 배열 초기화
•
• 크기 생략 가능:
• 일부만 초기화하면 나머지는 0
3. 배열 접근
• 읽기:
• 쓰기:
• 유효 인덱스: 0 ~ (크기-1)
4. 배열과 반복문
• for문으로 효율적인 접근
•
5. 문자열
• char 배열로 표현
• 널 문자(\0)로 끝남
•
• printf:
• 같은 자료형의 데이터를 여러 개 저장하는 구조
• 선언:
자료형 배열이름[크기];• 인덱스는 0부터 시작
2. 배열 초기화
•
int arr[5] = {10, 20, 30, 40, 50};• 크기 생략 가능:
int arr[] = {10, 20, 30};• 일부만 초기화하면 나머지는 0
3. 배열 접근
• 읽기:
value = arr[0];• 쓰기:
arr[0] = 100;• 유효 인덱스: 0 ~ (크기-1)
4. 배열과 반복문
• for문으로 효율적인 접근
•
for (i = 0; i < 크기; i++)5. 문자열
• char 배열로 표현
• 널 문자(\0)로 끝남
•
char str[] = "Hello";• printf:
%s, scanf: %s (& 없이)