본문 바로가기

조건문 switch

switch가 정수·열거형 조건과 case 레이블을 선택하는 흐름을 익히고 break·fall-through 및 if문과의 선택 기준을 이해합니다.

메뉴 번호나 요일처럼 하나의 값을 여러 상수와 차례로 비교해야 할 때, else if 체인으로 쓰면 choice == 1, choice == 2처럼 같은 변수의 비교가 줄마다 반복됩니다. switch 문은 이런 경우에 값을 한 번 계산하고, 그 값과 같은 상수 레이블로 실행 위치를 옮깁니다.

이 글은 switch가 받을 수 있는 조건과 case 레이블의 규칙, break가 없을 때 다음 레이블로 이어지는 fall-through, C++17의 [[fallthrough]] 속성, 열거형과 함께 쓸 때의 컴파일러 경고, 그리고 if 체인과 switch 중 무엇을 고를지를 다룹니다.

C++ switch 조건의 허용 타입과 정수 승격, case의 변환된 상수식 및 중복 금지, 한 번의 조건 평가와 default 선택, if 문을 선택할 조건을 비교하는 표

ONE VALUE · CONSTANT LABELS

switch는 하나의 값을 상수 레이블과 맞춘다

switch는 임의의 Boolean 조건 목록이 아닙니다. 조건을 평가하고 필요한 변환·승격을 거친 하나의 값을 같은 타입으로 변환 가능한 case 상수들과 맞춥니다.

switch를 성립시키는 네 계약
# 검사 지점 C++ 계약 선택 기준
1 조건 타입 정수형·열거형, 또는 그 타입으로 문맥상 암시적 변환 가능한 클래스 타입입니다. 적용 대상이면 정수 승격 뒤의 타입이 기준이 됩니다. char, 작은 정수, bool, 열거형은 가능하지만 실수와 std::string은 직접 사용할 수 없습니다.
2 case 값 조정된 조건 타입의 변환된 상수식이어야 하며, 변환 뒤 같은 값을 갖는 레이블을 둘 이상 둘 수 없습니다. 런타임 변수, 범위식, 동일 값으로 변환되는 별칭 레이블은 사용할 수 없습니다.
3 선택 조건은 switch 진입마다 한 번 평가됩니다. 값이 맞는 case가 시작점이고, 없으면 default, 그것도 없으면 본문을 건너뜁니다. default는 선택 사항이며 한 개만 둘 수 있습니다.
4 if가 맞는 경우 범위, 실수·문자열 비교, 여러 값의 논리 조합처럼 각 분기가 서로 다른 조건식을 요구할 때입니다. 문법만으로 성능 우위를 단정하지 말고 조건의 모양과 읽기 쉬운 구조를 기준으로 고릅니다.
1 · 조건 값
정수형·열거형 또는 그 타입으로 문맥상 변환 가능한 클래스 타입만 허용됩니다. 필요한 정수 승격 뒤 타입이 비교 기준입니다. 실수·std::string은 직접 사용할 수 없습니다.
2 · case 상수
조정된 조건 타입의 변환된 상수식이어야 하며, 변환 결과가 같은 레이블은 중복입니다. 런타임 변수와 범위식은 사용할 수 없습니다.
3 · 한 번 평가하고 선택
일치한 case, 없으면 default, 둘 다 없으면 본문 밖으로 진행합니다. default는 선택 사항이며 최대 하나입니다.
4 · 범위·문자열·복합 논리
서로 다른 조건식을 조합해야 하면 if 체인이 자연스럽습니다. 성능은 측정과 구현에 달려 있습니다.
switch의 강점은 하나의 값과 고정 레이블 목록이라는 의도를 드러내는 데 있습니다. 컴파일러는 switch와 if 모두를 다양한 방식으로 최적화할 수 있습니다.

switch의 형식과 조건

switch는 괄호 안의 조건을 평가한 값과 같은 case 레이블을 찾아 그 뒤의 문장부터 실행합니다. 같은 레이블이 없으면 default 레이블로 가고, default도 없으면 본문 전체를 건너뜁니다.

switch 문 형식
switch (조건) {
case 상수1:
    // 조건의 값이 상수1일 때 여기서 시작
    break;
case 상수2:
    // 조건의 값이 상수2일 때 여기서 시작
    break;
default:
    // 어떤 case와도 같지 않을 때 여기서 시작
    break;
}

