서적 정리/C++ 기초 플러스

17.열거체(enumeration)

민돌이2 2022. 8. 3. 06:24

열거형(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; //(:: 범위 지정 연산자)

타이핑을 더 하겠지만, 무조건 사용하는 이유는 크게 두 가지 있다.

  1. 대입되는 변수가 열거형인 것을 바로 알 수 있다.
  2. 열거자 이름 겹침으로 부터 자유로워진다.

 

사용처

게임에서 현재 몬스터의 패턴을 저장할 때, 패턴은 복수를 가질 수 없으므로, 현재 패턴은 한 가지로만 나타낼 수 있다. 이때 정수형으로 0은 Idle 상태, 1은 Attack 상태처럼 숫자로 저장하면 알아보기 힘들 뿐더러, 3일 후면 개발자도 잊는다. 이런 숫자로 저장할 빠에 글자로 나타내면 바로 알 수 있다.

 

잡기술

열거자의 값을 명시적으로 나타내지 않았을 때, 열거자 마지막 값을 무언가로 지정하면, enum의 인자 개수를 알 수 있다.

enum Color {Red, Green, Blue, Count};

std::cout << Color::Count << std::endl; //3이 나온다.

열거형 Color의 열거자의 개수는 4지만, 실제로 사용 할 열거자의 수는 3이다.

728x90