티스토리 뷰

기존 C++ 03까지의 enum은 몇 가지 문제점을 안고 있었으니... 가장 큰 문제점을 꼽자면 이름의 범위가 보장되지 않는다는 점이다. 우선 천천히 예시를 보며 공부해보자.

Vehicle 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Vehicle
{
public:
    enum CAR_COLOR
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
};
.
.
.
Vehicle::CAR_COLOR carColor = Vehicle::BLUE;
cs

Vehicle class 에서 CAR_COLOR의 BLUE 항목을 참조하려면 중간에 CAR_COLOR이라는 type name이 name space의 역할을 할 것 같아 보이지만 그 역할은 무시되고 type name으로의 역할만 한다는 점이다.

이로써 야기되는 문제점은 같은 클래스 내에서 같은 enum 속성이 중복될 수 있다는 점이다. 아래와 같이...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Vehicle
{
public:
    enum CAR_COLOR
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
 
    enum BIKE_COLOR
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
};
cs


위 코드는 C++에서 열거자에 대한 중복을 허용하지 않기 때문에 컴파일 오류가 날 것이다. 그래서 본인은 이 문제를 우회하기 위한 몇 가지 방법들을 사용하고 있었는데...

enum + namespace의 조합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace CAR
{
    enum CAR_COLOR
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
}
 
namespace BIKE
{
    enum BIKE_COLOR
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
}
cs

하지만 이 방법은 안타깝게도 클래스에서는 사용 불가능하다. 그렇다면?

enum 속성에 enum type을 prefix로 붙이는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Vehicle
{
public:
    enum CAR_COLOR
    {
        CAR_COLOR_RED,
        CAR_COLOR_GREEN,
        CAR_COLOR_BLUE,
        CAR_COLOR_PURPLE,
        CAR_COLOR_MAX_COUNT
    };
 
    enum BIKE_COLOR
    {
        BIKE_COLOR_RED,
        BIKE_COLOR_GREEN,
        BIKE_COLOR_BLUE,
        BIKE_COLOR_PURPLE,
        BIKE_COLOR_MAX_COUNT
    };
};
 
cs

이렇게 주로 사용하고 있었는데 이름이 너무 길어지는 단점이 있다. 하지만 C++ 11에서는 아주 간단하게 enum class 라는 새로운 keyword가 추가되어 대체가 가능하다. 사용 방법은 기존 enum과 거의 같다.

enum class example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Vehicle
{
public:
    enum class CarColor
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
 
    enum class BikeColor
    {
        RED,
        GREEN,
        BLUE,
        PURPLE,
        MAX_COUNT
    };
};
.
.
.
Vehicle::CarColor carColor = Vehicle::CarColor::PURPLE;
Vehicle::BikeColor bikeColor = Vehicle::BikeColor::GREEN;
cs


이 외에도 enum class에는 기존 enum에 비해서 추가된 기능이 있는데 기회가 되면 다음에 포스팅 하고자 한다.

댓글
댓글쓰기 폼