C, C++ 언어

C언어 기초 8장 : 여러 선택지 중 하나, switch 문

게임플밍마스터 2025. 10. 13. 10:52

지난 장에서 우리는 if-else if-else 구조를 이용해 여러 조건 중 하나를 선택하는 방법을 배웠습니다. 학점 계산기처럼 말이죠. 이 구조는 매우 강력하지만, 만약 "메뉴 1번을 선택하면 콜라, 2번을 선택하면 사이다, 3번을 선택하면 커피..."와 같이 하나의 변수여러 개의 특정 값과 비교해야 할 때는 코드가 다소 길고 복잡해 보일 수 있습니다.

이런 상황을 위해 C언어는 switch 문이라는 아주 훌륭한 대안을 제공합니다. switch 문은 마치 여러 개의 문이 있는 복도에서, 손에 든 열쇠(변수)에 딱 맞는 문(case) 하나를 열고 들어가는 것과 같습니다.

1. switch 문은 언제 사용할까요?

if 문은 "점수가 90점 이상인가?" 와 같이 범위를 비교하거나 복잡한 논리 조건을 검사하는 데 적합합니다. 반면 switch 문은 "메뉴 번호가 정확히 1인가?", "입력한 문자가 정확히 'A' 인가?" 와 같이, 하나의 정수형 변수(또는 문자)가 특정 상수 값과 일치하는지 검사하는 데 특화되어 있습니다.

if-else if로 구현한 메뉴 선택

if (menu == 1) {
    printf("콜라를 선택했습니다.\n");
} else if (menu == 2) {
    printf("사이다를 선택했습니다.\n");
} else if (menu == 3) {
    printf("커피를 선택했습니다.\n");
} else {
    printf("잘못된 선택입니다.\n");
}

switch로 구현한 메뉴 선택

switch (menu) {
    case 1:
        printf("콜라를 선택했습니다.\n");
        break;
    case 2:
        printf("사이다를 선택했습니다.\n");
        break;
    case 3:
        printf("커피를 선택했습니다.\n");
        break;
    default:
        printf("잘못된 선택입니다.\n");
        break;
}

어떤가요? switch 문 버전이 "menu 변수의 값에 따라 분기한다"는 의도가 훨씬 명확하게 보이지 않나요?

2. switch 문의 기본 구조

switch 문은 switch, case, break, default 네 가지 키워드로 구성됩니다.

switch (비교할_변수) {
    case 값1:
        // 변수의 값이 '값1'일 때 실행될 코드
        break;
    case 값2:
        // 변수의 값이 '값2'일 때 실행될 코드
        break;
    // ... 다른 case들 ...
    default:
        // 위의 어떤 case에도 해당하지 않을 때 실행될 코드
        break;
}
  • switch (변수): 괄호 안에는 비교의 기준이 될 정수형 변수(int, char 등)를 넣습니다.
  • case 값:: 기준 변수와 비교할 값(상수)을 적고 콜론(:)을 찍습니다. 변수의 값이 case의 값과 일치하면, 해당 case 아래의 코드가 실행됩니다.
  • break;: 아주 중요합니다! 해당 case의 코드 실행을 마치고 switch 문 전체를 빠져나가라는 명령입니다.
  • default:: if문의 마지막 else와 같은 역할입니다. 위의 어떤 case에도 해당하지 않을 경우 이 부분이 실행됩니다. default는 생략할 수 있습니다.

3. break의 중요성: 의도적인 폭포수(Fall-through)

switch 문에서 break를 빼먹으면 어떻게 될까요? C언어는 해당 case의 코드를 실행한 뒤 멈추지 않고, 마치 폭포수가 떨어지듯 아래에 있는 다음 case의 코드를 break를 만날 때까지 계속 실행해 버립니다. 이를 'Fall-through'라고 합니다.

 

break를 깜빡한 코드:

int choice = 2;
switch (choice) {
    case 1:
        printf("1번을 선택하셨습니다.\n");
    case 2:
        printf("2번을 선택하셨습니다.\n"); // choice가 2이므로 여기서부터 실행
    case 3:
        printf("3번을 선택하셨습니다.\n"); // break가 없어서 계속 실행!
    default:
        printf("프로그램 종료.\n");      // break가 없어서 계속 실행!
}

실행 결과:

2번을 선택하셨습니다.
3번을 선택하셨습니다.
프로그램 종료.

 

이런 의도치 않은 버그를 막기 위해, 각 case 블록의 끝에는 항상 break;를 써주는 습관을 들여야 합니다. (물론 이 fall-through 특징을 의도적으로 사용하는 고급 기법도 있습니다.)

4. [직접 해봐요!] switch로 만드는 간단한 자판기

switch 문을 연습하기에 가장 좋은 예제인 자판기 프로그램을 만들어 봅시다.

#include <stdio.h>

int main(void) 
{
    int choice;

    printf("========= 미니 자판기 =========\n");
    printf("1. 콜라 (1000원)\n");
    printf("2. 사이다 (1000원)\n");
    printf("3. 커피 (1500원)\n");
    printf("==============================\n");
    printf("메뉴를 선택하세요: ");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
            printf("콜라가 나왔습니다.\n");
            break;
        case 2:
            printf("사이다가 나왔습니다.\n");
            break;
        case 3:
            printf("커피가 나왔습니다.\n");
            break;
        default:
            printf("잘못된 번호를 선택했습니다.\n");
            break;
    }
    return 0;
}

이제 이 프로그램을 실행하고 1, 2, 3, 그리고 다른 숫자를 입력했을 때 각각 어떻게 동작하는지 확인해 보세요.

 

5. [도전! 프로그래밍] 월별 날짜 수 알려주기

switch 문과 fall-through의 특징을 활용하여, 사용자에게 월(1~12)을 입력받아 해당 월의 날짜 수를 알려주는 프로그램을 만들어 보세요. (단, 윤년은 무시하고 2월은 28일로 고정합니다.)

힌트: 31일까지 있는 달(1, 3, 5, 7, 8, 10, 12월)은 하나의 그룹으로, 30일까지 있는 달(4, 6, 9, 11월)은 또 다른 그룹으로 묶을 수 있습니다. break 없는 fall-through를 의도적으로 사용해 보세요!

/* 힌트 코드 구조
switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        printf("31일까지 있습니다.\n");
        break;
    case 4:
    case 6:
    // ... 이어서 작성해보세요
}
*/

이번 장 정리

  • switch 문은 하나의 변수를 여러 개의 특정 상수 값과 비교할 때 if-else if보다 유용하고 가독성이 좋습니다.
  • case 는 비교할 값을, default 는 그 외 모든 경우를 처리합니다.
  • break 는 각 case의 실행을 끝내고 switch 문을 탈출하는 필수적인 역할을 합니다. break가 없으면 다음 case로 실행이 이어지는 'fall-through' 가 발생합니다.

지금까지 우리는 ifswitch를 통해 프로그램의 흐름을 '선택'하고 '분기'하는 법을 배웠습니다. 하지만 프로그래밍의 진정한 힘은 '반복'에서 나옵니다. 다음 장부터는 지루하고 반복적인 작업을 컴퓨터에게 수백, 수천 번 시킬 수 있는 강력한 도구, '반복문'의 세계로 들어가 보겠습니다.