enum

Jaemyeong Lee·2024년 8월 4일
0

FastCampusC++

목록 보기
27/78

첫 번째 블록 (enum 선언 및 기본 사용)

enum Color
{
    // 값을 지정해주지 않으면 첫 번째는 0이 되고 이후로 1씩 증가
    Red, Green, Blue, SIZE
};

struct ColorStruct
{
    int red;
    int green;
    int blue;
};

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

enum CircleAttribute
{
    //Bold = 1 // Unscoped Enum 의 경우 TextAttribute::Bold 와 이름이 겹쳐서 사용할 수 없다.
};

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

enum class ScopedCircleAttribute
{
    Bold = 1 // ScopedEnum은 이름이 겹쳐도 가능
};

enum Overflow
{
    Value0 = 100000000000
};

enum NotOverflow : uint64_t
{
    Value1 = 100000000000
};
  1. enum Color를 선언합니다. 기본값을 지정하지 않으면 첫 번째 값은 0부터 시작하며, 이후 값들은 1씩 증가합니다.
  2. struct ColorStruct를 선언하여 red, green, blue를 멤버로 가집니다.
  3. enum TextAttribute를 선언하여 비트 플래그로 사용할 값을 지정합니다.
  4. enum CircleAttribute를 선언하였으나, Bold 값이 TextAttribute::Bold와 충돌하기 때문에 주석 처리합니다.
  5. enum struct ScopedTextAttributeenum class ScopedCircleAttribute를 선언합니다. Scoped enum은 이름 충돌을 방지할 수 있습니다.
  6. enum Overflowenum NotOverflow를 선언합니다. NotOverflowuint64_t로 크기를 지정합니다.

두 번째 블록 (기본 enum 사용 예제)

int main()
{
    {
        // 주석으로 RGB Index를 표현
        // 0 : Red, 1 : Green, 2 :Blue
        int colors[3] = { 255, 128, 64 };

        cout << "Red : " << colors[0] << endl;
        cout << "Green : " << colors[1] << endl;
        cout << "Blue : " << colors[2] << endl;

        // 상수로 RGB Index를 표현
        const int red = 0;
        const int green = 1;
        const int blue = 2;

        cout << "Red : " << colors[red] << endl;
        cout << "Green : " << colors[green] << endl;
        cout << "Blue : " << colors[blue] << endl;

        // Unscoped enum 을 이용하여 RGB Index를 표현
        cout << "Red : " << colors[Red] << endl;
        cout << "Green : " << colors[Green] << endl;
        cout << "Blue : " << colors[Blue] << endl;
    }
  1. colors 배열을 선언하고 초기화합니다.
  2. RGB 색상 인덱스를 상수와 unscoped enum을 사용하여 출력합니다. enum을 사용하면 코드 가독성을 높일 수 있습니다.

세 번째 블록 (enumstruct 사용 예제)

    {
        int colors[SIZE] = { 255, 128, 64 };
        // Unscoped enum 을 이용하여 RGB 값의 평균
        int total = 0;
        for (int i = 0; i < SIZE; ++i)
        {
            total += colors[i];
        }

        int avg0 = total / SIZE;
        cout << avg0 << endl;

        // Struct를 이용하여 RGB 값의 평균
        ColorStruct cs = { 255, 128, 64 };
        int avg1 = (cs.red + cs.green + cs.blue) / 3;
        cout << avg1 << endl;
    }
  1. colors 배열을 SIZE로 초기화하고 enum을 사용하여 RGB 값의 평균을 계산합니다.
  2. struct ColorStruct를 사용하여 RGB 값을 초기화하고 평균을 계산합니다.

네 번째 블록 (비트 플래그 사용)

    {
        // BitFlag 사용
        int textAttrs = 0;
        textAttrs |= Bold;
        textAttrs |= Underline;

        cout << textAttrs << endl;
        if (textAttrs & Underline)
            cout << "Underline" << endl;
    }
  1. int textAttrs를 초기화합니다.
  2. 비트 연산자를 사용하여 BoldUnderline 속성을 추가합니다.
  3. 비트 연산자를 사용하여 Underline 속성을 확인합니다.

다섯 번째 블록 (범위 지정 열거형 사용)

    {
        Bold;
        TextAttribute::Bold; // 범위 지정해서 사용 가능
        ScopedTextAttribute::Bold; // 범위 지정을 반드시 해야 한다.

        cout << Bold << endl;
        cout << TextAttribute::Bold << endl;
        cout << (int)ScopedTextAttribute::Bold << endl; // 강타입, 암시적으로 정수형으로 변환되지 않는다
        // Unscoped enumeration 보다 Scoped enumeration 사용이 권장 된다
    }
  1. 범위 지정 열거형과 비범위 지정 열거형의 사용 방법을 보여줍니다.
  2. ScopedTextAttribute는 반드시 범위를 지정해야 합니다.
  3. ScopedTextAttribute::Bold는 명시적으로 정수형으로 변환해야 합니다.

여섯 번째 블록 (열거형 크기 지정)

    {
        cout << Overflow::Value0 << endl;
        cout << NotOverflow::Value1 << endl;
    }
  1. Overflow::Value0NotOverflow::Value1를 출력합니다.
  2. NotOverflowuint64_t로 크기를 지정하여 큰 값을 안전하게 저장할 수 있습니다.

일곱 번째 블록 (열거형 변수 사용 및 비교)

    {
        Color color = Color::Red; // 변수로 사용
        if (color == Color::Red) // 비교문
        {
            cout << "Red" << endl;
        }
    }
    {
        Color color = (Color)0; // 정수를 enum으로 변환
        if (color == Color::Red) 
        {
            cout << "Red" << endl;
        }
    }
}
  1. Color 열거형 변수를 선언하고 초기화합니다.
  2. 열거형 변수를 비교하여 조건에 따라 출력합니다.
  3. 정수를 열거형으로 변환하여 사용합니다.

정리

열거형(enum)은 상수 값을 그룹화하여 코드의 가독성을 높이고 오류를 줄이는 데 유용합니다. C++에서는 비범위 지정 열거형(unscoped enum)과 범위 지정 열거형(scoped enum)을 지원합니다. 비범위 지정 열거형은 기존의 C 스타일 열거형으로, 암시적으로 정수형으로 변환됩니다. 범위 지정 열거형(enum class 또는 enum struct)은 이름 충돌을 방지하고 타입 안전성을 제공합니다. 또한, 비트 플래그를 사용하여 여러 속성을 효율적으로 관리할 수 있습니다. 열거형의 크기를 지정하여 큰 값을 안전하게 저장할 수 있습니다. 열거형을 사용하여 코드의 가독성을 높이고 유지 보수성을 향상시킬 수 있습니다.

profile
李家네_공부방

0개의 댓글