전체 코드

🚀 1. 개요

C++에서 enum classC++11에서 도입된 기능으로, 기존 enum의 단점을 보완하여 이름 충돌 방지와 타입 안전성을 제공합니다.
enumenum class의 차이점
각 방식의 장단점과 사용 예제
비트 연산, 암묵적 변환, 네임스페이스 활용

이 문서에서는 enum class의 필요성과 사용법을 예제 코드와 함께 상세히 분석하겠습니다.


📂 2. 코드 분석

🎯 기존 enum 방식 (Unscoped Enum)

// 기존 enum
// unscoped enum - 범위 지정이 없어서 전역으로 값이 노출됨.
enum PlayerType : char // 크기 지정 가능
{
    PT_None,        // 기본적으로 0
    PT_Knight = 5,  // 명시적으로 5
    PT_Archer,      // 이전 값 +1 (6)
    PT_Mage         // 이전 값 +1 (7)
};

기존 enum의 특징

  • PlayerType은 범위가 지정되지 않아 전역 네임스페이스로 확장됨.
  • enum PlayerType : char를 사용하면 크기를 char(1바이트)로 설정 가능.
  • 값을 명시적으로 지정하지 않으면 이전 값 +1이 자동 적용됨.
  • PT_None, PT_Knight 등의 값이 전역으로 퍼지므로 이름 충돌 가능성이 있음.

enum MonsterType
{
    None  // PT_None과 충돌 가능
};

이름 충돌 문제 발생 가능

  • MonsterType::NonePlayerType::PT_None은 다른 enum이지만, 전역에서 동일한 None 값으로 충돌할 위험이 있음.
  • 이런 문제를 해결하기 위해 enum class를 사용!

🎯 enum class 방식 (Scoped Enum)

enum class ObjectType
{
    Player,
    Monster,
    Projectile
};

enum class의 주요 특징

  • ObjectType 안에서만 Player, Monster, Projectile을 사용할 수 있음.
  • 전역 네임스페이스를 오염시키지 않음 (ObjectType::Player처럼 접근해야 함).
  • 이름이 충돌하는 문제가 사라짐.

enum class ObjectType2
{
    Player,
    Monster,
    Projectile
};

이름 재사용 가능

  • ObjectTypeObjectType2에 동일한 이름을 사용할 수 있음.
  • enum에서는 불가능했던 이름 충돌 문제를 해결.

🎯 main() 함수 분석

🔹 기본적인 비교

int main()
{

✅ 프로그램의 실행 진입점.


🟢 기존 enum은 암묵적 변환이 가능

    double value = PT_Knight; // 가능
  • 기존 enum정수형 값과 암묵적으로 변환 가능하여, PT_Knight 값을 double에 할당할 수 있음.
  • 타입 안전성이 떨어짐.

🔴 enum class는 암묵적 변환 불가능

    double value2 = static_cast<double>(ObjectType::Player); // 명시적으로 변환 필요
  • enum class는 암묵적 변환이 불가능하여, static_cast를 사용해야 함.
  • 장점: 타입 안전성이 높음.
  • 단점: 변환할 때 코드가 길어짐.

🔹 암묵적 변환이 불편한 경우

    int choice;
    cin >> choice;
    if (choice == static_cast<int>(ObjectType2::Monster))
    {
        cout << "선택한 타입은 Monster입니다." << endl;
    }

✅ 기존 enum에서는 if (choice == PT_Knight)처럼 바로 비교 가능했지만,
enum classstatic_cast<int>를 사용해야 함
불편하지만, 명확한 타입 체크가 가능


🔹 비트 연산에서 enum class의 불편함

    unsigned int bitFlag;
    bitFlag = (1 << PT_Knight);  // 기존 enum - 바로 사용 가능
    bitFlag = (1 << static_cast<int>(ObjectType::Player)); // enum class - 변환 필요

✅ 기존 enum비트 연산에서 편리하지만,
enum class비트 연산 전에 static_cast<int>가 필요하여 불편함
✅ 이 문제를 해결하려면 std::underlying_type을 사용할 수 있음.


🔹 메모리 크기 확인

    cout << "sizeof(PlayerType): " << sizeof(PlayerType) << endl;
    cout << "sizeof(ObjectType): " << sizeof(ObjectType) << endl;

enum PlayerType : char로 크기를 명시했으므로 sizeof(PlayerType) == 1
enum class의 크기는 기본적으로 int (4바이트)


📌 3. enumenum class 비교 요약

특징enum (기존 방식)enum class (C++11)
네임스페이스값이 전역에 퍼짐클래스 내부에서만 사용 가능
암묵적 변환정수형으로 자동 변환암묵적 변환 금지 (타입 안전성 증가)
타입 충돌 가능성높음 (같은 이름 사용 불가)낮음 (같은 이름 사용 가능)
비트 연산바로 사용 가능static_cast<int> 필요
기본 크기int (기본), char 등 지정 가능int (기본), 크기 지정 가능
타입 안전성낮음높음
코드 길이짧음static_cast 필요로 인해 길어짐

📌 4. enum class를 언제 사용할까?

타입 안전성이 필요한 경우
이름 충돌을 방지하고 싶을 때
보다 깔끔한 코드 구조를 원할 때
명확한 네임스페이스 관리가 필요할 때

비트 연산을 자주 사용해야 한다면 기존 enum이 더 편리할 수도 있음.


profile
李家네_공부방

0개의 댓글