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
};
'C++ > syntax' 카테고리의 다른 글
const char* 와 string class (0) | 2023.03.30 |
---|---|
[C++] shared_ptr 사용시 주의할 점 (0) | 2023.03.27 |
[C++] 상수 객체 (const object) 와 상수 멤버함수 (const member function) 및 const 반환(return), 포인터(pointer) (1) | 2023.03.27 |
virtual table (가상함수 테이블)이 생성 및 참조 되는 시점 (0) | 2023.03.17 |
[C++] Lambda expression(람다 표현식) (0) | 2022.12.29 |