728x90
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
}
이전 코드보다 훨씬 가독성이 좋아졌다.
'C,C++' 카테고리의 다른 글
C++ 접근 제어자 (0) | 2022.04.10 |
---|---|
C++ 클래스, this포인터, 기본생성자, 디폴트생성자, 복사생성자 (0) | 2022.04.10 |
C++ 스마트 포인터 ( shared_ptr, make_shared ) (0) | 2022.04.10 |
C++ 범위 지정 연산자(::)와 namespace (0) | 2022.04.10 |
C++ 멤버 초기화 리스트 (0) | 2022.04.10 |