위 그림의 첫 줄처럼 조건은 정수형이나 열거형이어야 하며, 그런 타입으로 문맥상 변환되는 클래스 타입도 쓸 수 있습니다. char나 short, bool 같은 작은 정수 타입은 정수 승격을 거친 타입이 비교 기준이 됩니다. double 같은 실수와 std::string은 조건으로 쓸 수 없으므로, 그런 값으로 분기하려면 if 체인을 씁니다.

case 뒤에는 컴파일할 때 값이 정해지는 상수식이 와야 하며, 그 값은 조건의 타입으로 변환됩니다. 리터럴이나 constexpr 변수는 쓸 수 있지만 실행 중에 정해지는 변수는 쓸 수 없고, 변환한 값이 같은 레이블이 둘 있으면 컴파일 오류입니다. 조건은 switch에 들어올 때 한 번만 평가되며, default는 많아야 하나이고 위치는 자유지만 보통 맨 끝에 둡니다.

메뉴 고르기

다음 예는 표준 입력에서 메뉴 번호를 읽어 해당하는 동작을 출력합니다. switch는 이미 읽은 정수를 레이블과 비교할 뿐, 입력이 정수인지 검사하지 않으므로 읽기에 성공했는지는 그 앞에서 확인합니다.

menu_switch.cpp
#include <iostream>

int main() {
    int choice{};
    if (!(std::cin >> choice)) {
        std::cerr << "not an integer\n";
        return 1;
    }

    switch (choice) {
    case 1:
        std::cout << "read\n";
        break;
    case 2:
        std::cout << "save\n";
        break;
    case 3:
        std::cout << "quit\n";
        break;
    default:
        std::cout << "unknown menu\n";
        break;
    }
    std::cout << "done\n";
}

입력이 2이면 case 2에서 시작해 save를 출력하고, break로 switch를 빠져나와 done을 출력합니다. 입력 7은 정수로 읽히지만 같은 레이블이 없어 default의 unknown menu와 done을 출력합니다. 입력 abc는 읽기에 실패하므로 switch에 들어가지 않고 오류 메시지를 낸 뒤 종료 상태 1로 끝납니다. std::cerr는 오류 메시지를 내보내는 표준 오류 스트림으로, 기본으로는 std::cout과 같은 콘솔에 나타나지만 일반 출력과는 다른 통로여서 일반 출력만 파일로 보내도 오류 메시지는 화면에 남습니다. 표준 스트림의 종류는 스트림과 파일 입출력 개요에서 다시 봅니다.

save
done

위 출력은 입력이 2일 때입니다. std::cin >> choice는 앞에서부터 정수로 읽을 수 있는 부분만 꺼내므로 2abc를 입력해도 2를 읽습니다. 한 줄 전체가 정수인지 검사하려면 줄 단위로 읽어 따로 확인해야 하며, 잘못된 입력을 다시 받는 반복은 while과 do-while 반복문에서 다룹니다.

case는 시작 위치일 뿐입니다

case와 default는 블록이 아니라 레이블(label)입니다. 레이블은 실행을 시작할 위치를 표시할 뿐 실행을 멈추지 않으므로, break가 없으면 다음 레이블 아래의 문장까지 차례로 실행됩니다. 이것을 fall-through라고 합니다.

fallthrough.cpp
#include <iostream>

int main() {
    char grade{'B'};

    switch (grade) {
    case 'A':
        std::cout << "Excellent!\n";
    case 'B':
        std::cout << "Great!\n";
    case 'C':
        std::cout << "Good job.\n";
        break;
    default:
        std::cout << "Try again.\n";
        break;
    }
}
Great!
Good job.

아래 그림처럼 grade가 'B'이므로 case 'B'에서 시작해 B의 문장을 실행합니다. B 아래에 break가 없어서 case 'C' 아래의 문장도 이어서 실행하고, 그 뒤의 break에서 switch를 끝냅니다. C로 넘어갈 때 grade를 다시 비교하지 않으며, A와 default의 문장은 이 입력에서 실행되지 않습니다. 그림은 두 출력을 우리말 문장으로 나타냈고, 예제는 Windows 콘솔의 인코딩 차이를 피하려고 같은 뜻의 영어 문장을 출력합니다.

