본문 바로가기
서적 정리/C++ 기초 플러스

17.열거체(enumeration)

by 민돌이2 2022. 8. 3.

열거형(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

'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글

21.배열의 대안  (0) 2022.08.09
20.변수형의 조합  (0) 2022.08.09
19.포인터, 배열, 포인터 연산  (0) 2022.08.09
18.포인터와 메모리 해제  (0) 2022.08.03
16.공용체(union)  (0) 2022.08.03
15.구조체(struct)  (0) 2022.08.03
14.string 클래스  (0) 2022.07.29
13.문자열(string)  (0) 2022.07.26

댓글