열거형 타입 enum에 대해 이전에 포스팅하였는데, 편리하지만 생각보다 단점이 많이 존재한다. 이를 어느 정도 해소시켜줄 수 있는 것이 바로 열거형 클래스 enum class이다. 영역 제한 열거형이라고도 부르며 enum struct도 존재하지만 주로 enum class만 사용한다.
enum이 발생시키는 상황
enum은 마치 #define 매크로처럼 제한이 없이 넓은 영역에 영향을 미친다고 볼 수 있다. 서로 다른 enum일지라도 이름을 같게 해서는 안되며, 서로 다른 이름에 다른 enum일지라도 같은 값을 가지면 조건문에서 쓸 때 같다고 판단해버린다.
#include <iostream>
int main()
{
using namespace std;
enum Color
{
RED,
BLUE
};
enum Fruit
{
BANANA,
APPLE
};
Color color = RED;
Fruit fruit = BANANA;
if(color==fruit)
cout << "Color is fruit ? " << endl;
return 0;
}
위의 코드를 실행하면 if문에서 참으로 판단하고 출력을 수행한다.
enum class
enum class를 사용하면 애초에 위와 같은 조건문을 사용할 수 없도록 막아버린다. 아래는 enum class로 변경한 코드이다.
#include <iostream>
int main()
{
using namespace std;
enum class Color
{
RED,
BLUE
};
enum class Fruit
{
BANANA,
APPLE
};
Color color = Color::RED;
Fruit fruit = Fruit::BANANA;
if(color==fruit)
cout << "Color is fruit ? " << endl;
return 0;
}
위의 코드는 실행되지 않는다. 실행할 경우 다음과 같은 에러 메시지가 뜬다.
Error C2676 binary '==': 'main::Color' does not define this operator or a conversion to a type acceptable to the predefined operator
if (static_cast<int>(color) == static_cast<int>(fruit))
물론 조건문을 위처럼 static_cast를 사용하여 int로 변경한 뒤 사용할 수 있겠지만 좋은 생각은 아니다.
enum class를 통해 같은 enum class 내부에 있는 값들로만 비교할 수 있게 되므로 휴먼 에러를 줄일 수 있는 방법이 되겠다.
'Programming Language > Modern C++' 카테고리의 다른 글
[C++ 11] auto 키워드와 자료형 추론 (0) | 2021.11.15 |
---|---|
[C++ 11] chrono 라이브러리와 시간 측정 방법 (0) | 2021.11.12 |
[C++ 11] typedef와 using 키워드의 차이점 (0) | 2021.11.09 |
[C++ 14] 가독성 높은 비트 마스크 표현 (0) | 2021.11.06 |
[C++ 11] for문 간결하게 쓰기(auto 키워드) (0) | 2021.10.31 |