case는 실행 시작 레이블이고 종료 지점은 별도다

grade=B인 사례에서는 B에서 출력한 뒤 C로 fallthrough하고 두 번째 출력 후 break한다. C의 조건을 다시 평가하는 것으로 표시하지 않는다.

switch 조건 평가와 case 또는 default 진입, 레이블을 가로지르는 순차 실행, break 종료, 연속 case 공유와 C++17 fallthrough 속성을 단계별로 설명하는 흐름도

SELECT ENTRY · THEN EXECUTE

case는 진입점이며 자동으로 실행을 멈추지 않는다

case와 default는 독립된 블록이나 자동 정지선이 아니라 레이블입니다. 시작점을 고른 뒤에는 점프문을 만나거나 switch 본문이 끝날 때까지 문장이 순서대로 실행됩니다.

grade='B'에서 선택 후 C 문장까지 이어지는 경로다섯 노드와 네 간선으로 조건을 한 번 평가해 B에 진입하고 B 문장을 실행한다. B 아래 break가 없어 C 문장도 순차 실행한 뒤 break에서 switch를 끝낸다. C에 들어갈 때 grade를 다시 평가하거나 C가 다시 일치했는지 검사하지 않는다. A와 default의 문장은 이 입력에서 실행하지 않는다.
조건 평가grade = 'B'
연결 관계조건 평가 · grade = 'B' → B 레이블 진입 · 일치한 시작점
B 레이블 진입일치한 시작점
연결 관계B 레이블 진입 · 일치한 시작점 → B 문장 실행 · 훌륭합니다!
B 문장 실행훌륭합니다!
연결 관계B 문장 실행 · 훌륭합니다! → C 문장 실행 · 잘 했습니다.
C 문장 실행잘 했습니다.
연결 관계C 문장 실행 · 잘 했습니다. → break로 종료 · switch 다음 문장
break로 종료switch 다음 문장
  1. 조건을 한 번 평가하고 조정된 값으로 만든다

    switch (grade) 진입 시 조건을 평가하고 필요한 변환·정수 승격을 적용합니다.

  2. 일치한 레이블을 실행 시작점으로 고른다

    같은 값의 case가 있으면 그 뒤 문장으로 이동합니다. 없으면 default, 그것도 없으면 본문을 실행하지 않습니다.

  3. 다음 레이블도 가로질러 순서대로 실행한다

    레이블 자체는 흐름을 멈추지 않습니다. grade가 'B'라서 그 레이블에서 시작하고 break가 없다면 case 'C' 아래 문장도 실행됩니다.

  4. 종료 또는 의도한 이어짐을 코드에 표시한다

    break는 자신을 둘러싼 가장 안쪽 반복문 또는 switch를 빠져나갑니다. 다음 레이블로 일부러 이어갈 때는 C++17의 [[fallthrough]];로 의도를 표시할 수 있습니다.

본문 예시 · grade = 'B'

case 'B' → “훌륭합니다!” → case 'C' → “잘 했습니다.” → break

처음 선택되지 않은 C 레이블도 B 아래에 종료 문장이 없으므로 지나갑니다. A와 default의 문장은 실행하지 않습니다.

여러 레이블이 한 본문을 공유

case 1: 다음에 문장 없이 case 3:을 두면 두 레이블이 같은 문장을 시작점으로 공유합니다. 실행한 문장에서 다음 레이블로 떨어지는 것과 구분합니다.

default도 같은 레이블 규칙

소스 어디에 둘 수 있지만 자동 종료되지 않습니다. 마지막이 아니라면 이후 레이블로 이어질 수 있으므로 종료 정책을 함께 읽어야 합니다.

break만이 유일한 종료 수단은 아닙니다. return이나 예외 등 다른 제어 이전도 흐름을 바꿀 수 있으므로 각 레이블에서 실제 도달 경로를 확인합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
B로 진입

switch에서 grade=B에 해당하는 case를 찾는다.

  • grade: B
  • 현재: case B
  • 처음 한 번의 case 선택으로 실행 위치가 결정된다.
fallthrough

B의 출력 뒤 break가 없어 C 코드로 이어진다.

  • 출력: B 다음 C
  • case C 조건: 다시 평가하지 않음
  • fallthrough는 다음 case의 코드 위치로 제어가 이어지는 현상이다.
