C++에서 enum은 열거형(enumeration)을 정의하는 키워드입니다. 열거형은 상수들의 집합으로, 각 상수는 정수값을 갖게 됩니다. 열거형은 어떤 값이 유효한 값인지 제한하고 싶을 때 유용하게 사용됩니다.
예를 들어, 색상을 정의하는 열거형을 생각해보겠습니다. 색상은 기본적으로 Red, Green, Blue가 있겠죠. 이런 상수들을 정의하고 싶다면 아래와 같이 정의할 수 있습니다.
enum Color {
Red,
Green,
Blue
};
위 코드에서 Red는 정수값 0을, Green은 정수값 1을, Blue는 정수값 2를 갖게 됩니다. 열거형의 상수들은 자동으로 정수값을 갖게 되는데, 첫 번째 상수는 0부터 시작해서 순서대로 정수값을 갖게 됩니다.
열거형에서 상수값을 수동으로 지정할 수도 있습니다. 예를 들어 아래와 같이 정의할 수 있습니다.
enum Color {
Red = 5,
Green,
Blue
};
위 코드에서 Red는 정수값 5를, Green은 정수값 6을, Blue는 정수값 7을 갖게 됩니다. 상수값을 수동으로 지정할 때는 첫 번째 상수부터 순서대로 정수값을 지정할 필요는 없습니다.
열거형에는 enum class과 enum struct가 있습니다. 이 두 가지 키워드는 열거형을 정의할 때 사용될 수 있습니다. enum class와 enum struct는 정확히 같은 의미를 갖지만, 코드의 가독성을 높이기 위해 종종 사용됩니다. enum class과 enum struct를 사용하면 열거형의 상수들을 외부 코드와 충돌하지 않게 할 수 있습니다.
예를 들어, 아래 코드와 같이 열거형을 정의할 수 있습니다.
enum class Color {
Red,
Green,
Blue
};
이 코드에서 Color는 새로운 자료형이 됩니다. Color 자료형으로부터 변수를 생성할 수 있고, 이 변수는 열거형의 상수들 중 하나의 값을 갖게 됩니다. 열거형의 상수들은 자료형의 이름을 지정하지 않고 접근할 수 있습니다.
Color c = Color::Red;
열거형을 정의할 때 enum class나 enum struct를 사용하지 않을 경우, 열거형의 상수들은 전역 유효범위를 갖게 됩니다. 이 경우 열거형의 상수들은 전역 유효범위에 있는 모든 코드에서 접근할 수 있습니다. 그러나 enum class나 enum struct를 사용할 경우, 열거형의 상수들은 자료형의 이름을 지정해야만 접근할 수 있습니다.
그래서 enum class나 enum struct를 사용하면 열거형의 상수들과 외부 코드와 충돌하지 않게 할 수 있기 때문에, 종종 사용됩니다.
#include <iostream>
// 색상을 정의하는 enum 타입 선언
enum class Color {
Red,
Green,
Blue
};
// 색상을 문자열로 변환하는 함수
std::string color_to_string(Color c)
{
if (c == Color::Red) return "Red";
if (c == Color::Green) return "Green";
if (c == Color::Blue) return "Blue";
}
int main()
{
// 색상을 정의한 enum 타입으로부터 변수 생성
Color c = Color::Red;
// 색상을 출력
std::cout << color_to_string(c) << std::endl;
return 0;
}
이 코드에서 Color는 색상을 정의한 enum class 타입입니다. 이 enum class 타입을 이용해서 c라는 변수를 생성했습니다. color_to_string 함수는 색상을 전달받아서 그에 해당하는 문자열을 반환합니다. 이 코드를 실행하면 색상인 Red가 출력됩니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++ Functor(함수 객체) (2) | 2023.02.17 |
---|---|
C++ std::sort (2) | 2023.01.04 |
C++ std::begin, std::end, iterator (0) | 2022.02.19 |
C++ std::numeric_limits (0) | 2022.02.19 |
C++ std::tuple (0) | 2022.02.19 |