C++

[C++] enum class & enum struct

햇썽이 2025. 5. 28. 00:44

enum을 자주쓰다보면은 문제가 발생하는데 바로 다른 변수이름하에 같은 이름이 할당되었을때, 

즉 중복정의시 문제가 생긴다. 예시 코드를 보자

enum CircleAttribute
{
    Bold = 1
};

enum RectAttribute
{
    Bold = 1,
    Underline = 2
};

기존 enum은 범위가 없기 때문에 같은 이름을 다른 enum에 중복 정의하면 컴파일 에러가 발생한다.

 

enum CircleAttribute
{
    cBold = 1
};

충돌 방지를 위해 접두사(prefix)를 사용하여 관리하는 경우가 많다. 하지만 변수 이름이 너무 다양해지고 관리하기가 힘들기 때문에

애초에 enum 뒤에 class 혹은 struct을 넣어서 직접 지정하는 형태를 쓰는 형태로 쓰면된다.

 

범위가 있는 열거형 (enum class / enum struct)

#include <iostream>

using namespace std;

enum struct TextAttribute
{
    Bold = 1,
    Underline = 2,
    Italic = 4,
    Strikethrough = 8
};

범위가 있는 열거형은 이름 충돌을 방지할 수 있으며, 열거형 이름 없이 멤버에 직접 접근할 수 없다.

예를 들어 TextAttribute::Bold와 같이 접근해야 한다.

 

열거형 활용

밑에 코드와 같이 간단하게 연산하는 작업을 썼다. 

그리고 textAttrs라는 함수를 활용하여 해당 함수에 어떤 것들이 적용되었는지 확인하는지 비트 연산자를 활용해 한번에 처리가 가능하다. 

주로 GUI 속성이나 플래그 관리에 자주 사용된다.

int sum = Bold + RectAttribute::Underline;
cout << sum << endl;

sum = (int)TextAttribute::Bold + (int)TextAttribute::Italic;
cout << sum << endl;

int textAttrs = 0;
textAttrs |= Bold;
textAttrs |= (int)TextAttribute::Underline;
cout << textAttrs << endl;

if (textAttrs & (int)TextAttribute::Italic)
    cout << "Italic" << endl;

 

enum struct로 배열 인덱싱

enum struct Color
{
    Red, Green, Blue, SIZE
};

int main()
{
    int colors[(int)Color::SIZE] = {123, 138, 54};
    colors[(int)Color::Red];
}

enum struct는 배열 인덱스로 사용할 때 반드시 명시적 형변환이 필요하다. 컴파일 타임 타입 안정성을 제공한다.

열거형의 저장 타입 변경

enum Color : int64_t
{
    Red = 1234567945
};

int main()
{
    cout << (int64_t)Color::Red << endl;
}

기본적으로 enum은 int형(4바이트)로 처리되지만, 큰 값을 저장할 필요가 있다면 int64_t와 같이 명시적으로 저장 타입을 지정해야 한다.