break 종료

C의 출력 뒤 switch를 벗어난다.

  • 현재: switch 다음
  • 출력 횟수: 두 번
  • break가 추가 case 실행을 중단한다.

case는 실행 시작 레이블이고 종료 지점은 별도다

grade=B인 사례에서는 B에서 출력한 뒤 C로 fallthrough하고 두 번째 출력 후 break한다. C의 조건을 다시 평가하는 것으로 표시하지 않는다.

switch 조건 평가와 case 또는 default 진입, 레이블을 가로지르는 순차 실행, break 종료, 연속 case 공유와 C++17 fallthrough 속성을 단계별로 설명하는 흐름도

SELECT ENTRY · THEN EXECUTE

case는 진입점이며 자동으로 실행을 멈추지 않는다

case와 default는 독립된 블록이나 자동 정지선이 아니라 레이블입니다. 시작점을 고른 뒤에는 점프문을 만나거나 switch 본문이 끝날 때까지 문장이 순서대로 실행됩니다.

grade='B'에서 선택 후 C 문장까지 이어지는 경로다섯 노드와 네 간선으로 조건을 한 번 평가해 B에 진입하고 B 문장을 실행한다. B 아래 break가 없어 C 문장도 순차 실행한 뒤 break에서 switch를 끝낸다. C에 들어갈 때 grade를 다시 평가하거나 C가 다시 일치했는지 검사하지 않는다. A와 default의 문장은 이 입력에서 실행하지 않는다.
조건 평가grade = 'B'
연결 관계조건 평가 · grade = 'B' → B 레이블 진입 · 일치한 시작점
B 레이블 진입일치한 시작점
연결 관계B 레이블 진입 · 일치한 시작점 → B 문장 실행 · 훌륭합니다!
B 문장 실행훌륭합니다!
연결 관계B 문장 실행 · 훌륭합니다! → C 문장 실행 · 잘 했습니다.
C 문장 실행잘 했습니다.
연결 관계C 문장 실행 · 잘 했습니다. → break로 종료 · switch 다음 문장
break로 종료switch 다음 문장
  1. 조건을 한 번 평가하고 조정된 값으로 만든다

    switch (grade) 진입 시 조건을 평가하고 필요한 변환·정수 승격을 적용합니다.

  2. 일치한 레이블을 실행 시작점으로 고른다

    같은 값의 case가 있으면 그 뒤 문장으로 이동합니다. 없으면 default, 그것도 없으면 본문을 실행하지 않습니다.

  3. 다음 레이블도 가로질러 순서대로 실행한다

    레이블 자체는 흐름을 멈추지 않습니다. grade가 'B'라서 그 레이블에서 시작하고 break가 없다면 case 'C' 아래 문장도 실행됩니다.

  4. 종료 또는 의도한 이어짐을 코드에 표시한다

    break는 자신을 둘러싼 가장 안쪽 반복문 또는 switch를 빠져나갑니다. 다음 레이블로 일부러 이어갈 때는 C++17의 [[fallthrough]];로 의도를 표시할 수 있습니다.

본문 예시 · grade = 'B'

case 'B' → “훌륭합니다!” → case 'C' → “잘 했습니다.” → break

처음 선택되지 않은 C 레이블도 B 아래에 종료 문장이 없으므로 지나갑니다. A와 default의 문장은 실행하지 않습니다.

여러 레이블이 한 본문을 공유

case 1: 다음에 문장 없이 case 3:을 두면 두 레이블이 같은 문장을 시작점으로 공유합니다. 실행한 문장에서 다음 레이블로 떨어지는 것과 구분합니다.

default도 같은 레이블 규칙

소스 어디에 둘 수 있지만 자동 종료되지 않습니다. 마지막이 아니라면 이후 레이블로 이어질 수 있으므로 종료 정책을 함께 읽어야 합니다.

break만이 유일한 종료 수단은 아닙니다. return이나 예외 등 다른 제어 이전도 흐름을 바꿀 수 있으므로 각 레이블에서 실제 도달 경로를 확인합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
B로 진입

switch에서 grade=B에 해당하는 case를 찾는다.

  • grade: B
  • 현재: case B
  • 처음 한 번의 case 선택으로 실행 위치가 결정된다.
