07. 배열 (Array): 데이터 기차

수십, 수백 개의 변수를 기차처럼 연결하여 반복문과 함께 요리해 봅시다!

1. 배열의 기초: 0번 칸부터 시작합니다!

변수가 상자 1개라면, 배열은 같은 크기의 상자들이 기차처럼 쭉 이어져 있는 형태입니다. C언어에서 가장 중요한 규칙은 상자 번호(인덱스)가 무조건 0번부터 시작한다는 것입니다.

배열 인덱스 구조
▲ 배열의 구조: 5칸짜리 배열을 만들면 인덱스는 0부터 4까지 존재합니다.

🎒 기초 예제: RPG 아이템 인벤토리

배열의 진가는 for 반복문과 만났을 때 발휘됩니다. 배열의 인덱스를 반복문의 i로 대체하면 단 몇 줄로 모든 데이터를 검사할 수 있죠!

#include <stdio.h>

int main() {
    // 5개의 아이템 수량을 담는 1차원 배열
    int inventory[5] = {10, 20, 0, 5, 1};

    printf("--- 나의 인벤토리 ---\n");
    for(int i = 0; i < 5; i++) {
        printf("%d번 칸 아이템 수량: %d개\n", i, inventory[i]);
    }
    
    return 0;
}

2. ⚔️ 심화 예제: 가장 강한 몬스터 찾기 (최댓값)

배열 안에서 가장 큰 값을 찾는 것은 프로그래밍의 핵심 알고리즘입니다. 배열, 반복문, 조건문이 결합된 아주 훌륭한 예제입니다.

#include <stdio.h>

int main() {
    int monster_hp[5] = {450, 1200, 320, 980, 150};
    
    // 0번 칸의 몬스터가 가장 세다고 가정합니다.
    int max_hp = monster_hp[0]; 
    int boss_index = 0;

    // 1번 칸부터 끝까지 싸움을 붙여봅니다.
    for(int i = 1; i < 5; i++) {
        // 기존 최댓값보다 더 쎈 놈이 나타나면 갱신!
        if(monster_hp[i] > max_hp) {
            max_hp = monster_hp[i];
            boss_index = i;
        }
    }

    printf("보스는 %d번 칸에 있으며, 체력은 %d입니다!\n", boss_index, max_hp);
    
    return 0;
}

3. 배열의 진화: 문자열 (String)

C언어에는 '문자열'이라는 별도의 기본 자료형이 없습니다. 대신 문자(char)를 배열로 나열해서 사용하죠. 여기서 핵심은 문자열의 끝을 알리는 \0 (NULL 문자)입니다.

▲ 문자열 배열: 마지막 칸에는 항상 눈에 보이지 않는 끝맺음 문자가 들어갑니다.

💻 예제: 문자열 배열의 비밀

#include <stdio.h>

int main() {
    // "Hello"는 5글자지만, \0이 포함되어 실제 크기는 6칸입니다!
    char greeting[] = "Hello"; 

    printf("문자열 한 번에 출력: %s\n", greeting);
    printf("3번 인덱스 문자만 뽑기: %c\n", greeting[2]); // 'l' 출력
    
    return 0;
}

4. 차원을 넘어서: 2차원 배열 (Matrix)

1차원 배열이 단순한 '기차'라면, 2차원 배열은 가로(행)와 세로(열)를 가진 '표(Table)'나 '바둑판'과 같습니다. 주로 게임 맵 데이터나 성적표를 만들 때 사용합니다.

▲ 2차원 배열: (행, 열)의 순서로 좌표를 찾아갑니다.

🔥 끝판왕 예제: 2차원 성적표 관리 프로그램

2차원 배열과 중첩 for문(반복문 안의 반복문)을 결합하여 3명의 학생이 가진 3과목 점수의 평균을 구해보겠습니다.

#include <stdio.h>

int main() {
    // 3명(행)의 학생이 각각 3과목(열) 점수를 가짐
    int scores[3][3] = {
        {80, 90, 75},  // 0번 학생 (행 0)
        {95, 85, 100}, // 1번 학생 (행 1)
        {70, 60, 80}   // 2번 학생 (행 2)
    };

    for(int i = 0; i < 3; i++) {
        int total = 0; // 학생이 바뀔 때마다 총점을 0으로 초기화
        
        // 한 학생의 3과목 점수를 모두 더함
        for(int j = 0; j < 3; j++) {
            total += scores[i][j];
        }
        
        printf("%d번 학생 총점: %d, 평균: %.2f\n", i+1, total, total/3.0);
    }
    return 0;
}

💀 주의: 인덱스 탈출(Out of Bounds) 주의보!

배열을 다룰 때 가장 많이 하는 실수는 int arr[10];을 만들고 arr[10]에 접근하려 하는 것입니다. 인덱스는 무조건 0부터 9까지만 있다는 사실을 명심하세요! 허용되지 않은 구역을 침범하면 프로그램이 죽어버립니다.