티스토리 뷰
※ 주의 사항 ※
- 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
열거형은 다음과 같이 두 종류의 포맷을 같습니다.
- 범위가 없는 열거형(unscoped enum)
- 범위가 있는 열거형(scoped enum)
범위가 없는 열거형은 각각의 멤버가 전역 변수처럼 프로그램 전체 영역에 영향을 끼치는 열거형을 말합니다. 반면 범위가 있는 열거형은 각각의 멤버가 지역 변수처럼 열거형 타입으로 선언된 변수에 국한되어 영향을 미치는 열거형을 말합니다. 범위가 있는 열거형은 C++11부터 추가되었습니다.
다음의 예제를 통해 두 종류의 열거형의 사용법과 특징들에 대해 알아보겠습니다.
enum color1 //범위가 없는 열거형(unscoped enum)
{
RED, YELLOW = 2, GREEN
};
enum class color2 //범위가 있는 열거형(scoped enum)
{
BLUE, WHITE, BLACK = 4, BROWN
};
int main()
{
color1 col11 = RED;
color1 col12 = color1::RED;
color1 col13 = BLUE; //error : 식별자 BLUE가 정의되어 있지 않음
color1 col14 = color2::BLUE; //error : color2 형식의 값을 이용해 color1 형식의 엔터티 초기화 불가
int val1 = GREEN;
int val2 = color1::GREEN;
int val3 = WHITE; //error : 식별자 WHITE가 정의되어 있지 않음
int val4 = color2::WHITE; //error : color2 형식의 값을 이용해 color1 형식의 엔터티 초기화 불가
color2 col11 = YELLOW; //error : color1 형식의 값을 이용해 color2 형식의 엔터티 초기화 불가
color2 col12 = color1::YELLOW; //error : color1 형식의 값을 이용해 color2 형식의 엔터티 초기화 불가
color2 col13 = BLACK; //error : 식별자 BLACK이 정의되어 있지 않음
color2 col14 = color2::BLACK;
return 0;
}
두 종류의 열거형은 선언 방법부터 차이가 있습니다. 범위가 없는 열거형은 enum 키워드로 선언하지만, 범위가 있는 열거형은 enum class 혹은 enum struct 키워드로 선언할 수 있습니다.
그리고 이들의 사용 예를 보면 범위가 없는 열거형은 각각의 멤버들이 전역 변수처럼 사용됨을 알 수 있습니다. 반면 범위가 있는 열거형은 조금 독특합니다. 범위가 있는 열거형으로 정의된 color2는 오로지 color2의 멤버들로만 초기화가 가능하며, color2의 멤버로 다른 열거형을 초기화하는 것도 불가능합니다. 그리고 color2의 멤버를 호출할 때는 반드시 color2::WHITE와 같이 호출해야만 함을 알 수 있습니다.
비트 플래그(Bit Flags) 열거형
열거형은 보통 정수로 만들지만 또 다른 방법으로 열거형 타입을 비트 플래그의 형태로 만들어 사용할 수도 있습니다. 비트 플래그는 char 타입이나 int 타입의 개별 비트에 의미를 붙여서 사용합니다. 아래는 char 타입을 대상으로 비트 플래그를 적용한 예입니다.
0000 0000 //일요일
0000 0001 //월요일
0000 0010 //화요일
0000 0100 //수요일
0000 1000 //목요일
0001 0000 //금요일
0010 0000 //토요일
아래의 예제는 비트 플래그 열거형을 활용한 예제입니다.
#include <iostream>
enum Days
{
NONE = 0x00, //0000 0000
SUNDAY = 1 << 0, //0000 0001
MONDAY = 1 << 1, //0000 0010
TUESDAY = 1 << 2, //0000 0100
WEDNESDAY = 1 << 3, //0000 1000
THURSDAY = 1 << 4, //0001 0000
FRIDAY = 1 << 5, //0010 0000
SATURDAY = 1 << 6 //0100 0000
};
const char* week[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" };
void dayName(int d)
{
std::cout << d << ", ";
for (int i = 0; i < 7; i++)
{
if (d & (1 << i))
{
std::cout << week[i] << ' ';
}
}
std::cout << std::endl;
}
int main()
{
dayName(TUESDAY);
Days meeting = Days((int)THURSDAY | (int)MONDAY);
dayName(meeting);
return 0;
}
/*
실행 결과
4, tuesday
18, monday thursday
*/
위 실행 결과의 두 번째 줄을 보면 두 개의 값이 출력된 것을 확인할 수 있습니다. 이는 비트 플래그와 비트 연산자를 이용했기 때문에 가능했습니다. 이렇듯 하나 이상의 열거형 타입의 요소를 동시에 선택하고자 한다면 비트 플래그 열거형을 고려하는 것도 좋습니다.
'공부 일지 > CPP 공부 일지' 카테고리의 다른 글
C++ | 범위 기반 for문 (0) | 2021.08.09 |
---|---|
C++ | 상수 표현식(constexpr ) (0) | 2021.08.07 |
C++ | 묶음 타입(구조체와 공용체) (0) | 2021.08.06 |
C++ | char 타입과 wchar_t 타입 (0) | 2021.08.06 |
C++ | void 타입과 unspecified (0) | 2021.08.06 |