본문 바로가기

프로그래밍/C++

[C++11] enum class

C++03 까지 열거형은 범위가 제한되어 있지 않았다사실 이름이 있는 int 형이라는 인식으로 사용했었다.

 

C++11에서는 열거형이 강화됐다열거형은 namespace 같이 범위를 제한하게 되었고열거자는 열거형을 통해서만 접근할 수 있게 바뀌었다.

 

이전까지는

 

enum Dir LeftRight };

 

로 쓰더라도


int myDir = Left;

 

같이 int 형으로 대입이 가능하다심지어 열거자와 같은 이름의 객체는 생성할 수도 없다.

 

int Left = 10;    // error!

 

결국, C++03까지의 열거자는 const int 와 별다른 차이가 없었다.

 

C++11 에서는 enum class 를 통해서 기능을 강화했다.

 

열거형의 이름 

        enum class Dir : int { LeftRight };

                                     ↑열거자의 타입

 

처럼 선언하며, : int 부분은 생략해도 된다이 때 열거자의 타입은 int 가 된다.

+ ) 열거자의 타입은 intshortchar 같은 정수 계열 형식이어야 한다.

+ ) bool 형도 가능하지만 형을 강제한다는 경고가 뜬다.

 

 C++03에서마지막 열거자를 count 나 end 라고 이름 지어 열거자의 개수만큼의 배열을 만드는 기법이 있었다. 그렇다면 enum class 에서는 그 기법을 사용할 수 없는 걸까?

 그렇지는 않다. 열거자는 강제로 int 형으로 형변환을 할 수 있다. 물론 이것은 좋은 방법은 아니다. 기왕이면 열거자의 정확한 타입을 알면 좋다.

 

이 때 사용 가능한 함수가 있다. std::underlying_type_t 을 사용하면 열거자의 타입에 맞는 값을 반환한다.

 

 Enum 이라는 enum class : char 객체 E = 'C' 가 있을 때, std::underlying_type_t<Enum>(E) ; 의 값은 'C' 이다만약 강제 형변환을 했을 경우값은 67이 나오게 된다.




 enum class 예제는 다음을 참고.