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++에서 대소문자 전환 사용의 규칙 및 속성
switch
문 내에서 사용되는 표현은상수값
이어야 합니다. 그렇지 않으면 무효로 간주됩니다.
여기서 고정 값이 할당된 상수 및 변수 표현식을 사용할 수 있음을 알 수 있습니다.
```c++
switch (1 + 2 + 3 * 4 + 5)
switch (a + b + c * d)
```
-
default
및break
는 선택 사항입니다.switch-case
에 그것들이 없어도 문제 없이 실행됩니다. -
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
-
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
-
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
-
위의 경우에 작성된 문장은 절대 실행되지 않습니다.
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
-
중복 케이스 라벨은 허용되지 않습니다. 주어진 경우 컴파일 오류가 발생합니다.
#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
-
케이스 라벨도 일정해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
#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
-
동일한 작업을 수행하는 모든
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
가 더 빠르기 때문에 선호됩니다.