C++ enum

프로그래밍 2007. 11. 13. 22:02 |

enum 은 정수형 type 정의와 상수 정의에 사용된다.
보통 unnamed enum 을 사용하여 #define 을 대신하여 상수 정의에 사용되는데
예를 들면,
// define
#define     TYPE_A      0
#define     TYPE_B      1
#define     TYPE_C      2
#define     TYPE_D      3

// unnamed enum
enum {
    TYPE_A,
    TYPE_B,
    TYPE_C,
    TYPE_D,
};

얼핏 위 두 가지는 비슷해 보이긴 하지만 조금(혹은 많이?) 다르다.
물론 당연히 C++ 에서는 후자를 권장한다.
(reference : Effective C++, Scott Meyers)

내가 일하는 곳에서도 모든 상수 정의는 enum을 사용하고 있다.
가장 큰 장점은 디버깅 시 symbol name으로 표시된다는 점이다.
(이건 디버깅을 해 보면 쉽게 알 수 있다)

또한 enum 은 scope 를 가진다.
중괄호 '{}' 안에서도 scope를 가지며,
클래스 내에서 private, public 등 access modifier 에 대해서도 영향을 받는다.

또 이건 장점이자 동시에 단점이 될 수도 있는데,
별도 값을 assign 하지 않으면 값이 알아서 1씩 증가한다는 점이다.
편리함에서 장점이 될 수 있지만, 의도치 않게 중간에 엉뚱한 값이 끼어드는 경우
상수 값 자체가 바뀌어 버리므로 예상치 못한 오류를 일으킬 수도 있다.

또한 중요한 단점인데,
명확하게 type 이 정의되지 않는다는 점이다.

예를 들면,
enum{
    TWO_GIGA = 2*1024*1024*1024,       // 2GB ?
};

이와 같이 선언된 경우,
원래 의도는 TWO_GIGA 를 2GB 대신으로 사용하고자 하였겠지만,
실제로는 일반 4바이트 정수 값으로 0x800000 값이 들어가 있다.
즉, signed int 타입으로 정의되고 그 값은 -2147483648 이다.

제대로 하려면 다음과 같이 하면 된다.
enum{
    TWO_GIGA = 2llu*1024*1024*1024,       // 2GB !
};

명시적으로 long long 타입이라고 알려주는 것이다.
위의 경우와 마찬가지로 다음과 같이 쓴다면,
enum{
    FOUR_GIGA = 4*1024*1024*1024,       // 4GB ?
};

실제로 값은 0 이다.

이런 경우와 같이 명확하게 type 을 표시해 주면 좋은 경우는
enum 대신에 const 변수를 사용하는 것이 더 좋다.
: