C++제어 흐름

switch와 case scope

C++ `switch`에서 `case`, `break`, fallthrough, 지역 변수 scope를 함께 이해하는 기본 규칙을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

cpp
switch (mode) {
    case 0:
        std::cout << "off\n";
        break;
    case 1: {
        int level = 3;
        std::cout << level << "\n";
        break;
    }
    default:
        std::cout << "unknown\n";
        break;
}

설명

  • switch는 하나의 정수 계열 값이나 enum 값을 여러 상수 경우로 나눌 때 적합한 분기 구조입니다.
  • C++에서도 break를 쓰지 않으면 다음 case로 이어지는 fallthrough가 일어나므로, 의도 여부를 항상 명확히 해야 합니다.
  • case 안에서 지역 변수를 선언할 때는 scope를 중괄호로 분리하는 편이 안전합니다. 그렇지 않으면 초기화를 건너뛴 점프 문제와 엮여 컴파일 오류나 혼란을 만들 수 있습니다.
  • 여러 case를 한 동작으로 묶을 때는 fallthrough를 의도적으로 활용할 수 있지만, 이때도 읽는 사람이 실수로 오해하지 않도록 구조를 분명히 하는 편이 좋습니다.
  • enum class와 같이 쓰면 상태 분기가 더 읽기 쉬워지고, 잘못된 정수값 혼입도 줄어듭니다.

짧은 예제

cpp
#include <iostream>

enum class Command {
    save,
    load,
    exit_program
};

int main() {
    Command cmd = Command::load;

    switch (cmd) {
        case Command::save:
            std::cout << "save\n";
            break;
        case Command::load:
            std::cout << "load\n";
            break;
        case Command::exit_program:
            std::cout << "exit\n";
            break;
    }
}

빠른 정리

항목설명
switch (expr)하나의 값을 기준으로 여러 분기 수행
case value:특정 상수 값일 때의 실행 지점
break현재 switch를 빠져나감
fallthroughbreak 없이 다음 case까지 이어짐
case scope지역 변수 선언이 있으면 {}로 묶는 편이 안전

주의할 점

case 안에서 지역 변수를 선언했는데 중괄호로 scope를 묶지 않으면, 다른 case에서 그 선언 지점을 건너뛰는 흐름 때문에 코드가 의도보다 복잡해지고 오류가 나기 쉽습니다.