enum

  • C++에는 많은 자료형이 내장되어 있지만 이 자료형들이 원하는 걸 표현하기에 충분하지 않다.
    ➡️ 그래서 프로그래머들은 사용자 정의 자료형으로 자신만의 자료형을 만든다.

  • 가장 간단한 사용자 정의 자료형이 바로 열거형 자료형이다.
  • 열거형을 정의해도 메모리에는 할당되지 않는다.
    ➡️ 열거된 유형의 변수를 선언한 경우에 해당 변수에 대한 메모리가 할당된다!!

  • 각 열거자는 열거 목록의 위치에 따라 정수 값이 자동으로 할당된다.
  • 기본적으로 첫 번째 열거자에는 정수 값 0이 할당되며 그 이후 열거자에는 이전 열거자보다 1 더 큰 값이 할당된다.
  • 열거형은 고유한 자료형으로 간주한다. ( 열거형에 다른 열거형을 할당하려고 하면 컴파일 에러 발생 )
  • enum 식별자는 대문자로 시작하는 경우가 많으며, 열거자는 보통 모두 대문자로 이름이 지어진다.
  • 정수를 열거형 값으로 암시적으로 변환하지 않는다. (ex   Animal animal = 5;    ➡️   컴파일 에러 발생 )
    대신 static_cast를 통해 강제로 변환할 수 있다. ( ex   Color color = static_cast<Color>(5);  )

 

사용법

예시1)

#include<iostream>

enum Color
{
  COLOR_BLACK,   // 0
  COLOR_RED,     // 1
  COLOR_BLUE,    // 2
  COLOR_GREEN,   // 3
  COLOR_WHITE,   // 4
  COLOR_CYAN,    // 5
  COLOR_YELLOW,  // 6
  COLOR_MAGENTA  // 7
};

int main(){
  Color paint = COLOR_WHITE;
  Color house(COLOR_BLUE);
  Color apple {COLOR_RED};
  
  std::cout << paint  // 4 
}

 

예시2) 열거자의 값을 명시적으로 정의 가능

enum Animal
{
  ANIMAL_CAT = -3,
  ANIMAL_DOG,          // -2
  ANIMAL_PIG,          // -1
  ANIMAL_HORSE = 5,
  ANIMAL_GIRAFFE = 5,
  ANIMAL_CHICKEN       // 6
}

 

예시3) 열거자들은 같은 네임스페이스에 배치되므로, 열거자 이름을 같은 이름으로 사용하면 에러 발생

enum Color
{
	RED,
	BLUE, // BLUE is put into the global namespace
	GREEN
};

enum Feeling
{
	HAPPY,
	TIRED,
	BLUE // error, BLUE was already used in enum Color in the global namespace
};

 

 

열거형은 언제 유용할까?

특정한 상태 집합을 나타내야 할 때 코드 문서화 및 가독성 목적으로 매우 유용하다.

 

int readFileContents() 
{ 
	if (!openFile()) 
		return -1; 
	if (!readFile()) 
		return -2; 
	if (!parseFile()) 
		return -3; 

	return 0; // success 
}

위와 같이 코드를 작성하면 가독성이 좋지 않다. 이렇게 쓰는 대신 열거형을 사용해보자.

 

enum ParseResult 
{ 
	SUCCESS = 0, 
	ERROR_OPENING_FILE = -1, 
	ERROR_READING_FILE = -2, 
	ERROR_PARSING_FILE = -3 
};

int readFileContents() 
{ 
	if (!openFile()) 
		return ERROR_OPENING_FILE; 
	if (!readFile()) 
		return ERROR_READING_FILE; 
	if (!parseFile()) 
		return ERROR_PARSING_FILE; 

	return 0; // success 
}

이전 코드보다 훨씬 가독성이 좋아졌다.

+ Recent posts