소년코딩

05.05 - enum class

열거형(enum)은 C++ 에서 고유한 유형이지만, 형식이 안전하지 않으므로 어떤 경우에는 이해가 되지 않는 작업을 수행할 수 있다.

#include <iostream>

int main()
{
    enum Color
    {
        RED,   // RED is placed in the same scope as Color
        BLUE
    };

    enum Fruit
    {
        BANANA, // BANANA is placed in the same scope as Fruit
        APPLE
    };

    Color color = RED; // Color and RED can be accessed in the same scope (no prefix needed)
    Fruit fruit = BANANA; // Fruit and BANANA can be accessed in the same scope (no prefix needed)

    if (color == fruit) // The compiler will compare a and b as integers
        std::cout << "color and fruit are equal\n"; // and find they are equal!
    else
        std::cout << "color and fruit are not equal\n";

    return 0;
}

// color and fruit are equal

C++는 colorfruit를 비교할 때, colorfruit를 암시적으로 정수로 변환하고 정수를 비교한다. colorfruit 모두 값 0으로 계산되는 열거자로 설정되었으므로 위의 예에서 colorfruit는 같다고 평가된다. colorfruit는 다른 열거형이고 int가 아니므로 이것은 분명히 원하는 바가 아니다!

C++ 11은 새로운 컨셉, 열거형 클래스(enum class)를 정의했다. (범의가 지정된 열거형 or 강력한 형식의 열거형이라고도 한다) 열거형 클래스(enum class)는 강한 형식과 범위(scope)를 가진다. 열거형 클래스(enum class)를 만들려면, enum 키워드 뒤에 class 키워드를 사용하면 된다.

#include <iostream>
int main()
{
    enum class Color // "enum class" defines this as a scoped enumeration instead of a standard enumeration
    {
        RED, // RED is inside the scope of Color
        BLUE
    };

    enum class Fruit
    {
        BANANA, // BANANA is inside the scope of Fruit
        APPLE
    };

    Color color = Color::RED; // note: RED is not directly accessible any more, we have to use Color::RED
    Fruit fruit = Fruit::BANANA; // note: BANANA is not directly accessible any more, we have to use Fruit::BANANA

    if (color == fruit) // compile error here, as the compiler doesn't know how to compare different types Color and Fruit
        std::cout << "color and fruit are equal\n";
    else
        std::cout << "color and fruit are not equal\n";

    return 0;
}

일반 열거형(enum)을 사용하면 열거자(Ex. RED)는 열거형 자체와 같은 범위에 있으므로 직접 접근할 수 있다. 그러나 열거형 클래스(enum class)의 강력한 범위 규칙은 모든 열거자를 열거형 일부로 간주하므로 범위 한정자(::)를 사용하여 열거자 (Ex. Color::RED)에 접근해야 한다. 이는 이름 충돌을 방지하는 데 도움이 된다.

열거형 클래스(enum class)의 강력한 형식 규칙은 고유한 자료형으로 간주함을 의미한다. 그래서 컴파일러가 다른 열거형의 열거자와 암시적으로 비교하지 않는다. 그러나 같은 열거형 클래스 내의 열거자 끼리는 비교할 수 있다.

#include <iostream>
int main()
{
    enum class Color
    {
        RED,
        BLUE
    };

    Color color = Color::RED;

    if (color == Color::RED) // this is okay
        std::cout << "The color is red!\n";
    else if (color == Color::BLUE)
        std::cout << "The color is blue!\n";

    return 0;
}

class 키워드는 static 키워드와 함께 C++에서 가장 의미가 많은 키워드 중 하나다. 열거형 클래스(enum class)는 class 키워드를 사용하지만, 전통적인 C++의 class로는 간주하지 않는다. class는 나중에 다룰 예정이다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/4-5a-enum-classes/ 입니다.


댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기