본문 바로가기

영역 제한 열거형 enum class 본문

💘 C++/변수범위, 변수형

영역 제한 열거형 enum class

Hyonii 2022. 1. 23. 15:58

Scoped Enumerations(Enum class) C++ 11

열거형(enum)은 C++ 에서 고유한 유형이지만,

형식이 안전하지 않으므로 어떤 경우에는 이해가 되지 안는 작업을 수행할 수 있다.

앞에서 enum의 단점, 주의해야할 것들이 있었는데

이 단점들 중 일부를 보완하기 위해서 만든 영역제한열거형을 enum class 라고 부른다.

참고로 enum struct도 있는데 enum struct 보다는 enum class를 많이 쓴다.

 

이때 내부적으로 RED는 숫자 0 , BANANA도 내부적으로 숫자 0이다.

color와 fruit를 비교했을 때 둘 다 내부적으로 숫자 0이기 때문에

int로 바꿔서 비교하니까 두 개가 같다고 나온다.

 

프로그래머 입장에서는 실수할 가능성이 높아진다.

그래서 enum class 라는 것을 사용 할 수 있다.

 

enum class로 바꿔주는 순간 undefined라고 나온다.
이런식으로 영역이 제한이 되어있다.

이렇게 비교를 하면 못하게 막아버린다.

 

물론 이렇게 static_cast로 강제변환해서 비교를 할 수는 있다.

하지만 원하는 바가 아니다.

내부적으로 int가 저장된다는 점을 이용해서 강제로 바꿔가면서 테스트 해 볼 수는 있지만

실전 프로그래밍 할 때는 이렇게 문제가 될 일을 만들어서 하지는 않는다.

 

일반 열거형(enum)을 사용하면 열거자(Ex. RED)는 열거형 자체와 같은 범위에 있으므로 직접 접근할 수 있다.

그러나 열거형 클래스(enum class)의 강력한 범위 규칙은 모든 열거자를 열거형 일부로 간주하므로

범위 한정자(::)를 사용하여 열거자 (Ex. Color::RED)에 접근해야 한다.

이는 이름 충돌을 방지하는 데 도움이 된다.

열거형 클래스(enum class)의 강력한 형식 규칙은 고유한 자료형으로 간주함을 의미한다.

그래서 컴파일러가 다른 열거형의 열거자와 암시적으로 비교하지 않는다.

그러나 같은 열거형 클래스 내의 열거자 끼리는 비교할 수 있다.

 

이처럼 color 끼리는 비교가 된다.

 

이렇게 비교는 가능하다

같은 enum 끼리는 비교가능한데 다른 enum 끼리는 비교가 안되게 막혀있다.

어떻게 보면 namespace로 묶어준것이랑 비슷하다.

 

Comments