icon안동민 개발노트

조건문 switch


switch 문 개요

 switch 문은 여러 가지 경우 중 하나를 선택하여 실행하는 제어 구조입니다. 주로 하나의 변수나 표현식의 값에 따라 여러 가지 경우를 처리할 때 사용합니다. if-else 문의 연속보다 가독성이 좋고, 컴파일러 최적화에 유리할 수 있습니다.

switch 문의 기본 구조

switch (표현식) {
    case 상수1:
        // 표현식이 상수1과 일치할 때 실행되는 코드
        break;
    case 상수2:
        // 표현식이 상수2와 일치할 때 실행되는 코드
        break;
    // ...
    default:
        // 어떤 case와도 일치하지 않을 때 실행되는 코드
}

switch 문의 특징

  1. 표현식은 정수형 int, char 등 또는 열거형이어야 합니다.
  2. case 라벨은 컴파일 시점에 결정되는 상수여야 합니다.
  3. break 문을 만나면 switch 문을 빠져나갑니다.
  4. default 라벨은 선택사항이며, 어떤 case와도 일치하지 않을 때 실행됩니다.

switch 문 예제

 기본 예제 : 요일 출력

#include <iostream>
 
int main() {
    int day = 3;
    
    switch (day) {
        case 1:
            std::cout << "Monday" << std::endl;
            break;
        case 2:
            std::cout << "Tuesday" << std::endl;
            break;
        case 3:
            std::cout << "Wednesday" << std::endl;
            break;
        case 4:
            std::cout << "Thursday" << std::endl;
            break;
        case 5:
            std::cout << "Friday" << std::endl;
            break;
        case 6:
            std::cout << "Saturday" << std::endl;
            break;
        case 7:
            std::cout << "Sunday" << std::endl;
            break;
        default:
            std::cout << "Invalid day" << std::endl;
    }
    
    return 0;
}

 이 예제에서는 "Wednesday"가 출력됩니다.

break 문의 중요성

 break 문을 생략하면 "fall through" 현상이 발생합니다. 이는 다음 case의 코드도 실행되는 현상입니다.

#include <iostream>
 
int main() {
    int x = 2;
    
    switch (x) {
        case 1:
            std::cout << "One" << std::endl;
        case 2:
            std::cout << "Two" << std::endl;
        case 3:
            std::cout << "Three" << std::endl;
        default:
            std::cout << "Default" << std::endl;
    }
    
    return 0;
}

 이 예제에서는 "Two", "Three", "Default"가 모두 출력됩니다.

의도적인 fall through

 때로는 의도적으로 fall through를 사용할 수 있습니다. 이 경우 주석으로 명시하는 것이 좋습니다.

#include <iostream>
 
int main() {
    char grade = 'B';
    
    switch (grade) {
        case 'A':
        case 'B':
        case 'C':
            std::cout << "Pass" << std::endl;
            break;
        case 'D':
        case 'F':
            std::cout << "Fail" << std::endl;
            break;
        default:
            std::cout << "Invalid grade" << std::endl;
    }
    
    return 0;
}

 이 예제에서는 "Pass"가 출력됩니다.

switch 문 vs if-else 문

  1. 가독성 : 많은 경우의 수를 처리할 때 switch 문이 더 가독성이 좋습니다.
  2. 성능 : switch 문은 컴파일러 최적화에 더 유리할 수 있습니다.
  3. 유연성 : if-else 문은 범위 비교나 불연속적인 값을 처리할 때 더 유용합니다.

C++ 17의 switch 문 초기화

 C++ 17부터는 switch 문에서도 초기화 구문을 사용할 수 있습니다.

#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main() {
    std::srand(std::time(nullptr));  // 난수 생성기 초기화
 
    switch (int x = std::rand() % 10; x) {
        case 0:
            std::cout << "Zero" << std::endl;
            break;
        case 1:
        case 2:
        case 3:
            std::cout << "Low (" << x << ")" << std::endl;
            break;
        case 4:
        case 5:
        case 6:
            std::cout << "Medium (" << x << ")" << std::endl;
            break;
        default:
            std::cout << "High (" << x << ")" << std::endl;
    }
    
    return 0;
}

주의사항

  1. case 라벨에는 변수나 범위 지정을 사용할 수 없습니다.
  2. switch 문 내에서 변수를 선언할 때는 중괄호로 블록을 만들어야 합니다.
  3. 열거형을 사용할 때는 모든 case를 처리하거나, default를 사용하는 것이 좋습니다.
  4. break를 빼먹지 않도록 주의해야 합니다. 의도적인 fall through는 주석으로 표시하세요.

연습 문제

  1. 간단한 계산기 프로그램을 작성하세요. 사용자로부터 두 개의 숫자와 연산자 +, -, *, / 를 입력받아 결과를 출력하는 프로그램을 switch 문을 사용하여 구현하세요.
  2. 월 번호를 입력받아 해당 월의 일수를 출력하는 프로그램을 작성하세요. (윤년은 고려하지 않아도 됩니다)
  3. 학점을 입력받아 등급(A : Excellent, B : Good, C : Average, D : Poor, F : Fail)을 출력하는 프로그램을 작성하세요.
  4. 1부터 5까지의 숫자를 입력받아 해당하는 로마 숫자를 출력하는 프로그램을 작성하세요. (I, II, III, IV, V)
  5. 열거형을 사용하여 요일을 나타내고, switch 문을 사용하여 평일인지 주말인지 출력하는 프로그램을 작성하세요.


참고 자료