다음은 C++11 에서 강화된 enum 기능이다.
1. 중복 정의 가능
enum Car
{
SONATA,
AVANTE,
};
enum FakeCar
{
SONATA,
AVANTE,
};
재정의로 에러가 난다.
하지만, class 한정자를 붙여주면?
enum class Car
{
SONATA,
AVANTE,
};
enum class FakeCar
{
SONATA,
AVANTE,
};
깔끔하게 컴파일 된다.
2. 타입 강화
enum Car : unsigned int
{
SONATA = 1,
AVANTE = 2,
};
enum FakeCar : unsigned int
{
SONATA2= 1,
AVANTE2 = 2,
};
if( Car::AVANTE == FakeCar::SONATA2 )
{
// 기존과 마찬가지로 컴파일 가능
}
하지만, 위와 마찬가지로 class를 붙여주면
enum class Car : unsigned int
{
SONATA = 1,
AVANTE = 2,
};
enum class FakeCar : unsigned int
{
SONATA2= 1,
AVANTE2 = 2,
};
if( Car::AVANTE == FakeCar::SONATA2 )
{
// 타입이 맞지 않으므로 에러발생!
// 물론, static_cast나 C형 캐스팅으로 변환은 가능하다
}
다시 말하면 기존처럼 enum의 약한 타입으로 인해 암시적변환이
class 키워드로 인해 타입이 강화된다는 것을 볼 수 있다.
기존에는 같은 변수를 사용하려면, namespace를 통한 방법을 사용했어야 했다.
3. 타입 정의 가능
enum class Car : int
{
SONATA = 2100000000,
}; // 가능
enum class Car : int
{
SONATA = 4200000000,
}; // int형의 크기를 벗어나므로 에러!
참고로 사이즈를 정의하지 않으면, 기본형 타입중에서 자동으로 결정이 되어진다.
enum class Car : unsigned int
{
SONATA = 4200000000,
}; // unsigned int 이내이므로 가능
4. 전방선언 가능
기존과 다르게 class처럼 전방선언이 가능해졌다.
5. 결론
가급적 타입이 강화된 enum class를 쓰는걸 권장한다.
C++11 은 vs2010부터 부분적으로 지원이 되는데,
enum class는 vs2012에서 가능한 것을 확인함.
끝.
http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html
https://msdn.microsoft.com/ko-kr/library/2dzy4k6e.aspx
'프로그래밍 > C++' 카테고리의 다른 글
Visual C++ 데이터 형식(범위) (0) | 2016.01.29 |
---|---|
매크로(define) 재정의 충돌문제 해결 (0) | 2016.01.26 |
객체지향 - 인터페이스와 구현의 분리 (0) | 2015.11.30 |
FreeImage 라이브러리 (0) | 2015.10.11 |
C++ 헤더 중복방지 (0) | 2015.10.07 |