728x90
enum class
enum class는 기존 enum의 부족함을 보완하기 위해, C++11 이후에 추가된 키워드이다.
가장 큰 차이점으로는, 기존의 enum에서 암시적으로 허용되던 것들이 enum class에서는 명시적으로 선언해줘야 한다는 점이다.
기존의 enum은 전방 선언할 수 없었지만, enum class는 전방 선언이 가능하다.
enum
- 열거체 이름과 열거 상수 이름이 같은 네임스페이스에 놓인다.
따라서, 전역에 선언하면 모든 곳에서 이름이 보이고, 상수 이름이 충돌할 수 있다. - 열거 상수가 정수형으로 암시적 변환된다.
다른 열거형이나 정수와 실수 없이 비교·연산이 가능해 실수로 오 남용될 수 있다. - C++11 이전에는 전방 선언이 불가능했다.
C++11 이후에도 기본 타입이 불분명해 전방 선언 활용이 제한적이다.
enum class
- 열거체 이름의 스코프 안에만 상수가 속한다.
열거체 이름::상수 이름의 형태로만 접근 가능해 이름 충돌을 방지한다. - 암시적 변환이 허용되지 않는다.
타입 안정성을 제공하며, 명시적 캐스트(static_cast)가 필요하다. - C++11부터 전방 선언이 가능하며, 반드시 언급된 기본 타입을 함께 지정해야 한다.
#include <iostream>
enum PlayerType : unsigned __int8 // enum의 기본 타입 지정도 C++11부터 가능.
{
Knight = 1,
Archer,
Mage,
};
int main()
{
// 열거체 이름과 열거 상수 이름이 같은 네임스페이스에 놓인다.
// 전역에 선언하면 모든 곳에서 이름이 보이고, 상수 이름이 충돌할 수 있다.
PlayerType PT = Knight;
int a = PT; // enum은 기본적으로 정수형으로 변환 가능.
}
#include <iostream>
enum class PlayerType : unsigned __int8
{
Knight = 1,
Archer,
Mage,
};
int main()
{
// 열거체 이름의 스코프 안에만 상수가 속한다.
// PlayerType::Knight 형태로만 접근 가능해 이름 충돌을 방지한다.
PlayerType PT = PlayerType2::Knight;
int a = static_cast<int>(PT); // enum class는 기본적으로 정수형으로 변환 불가능. 명시적 형변환 필요.
}
이처럼 enum class는 스코프, 타입 안정성, 명시적 기본 타입 지정 등 C++ 모던 스타일의 장점을 제공한다.
따라서, 타입 안전성이 중요한 대규모 코드베이스나 라이브러리 설계에는 enum class 사용이 적극 권장된다.
반면, 레거시 C API와 호환성이 필요하거나, 단순히 정수 상수 집합을 선언할 때는 여전히 enum을 사용할 수 있다.
728x90
'📕Programming > 📝C/C++' 카테고리의 다른 글
| [C / C++] 오른 값 참조(R-Value Reference)와 Move Semantics (0) | 2023.12.04 |
|---|---|
| [C / C++] delete (삭제된 함수) (0) | 2023.12.01 |
| [C / C++] typedef / using (0) | 2023.11.29 |
| [C / C++] auto (0) | 2023.11.28 |
| [C / C++] algorithm 라이브러리 (0) | 2023.11.24 |