fallthrough

B의 출력 뒤 break가 없어 C 코드로 이어진다.

  • 출력: B 다음 C
  • case C 조건: 다시 평가하지 않음
  • fallthrough는 다음 case의 코드 위치로 제어가 이어지는 현상이다.
break 종료

C의 출력 뒤 switch를 벗어난다.

  • 현재: switch 다음
  • 출력 횟수: 두 번
  • break가 추가 case 실행을 중단한다.

break는 자신을 둘러싼 가장 안쪽의 switch나 반복문을 끝냅니다. return처럼 함수를 끝내는 문장도 fall-through를 막으므로, 각 레이블의 문장이 어디서 끝나는지 코드에 분명히 드러나게 합니다.

여러 case가 본문을 함께 쓰기

레이블 사이에 문장이 없으면 여러 레이블이 같은 문장을 시작점으로 공유합니다. 다음 예는 달마다 일수를 출력하며, 2월은 윤년을 따지지 않았습니다.

month_days.cpp
#include <iostream>

int main() {
    int month{4};

    switch (month) {
    case 1: case 3: case 5: case 7:
    case 8: case 10: case 12:
        std::cout << month << ": 31 days\n";
        break;
    case 4: case 6: case 9: case 11:
        std::cout << month << ": 30 days\n";
        break;
    case 2:
        std::cout << month << ": 28 or 29 days\n";
        break;
    default:
        std::cout << month << ": invalid month\n";
        break;
    }
}
4: 30 days

month가 4이면 case 4에서 시작하는데, 그 뒤에 문장 없이 case 6, case 9, case 11이 이어지고 바로 30일 출력문이 나옵니다. 이처럼 레이블만 연달아 둔 것은 문장을 실행한 뒤 다음 레이블로 넘어가는 fall-through와 달리 실수로 오해받을 일이 없으므로, 따로 표시하지 않아도 됩니다.

[[fallthrough]]로 의도 밝히기

문장을 실행한 뒤 다음 레이블로 일부러 이어 가야 할 때도 있습니다. C++17부터는 그 자리에 [[fallthrough]];를 써서 의도한 흐름이라는 것을 컴파일러와 읽는 사람에게 알립니다. 이 속성은 빈 문장에 붙으며, 바로 다음에 같은 switch의 case나 default 레이블이 와야 합니다.

fallthrough_attribute.cpp
switch (grade) {
case 'A':
    std::cout << "Excellent!\n";
    [[fallthrough]];
case 'B':
    std::cout << "Great!\n";
    break;
default:
    std::cout << "Try again.\n";
    break;
}

grade가 'A'이면 Excellent!와 Great!를 출력하고, 'B'이면 Great!만 출력합니다. GCC는 -Wextra에 포함된 -Wimplicit-fallthrough로 표시 없는 fall-through를 경고하고, [[fallthrough]];가 있는 자리는 경고하지 않습니다. 그래서 경고를 켜 두면 break를 빠뜨린 실수와 의도한 이어짐을 구별할 수 있습니다.

열거형과 switch

상수와 리터럴에서 본 열거형은 switch와 잘 어울립니다. 열거자 이름이 레이블이 되어, 숫자보다 각 분기의 뜻이 잘 드러납니다.

enum_switch.cpp
#include <iostream>

enum class Light { Red, Yellow, Green };

int main() {
    Light light{Light::Yellow};

    switch (light) {
    case Light::Red:
        std::cout << "stop\n";
        break;
    case Light::Yellow:
        std::cout << "slow down\n";
        break;
    case Light::Green:
        std::cout << "go\n";
        break;
    }
}
slow down

이 switch에는 default가 없습니다. 나중에 Light에 열거자를 추가하고 case를 빠뜨리면, GCC는 -Wall에 포함된 -Wswitch로 처리하지 않은 열거자를 경고합니다. default를 두면 이 경고가 나오지 않으므로, 열거자를 모두 다뤄야 하는 switch에는 일부러 default를 빼고 경고에 기대는 방법도 있습니다. 다만 정수를 열거형으로 바꾼 값처럼 열거자 밖의 값이 들어올 수 있다면, 그 경우를 어디서 처리할지 따로 정해야 합니다.

case 안에서 변수 선언하기

