7. 1차원 배열

header


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. 배열의 선언과 초기화

배열 선언 방법

배열을 선언하려면 세 가지 요소가 필요합니다:

  1. 자료형: 배열에 저장할 데이터의 타입
  2. 배열 이름: 배열을 식별하는 이름
  3. 배열 크기: 저장할 수 있는 데이터의 개수
자료형 배열이름[배열크기];

예시:

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 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입니다.
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: 큰따옴표 사용 (권장)

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의 문자열 입력 제한
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. 배열 초기화
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 (& 없이)