C++의 switch 문

Suraj P 2023년10월12일
  1. C++의 switch-case
  2. C++에서 대소문자 전환 사용의 규칙 및 속성
  3. C++의 switch 문과 if-else 문의 차이점
C++의 switch 문

이 기사에서는 C++의 switch 문과 그 특수 속성에 대해 알아봅니다.

C++의 switch-case

switch-case는 값을 기준으로 표현식을 평가하고 case 문에 있는 상수 값 목록에 대해 테스트하여 다른 cases를 기반으로 다른 작업을 수행합니다.

if-else와 마찬가지로 switch 문은 프로그램의 일반 흐름을 변경할 수 있기 때문에 제어 흐름 명령문입니다. 표현식이나 변수가 다중 분기를 통해 흐름을 제어할 수 있기 때문입니다.

통사론:

switch(variable / expression)
{
case constant-expression 1:
  statements;

case constant-expression 2:
  statements;
}

예제 코드:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";

    case 2:
      cout << "Tuesday\n";

    case 3:
      cout << "Wednesday\n";

    case 4:
      cout << "Thursday\n";

    case 5:
      cout << "Friday\n";

    case 6:
      cout << "Saturday\n";

    case 7:
      cout << "Sunday\n";
  }
}

출력:

Wednesday
Thursday
Friday
Saturday
Sunday

변수 day = 3의 값이 평가되고 case 3인 각 case 문과 일치하고 여기에 포함된 문이 "Wednesday"가 인쇄되지만 여전히 나머지 문자열을 얻습니다. 제어는 case 3으로 이동합니다. 거기에서 스위치 블록 끝까지 모든 것이 인쇄/평가됩니다.

이것이 cases 4,5,6,7의 문장이 인쇄되는 이유입니다.

이를 방지하려면 switch-case 구조를 수정해야 합니다.

구문 - 수정된 switch-case:

switch(variable / expression)
{
case constant-expression 1:
  statements;
  break; (optional)

case constant-expression 2:
  statements;
  break; (optional)

default:  //default statment optional
  statements;
  break;
}

break 키워드는 스위치 블록의 실행을 중지하고 빠져나올 때 사용됩니다. 조건/케이스가 일치하면 명령문을 평가하고 흐름을 끊고 스위치 블록에서 나옵니다.

default 키워드는 일치하는 대소문자가 없을 때 실행되는 명령문을 지정합니다.

예제 코드:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";
      break;
    case 2:
      cout << "Tuesday\n";
      break;

    case 3:
      cout << "Wednesday\n";
      break;
    case 4:
      cout << "Thursday\n";
      break;

    case 5:
      cout << "Friday\n";
      break;

    case 6:
      cout << "Saturday\n";
      break;

    case 7:
      cout << "Sunday\n";
      break;

    default:
      cout << "Wrong option entereted\n";
      break;
  }
}

출력:

Wednesday

다음 예에서는 char로 전환할 수도 있습니다. 문자가 모음인지 자음인지 확인하는 예제 코드를 살펴보겠습니다.

예제 코드:

#include <iostream>
using namespace std;

int main() {
  char x = 'u';

  switch (x) {
    case 'a':
      cout << "Vowel";
      break;
    case 'e':
      cout << "Vowel";
      break;
    case 'i':
      cout << "Vowel";
      break;
    case 'o':
      cout << "Vowel";
      break;
    case 'u':
      cout << "Vowel";
      break;

    default:
      cout << "Consonant";
      break;
  }
}

출력:

Vowel

C++에서 대소문자 전환 사용의 규칙 및 속성

  1. switch 문 내에서 사용되는 표현은 상수값이어야 합니다. 그렇지 않으면 무효로 간주됩니다.

여기서 고정 값이 할당된 상수 및 변수 표현식을 사용할 수 있음을 알 수 있습니다.

```c++
switch (1 + 2 + 3 * 4 + 5)
  switch (a + b + c * d)
```
  1. defaultbreak는 선택 사항입니다. switch-case에 그것들이 없어도 문제 없이 실행됩니다.

  2. switch 문의 중첩은 다른 명령문 내부에서 명령문을 전환할 수 있다는 의미입니다. 좋은 프로그래밍 방법은 아니지만 여전히 사용할 수 있습니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      int ID = 1234;
      int password = 000;
    
      switch (ID) {
        case 1234:
          cout << "checking info......\n";
    
          switch (password) {
            case 000:
              cout << "Login successful\n";
              break;
            default:
              cout << "Password don't match please check it\n";
              break;
          }
    
          break;
    
        default:
          printf("incorrect ID");
          break;
      }
    }
    

    출력:

    checking info......
    Login successful
    
  3. switch 문 내에서 사용되는 표현식은 int, char 또는 enum이어야 함을 의미하는 정수 유형이어야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      float x = 12.34;
    
      switch (x) {
        case 1.1:
          cout << "Yes";
          break;
        case 12.34:
          cout << "NO";
          break;
      }
    }
    

    출력:

    [Error] switch quantity not an integer
    
  4. default 블록은 switch 안에 있을 수 있지만 일치하는 케이스가 없을 때만 실행됩니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        default:
          cout << "It's not 1 or 2";
          break;
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
      }
    }
    

    출력:

    It's not 1 or 2
    
  5. 위의 경우에 작성된 문장은 절대 실행되지 않습니다. switch 문이 평가되면 제어는 일치하는 대소문자 또는 default 블록(있는 경우)으로 이동합니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        cout << "Tony is Iron Man\n";
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    출력:

    It's not 1 or 2
    
  6. 중복 케이스 라벨은 허용되지 않습니다. 주어진 경우 컴파일 오류가 발생합니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        case 45:
          cout << "Iron Man";
          break;
    
        case 40 + 5:
          cout << "tony stark";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    출력:

    [Error] duplicate case value
    
  7. 케이스 라벨도 일정해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 2;
      int arr[] = {100, 200, 300};
      switch (x) {
        case arr[0]:
          cout << "Iron Man";
          break;
    
        case arr[1]:
          cout << "tony stark";
          break;
    
        case arr[2]:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    출력:

    [Error] the value of 'arr' is not usable in a constant expression
    
  8. 동일한 작업을 수행하는 모든 case 문을 그룹화할 수 있습니다.

    #include <iostream>
    using namespace std;
    
    int main() {
      char x = 'A';
    
      switch (x) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
          cout << "Vowel";
          break;
    
        default:
          cout << "consonant";
      }
    }
    

C++의 switch 문과 if-else 문의 차이점

if-else 문이 많은 경우 컴파일러는 유효한 일치 항목을 찾을 때까지 모든 구문을 확인해야 합니다. 동안 switch-case 문은 특정 조건이 충족되는 경우 특정 코드 블록만 실행하려는 경우에 사용됩니다.

다음 예제에서는 문자가 알파벳인지 여부를 확인합니다.

예제 코드:

char x = '+';

if (x == 'A')
....

    else if (x == 'B')...

    else if (x == 'C')...

    ....else cout
    << "Not an alphabet"

+는 알파벳이 아니므로 모든 이전 조건을 먼저 검사해야 하므로 마지막에 도달하는 데 훨씬 더 오래 걸립니다. switch-case를 사용하여 구현하는 경우 케이스/조건의 수가 매우 많을 때 조회 테이블 또는 해시 목록을 사용합니다.

이는 모든 항목이 동일한 액세스 시간을 갖는다는 것을 의미합니다. 따라서 케이스/조건이 많을 때 if-else보다 switch가 더 빠르기 때문에 선호됩니다.

작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

관련 문장 - C++ Statement