switch-case문은 특정한 상황에 사용하여 if문보다 간결하게 사용할 수 있게 한다.
#include <iostream>
using namespace std;
enum class Colors
{
BLACK,
WHITE,
RED,
GREEN,
BLUE,
};
void printColorName(Colors color)
{
if (color == Colors::BLACK)
cout << "black" << endl;
else if (color == Colors::WHITE);
cout << "white" << endl;
//.....
}
int main()
{
printColorName(Colors::BLACK);
return 0;
}
기본적인 예제이다. 왜 if문을 사용하지 않고 switch-case문을 사용하는지 확인할 수 있는... 저번에 enum이 무슨 역할을 하는지 배웠다. 여기서 enum class는 무슨 역할을 하는 것일까? 일반적으로 enum만 사용하여 변수를 선언하면 전역변수 역할을 하게 된다. 그러면 하나의 enum과 다른 enum의 동일한 이름을 갖은 변수가 있으면 오류가 난다. 이를 해결하기 위하여 class를 사용하여 방지하는 것이다. 사용법은 namespace와 동일하여 문제가 없다. namespace도 동일한 이름이 있어도 사용할 수 있었으니... 그때 배웠으니 지금은 넘어간다.
각설하고 다시 switch-case문으로 넘어간다면, void printColorName()
를 보면 if
, else if
, else
등으로 계속 작성하게 된다. 이 작업은 매우 번거로우므로 switch-case문을 이용하여 좀더 간결하게 코딩할 수 있도록 한다.
#include <iostream>
using namespace std;
enum class Colors
{
BLACK,
WHITE,
RED,
GREEN,
BLUE,
};
void printColorName(Colors color)
{
/*if (color == Colors::BLACK)
cout << "black" << endl;
else if (color == Colors::WHITE);
cout << "white" << endl;*/
//.....
switch (color)
{
case Colors::BLACK:
cout << "Black";
break;
case Colors::WHITE:
cout << "White";
break;
case Colors::RED:
cout << "Red";
break;
}
}
int main()
{
//printColorName(Colors::BLACK);
int x;
printColorName(Colors::WHITE);
cout << (int)(Colors::BLACK) << endl;
return 0;
}
자 위의 if
문을 switch-case
문을 이용하여 바꿔보았다. 뭐.. 코드상으로 많이 줄은게 많냐 라고 물으면 할말은 없지만,,, 확실이 좀더 보기 편하고 간결하긴 하다.
int main()
{
//printColorName(Colors::BLACK);
int x;
cin >> x;
switch (x)
{
int a;
int b = 1;
case 0:
...
...
break;
}
return 0;
}
이 코드는 Build 오류가 난다. 무슨 오류일까? case
문에 코드가 안 넣어져 있어요. 그런 오류말고 다른 오류가 있다. 바로 초기화 문제이다. switch
문에 변수 선언은 할 수 있다. 다만, 초기화를 하여 메모리 할당을 하진 않는다. 하지만 case
문에는 사용할 수 있다.
int main()
{
//printColorName(Colors::BLACK);
int x;
cin >> x;
switch (x)
{
int a;
case 0:
int y;
break;
case 1:
y = 5;
cout << y << endl;
}
return 0;
}
실행하여 1을 누르면 5가 출력되는 것인데, 여기서 뭔가 의아하지 않는가? 분명 case0를 거치지 않고 case1로 넘어갔는데 왜 오류가 안나지? y라는 변수의 자료형 선언도 없는데???? 뭐지 모지 ??? 라고 생각할 수 있으나 실제로는 아래와 같은 코드로 작동한다.
#include <iostream>
using namespace std;
enum class Colors
{
BLACK,
WHITE,
RED,
GREEN,
BLUE,
};
void printColorName(Colors color)
{
/*if (color == Colors::BLACK)
cout << "black" << endl;
else if (color == Colors::WHITE);
cout << "white" << endl;*/
//.....
switch (color)
{
case Colors::BLACK:
cout << "Black";
break;
case Colors::WHITE:
cout << "White";
break;
case Colors::RED:
cout << "Red";
break;
}
}
int main()
{
//printColorName(Colors::BLACK);
int x;
cin >> x;
switch (x)
{
int a;
int y;
case 0:
break;
case 1:
y = 5;
cout << y << endl;
}
return 0;
}
즉, case
문에 선언된 변수는 모조리 다 switch
문 안으로 선언되고case
문을 진행하는 것과 같다. 생각보다 많은 에러가 발생할 수 있으니 조심하도록 하자. 근데 되도록 case
문안에 변수 선언보단 밖에 선언하는 것이 낫다. 이해하기 어렵잖아..;
#include <iostream>
using namespace std;
int main()
{
//printColorName(Colors::BLACK);
int x;
cin >> x;
switch (x)
{
int a;
int y;
case 0:
break;
case 1:
y = 5;
cout << y << endl;
default:
cout << "undefined" << endl;
break;
}
return 0;
}
다 쓰지 않아도 될때에는 default
를 사용하는 방법도 있다. if-else
문에서 else
문 같은 역할을 하는 느낌이라고 생각하면 된다.