1. 서로 다른 클래스 상에서는 같은 이름으로 enum type이 정의되더라도 독립적으로 사용 가능함

 

class A
{
    public:

    enum Color
    {
        red = 1,
        blue = 2,
        green = 3
    };
    
    void funcA()
    {
        cout<< Color::red <<" "<< Color::blue <<" "<<Color::green <<endl;
    }
};

class B
{
    public:

    enum Color
    {
        red = 11,
        blue = 22,
        green = 33
    };
    
    void funcB()
    {
        cout<< Color::red <<" "<< Color::blue <<" "<<Color::green <<endl;
    }
};

int main()
{
    A a;
    B b;
    
    a.funcA(); // 1,2,3
    b.funcB(); // 11,22,33
    

    return 0;
}

 

2. 그러나 같은 클래스 내에서는 enum 타입이 다르더라도, 동일한 이름의 enum 변수가 존재할 경우 compile error

 

class A
{
    public:

    enum Color
    {
        red = 1,
        blue = 2,
        green = 3
    };

    enum AdvancdedColor
    {
        red = 100,
        blue = 200,
        green = 300
    };
    
    void funcA()
    {
        cout<< Color::red <<" "<< Color::blue <<" "<<Color::green <<endl;
    }
};

int main()
{
    A a;
    a.funcA();  // compile error
    
    return 0;
}

 

컴파일러에서는 enum을 다음과 같이 처리함.

즉, (default type인) uint 형으로 casting 하게 되는데, 이름이 중복되기 때문에 컴파일 에러를 발생시키는 것임.

 

class A
{
  
  public: 
  enum Color
  {
    red = static_cast<unsigned int>(1), 
    blue = static_cast<unsigned int>(2), 
    green = static_cast<unsigned int>(3)
  };
  
  enum AdvancdedColor
  {
    red = static_cast<unsigned int>(100), 
    blue = static_cast<unsigned int>(200), 
    green = static_cast<unsigned int>(300)
  };
  
};

 

3. enum class 는 2번과 같은 상황에서 enum 타입이 다르다면 동일한 변수를 사용할 수 있게끔 해줌

    (enum class 내에 있는 값들은 서로 독립된 값으로 switch 문이나 if 에서 구분지을 때는 바로 사용 가능하나,
     값을 print 하거나 비교하기위해서는 casting 해줘야 함; 아래 예시의 경우에는 int 형으로 type deduction 됨)

 

class A
{
    public:

    enum class Color
    {
        red = 1,
        blue = 2,
        green = 3
    };

    enum class AdvancdedColor
    {
        red = 100,
        blue = 200,
        green = 300
    };
    
    void funcA()
    {
        cout<< static_cast<int>(Color::red) <<" "<< static_cast<int>(AdvancdedColor::red) <<endl;
    }
};

int main()
{
    A a;
    a.funcA();
    

    return 0;
}

 

컴파일러가 enum class 를 인식한 결과는 아래와 같음

 


  enum class Color : int
  {
    red = 1, 
    blue = 2, 
    green = 3
  };
  
  enum class AdvancdedColor : int
  {
    ared = 100, 
    ablue = 200, 
    agreen = 300
  };

 

+ Recent posts