숏컷 코드
switch (mode) {
case 0:
std::cout << "off\n";
break;
case 1: { // 지역 변수 있으면 {} 필수
int level = compute();
std::cout << level << "\n";
break;
}
[[fallthrough]]; // C++17: 의도적 fallthrough 표시
default:
std::cout << "unknown\n";
break;
}문법
switch가 if-else보다 빠른 이유 — 점프 테이블
컴파일러는 연속된 상수 case를 점프 테이블(jump table) 로 최적화합니다. 조건 수에 무관하게 O(1)에 해당 case로 직접 점프합니다. if-else if 체인은 위에서 순차적으로 비교하므로 O(n)입니다.
// 값이 촘촘한 상수일 때 switch가 빠름
switch (command) { // 0~100 중 하나 — 점프 테이블
case 0: ... break;
case 1: ... break;
// ...
case 100: ... break;
}fallthrough — 의도와 실수 구분
break가 없으면 다음 case로 흐릅니다(fallthrough). 실수인 경우가 많지만 의도적으로 쓸 때도 있습니다. C++17의 [[fallthrough]] 속성으로 의도를 명시하면 컴파일러 경고를 억제하고 독자에게도 표시됩니다.
// 의도적 fallthrough — 여러 case에 같은 동작
switch (c) {
case 'a': case 'e': case 'i': case 'o': case 'u':
std::cout << "vowel\n";
break;
case ' ': case '\t': case '\n':
[[fallthrough]]; // C++17: 다음 case로 의도적 이동
default:
std::cout << "other\n";
break;
}case 안의 지역 변수 — 반드시 로 묶기
switch 전체는 하나의 스코프입니다. case 안에서 변수를 선언하고 {}로 묶지 않으면 다른 case에서 그 선언을 건너뛰는 점프가 생겨 컴파일 오류가 납니다.
switch (x) {
case 1:
int n = 10; // ❌ 컴파일 오류 가능 — 다른 case가 선언을 건너뜀
break;
case 2:
std::cout << n; // n이 초기화됐는지 알 수 없음
break;
}
// ✅ {}로 스코프 분리
switch (x) {
case 1: {
int n = 10;
std::cout << n;
break;
}
case 2: {
int n = 20; // 별도 스코프, 충돌 없음
std::cout << n;
break;
}
}enum class + switch — 누락 case 감지
enum class와 switch를 함께 쓰면 컴파일러가 처리되지 않은 열거값에 대해 경고를 줍니다.
enum class Dir { North, South, East, West };
std::string name(Dir d) {
switch (d) {
case Dir::North: return "N";
case Dir::South: return "S";
case Dir::East: return "E";
// ❌ West 누락 — 컴파일러 경고 (-Wswitch)
}
return "?";
}체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 촘촘한 정수/enum 값 분기 | switch (점프 테이블 최적화) |
| 범위 비교, 복합 조건 | if-else if |
| 의도적 fallthrough | [[fallthrough]] (C++17) |
| case 안 지역 변수 | case X: { ... break; } |
| 누락 case 감지 | enum class + -Wswitch |
주의할 점
break를 빠뜨리면 다음 case로 흘러 예측 불가능한 동작이 발생합니다.
switch (grade) {
case 'A':
bonus = 100;
// ❌ break 누락 — B 케이스까지 실행됨
case 'B':
bonus = 50;
break;
}
// grade == 'A'여도 bonus = 50이 됨
// ✅ 각 case에 break 명시
switch (grade) {
case 'A': bonus = 100; break;
case 'B': bonus = 50; break;
default: bonus = 0; break;
}참고 링크
1 sources