switch 본문은 하나의 블록이어서, 한 레이블 아래에서 선언한 변수의 범위가 다음 레이블까지 이어집니다. 그런데 다른 case로 들어가면 그 선언의 초기화를 건너뛰게 되므로, 초기화가 있는 선언을 건너뛰는 점프는 컴파일 오류입니다.

case_scope.cpp
switch (choice) {
case 1: {
    int count{10};
    std::cout << count << '\n';
    break;
}
case 2:
    std::cout << "two\n";
    break;
}

case 1 아래의 문장을 중괄호로 감싸면 count의 범위가 그 블록으로 좁아져, case 2로 들어갈 때 건너뛰는 선언이 없어집니다. 중괄호 없이 int count{10};을 두면, GCC는 case 2 레이블로의 점프가 초기화를 건너뛴다는 오류를 냅니다. case 안에서 변수가 필요하면 이처럼 블록을 만들어 둡니다.

if 체인과 switch 중 고르기

두 문장은 모두 여러 경우를 나누지만, 잘 맞는 조건의 모양이 다릅니다.

조건의 모양알맞은 문장
정수나 열거형 값 하나가 여러 상수 중 무엇과 같은지switch
범위 비교 score >= 80 && score < 90if 체인
실수, 문자열 비교if 체인
분기마다 다른 변수나 논리 조합을 검사if 체인

switch가 if 체인보다 빠르다는 보장은 언어에 없습니다. 컴파일러는 두 문장 모두 점프 테이블이나 비교의 연속 등으로 최적화할 수 있으므로, 조건의 모양과 읽기 쉬운 구조를 먼저 기준으로 삼고 성능이 중요한 곳은 실제 빌드로 측정합니다.

정리

  • switch는 조건을 한 번 평가해 같은 값의 case에서, 없으면 default에서 실행을 시작하고, 둘 다 없으면 본문을 건너뜁니다.
  • 조건은 정수형이나 열거형이어야 하며, case에는 서로 다른 값의 상수식만 올 수 있습니다. 실수와 문자열은 if 체인으로 분기합니다.
  • case는 시작 위치일 뿐이어서 break가 없으면 다음 레이블의 문장까지 이어서 실행합니다.
  • 의도한 fall-through에는 C++17의 [[fallthrough]];를 쓰고, GCC의 -Wimplicit-fallthrough로 빠뜨린 break를 찾습니다.
  • 열거형의 switch에서 default를 빼면 -Wswitch가 처리하지 않은 열거자를 알려 줍니다.
  • case 안에서 초기화가 있는 변수를 선언하려면 중괄호로 블록을 만듭니다.

연습 문제

1. break 하나 추가하기

fallthrough.cpp에서 Great!를 출력하는 문장 다음에만 break;를 추가하면 출력은 어떻게 되나요? grade가 'A'일 때는 어떻게 되나요?

해설 보기

'B'이면 Great! 한 줄만 출력합니다. 레이블 B가 시작 위치를 정하고, 새로 넣은 break가 C의 문장에 닿기 전에 switch를 끝내기 때문입니다. 'A'이면 A 아래에는 여전히 break가 없어서 Excellent!와 Great!를 출력한 뒤 새 break에서 끝납니다.

2. 레이블과 맞지 않는 값

fallthrough.cpp를 원래대로 두고 grade를 'D'로 바꾸면 무엇이 출력되나요? default를 지우면 어떻게 되나요?

해설 보기

'D'와 같은 case가 없으므로 default에서 시작해 Try again.을 출력합니다. default를 지우면 시작할 레이블이 없어 본문 전체를 건너뛰고, 아무것도 출력하지 않습니다.

3. 입력 실패와 default

menu_switch.cpp에서 abc를 입력하면 왜 unknown menu가 출력되지 않나요?

해설 보기

abc는 정수로 읽을 수 없어 std::cin >> choice가 실패하고, 앞의 if가 오류를 출력한 뒤 return 1로 main을 끝냅니다. switch에 들어가지 않았으므로 어떤 case도, default도 실행되지 않습니다. default는 정수를 읽었지만 메뉴에 없는 값일 때의 경로이고, 입력 실패와는 다른 상황입니다.

다음 글 for 반복문에서는 같은 문장을 정해진 횟수만큼, 또는 조건이 참인 동안 되풀이하는 for 문을 다룹니다.