17.열거체(enumeration)
열거형(enum)은 const를 사용하여 기호 상수를 만드는 것에 대한 다른 방식이다. 또한 제한적이지만 새로운 데이터형을 정의할 수 있다.
enum Color {Red, Green, Blue};
이때, enum형 변수를 열거체(enumeration)이라 부르고, enum의 원소를 열거자(enumerator)라 부른다. 기본적으로 첫 번째 열거자는 0이 대입되고, 두 번째 열거자에 1이 대입되는 방식으로 정수값들이 차례로 대입된다. 다만, 열거자에 정수값을 명시적으로 대입할 수 있다.
enum Color {Red = 5, Green, Blue = 10}; //Red = 5, Green = 6, Blue = 10
열거체 변수에는 사용된 열거자 값들만 대입할 수 있다.
Color col;
col = Color::Blue; //문제 없음
col = blue; //문제 없음
col = 2000; //에러
열거자는 정수형이다. 즉, 정수값을 텍스트로 나타냈다고 이해해도 무방하다. 따라서, 열거자를 정수형으로 사용할 수 있다. 반대로 정수형을 열거형에 대입하는 것은 자동으로 캐스팅되지 않는다.
Color col;
col = 3; //에러
int num1 = Color::Red; //문제 없음
int num3 = 3 + Color::Red; //문제 없음
정수형을 열거형으로 캐스팅하기 위해선 아래의 방법을 사용한다.
Color col;
col = Color(3); //캐스팅
열거체의 값 범위
열거체는 값 범위를 가지며, 대입되는 정수의 값이 열거자에 없어도 값 범위안에 들어온다면, 데이터형 변환을 통해 열거체 변수에 대입할 수 있다. 값 범위는 아래와 같다.
- 상한 : 열거자 값 중 최대값 보다 큰 2의 최소 거듭제곱에서 1을 뺀다.
- 하한 : 열거자 값 중 최소값이 0이거나 0보다 크면 값 범위의 하한은 0이고, 음수이면 상한과 같은 식으로 구한 후 음수
값 범위를 정의하는 것은 컴파일러가 열거체를 보관하기 위해 얼마만큼의 공간을 대입하느냐와 관계가 있다.
열거체 범위
열거자를 사용할 때, 나는 범위 지정 연산자를 무조건 사용한다.
enum Color {Red, Green, Blue};
Color col = Color::Red; //(:: 범위 지정 연산자)
타이핑을 더 하겠지만, 무조건 사용하는 이유는 크게 두 가지 있다.
- 대입되는 변수가 열거형인 것을 바로 알 수 있다.
- 열거자 이름 겹침으로 부터 자유로워진다.
사용처
게임에서 현재 몬스터의 패턴을 저장할 때, 패턴은 복수를 가질 수 없으므로, 현재 패턴은 한 가지로만 나타낼 수 있다. 이때 정수형으로 0은 Idle 상태, 1은 Attack 상태처럼 숫자로 저장하면 알아보기 힘들 뿐더러, 3일 후면 개발자도 잊는다. 이런 숫자로 저장할 빠에 글자로 나타내면 바로 알 수 있다.
잡기술
열거자의 값을 명시적으로 나타내지 않았을 때, 열거자 마지막 값을 무언가로 지정하면, enum의 인자 개수를 알 수 있다.
enum Color {Red, Green, Blue, Count};
std::cout << Color::Count << std::endl; //3이 나온다.
열거형 Color의 열거자의 개수는 4지만, 실제로 사용 할 열거자의 수는 3이다.