05.05 - enum class
열거형(enum)은 C++ 에서 고유한 유형이지만, 형식이 안전하지 않으므로 어떤 경우에는 이해가 되지 않는 작업을 수행할 수 있다.
#include <iostream>
int main()
{
enum Color
{
RED,
BLUE
};
enum Fruit
{
BANANA,
APPLE
};
Color color = RED;
Fruit fruit = BANANA;
if (color == fruit)
std::cout << "color and fruit are equal\n";
else
std::cout << "color and fruit are not equal\n";
return 0;
}
C++는 color
와 fruit
를 비교할 때, color
와 fruit
를 암시적으로 정수로 변환하고 정수를 비교한다. color
와 fruit
모두 값 0으로 계산되는 열거자로 설정되었으므로 위의 예에서 color
와 fruit
는 같다고 평가된다. color
와 fruit
는 다른 열거형이고 int가 아니므로 이것은 분명히 원하는 바가 아니다!
C++ 11은 새로운 컨셉, 열거형 클래스(enum class)를 정의했다. (범의가 지정된 열거형 or 강력한 형식의 열거형이라고도 한다) 열거형 클래스(enum class)는 강한 형식과 범위(scope)를 가진다. 열거형 클래스(enum class)를 만들려면, enum
키워드 뒤에 class
키워드를 사용하면 된다.
#include <iostream>
int main()
{
enum class Color
{
RED,
BLUE
};
enum class Fruit
{
BANANA,
APPLE
};
Color color = Color::RED;
Fruit fruit = Fruit::BANANA;
if (color == 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)
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는 나중에 다룰 예정이다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/4-5a-enum-classes/ 입니다.