열거형(enum)
귀찮고 생각보다 헷갈리는게 enum
이다. 아마 나를 포함한 초보들은 더 그렇다. 잘 사용하지 않기 때문이다.
변수를 표현할 때, 나는 종종 매직 넘버로 디자인한다. 매직 넘버는 쉽게 말하자면 정의되지 않은 값을 말한다. 예를 들어 요일을 표현할 때, 일요일이 0인지 월요일이 0인지는 사람마다 다르게 생각할 것이다. 이를 방지하기 위해서 다음과 같이 디자인할 수 있다.
enum Week {
SUN,
MON,
TUE,
WED,
THU,
FRI,
SAT
};
// 한 줄로도 가능: enum Week {SUN, MON, TUE, WED, THU, FRI, SAT};
이번 포스팅에서는 enum과 enum class에 대해서 서술할 예정이다.
1. C/C++ 둘 다 사용 가능한 enum
1-1 enum
기본 문법
일반적인 enum
은 C와 C++ 둘 다 사용 가능하다. 예를 들어 노트북을 만드는 회사를 열거형으로 표현한다면 다음과 같다.
#include <iostream>
enum Laptop {
SAMSUNG,
APPLE,
ASUS
};
int main() {
Laptop myLaptop = ASUS;
std::cout << myLaptop << std::endl;
return 0;
}
1-2 묵시적 형변환(implicit type conversion)
위 결과를 보면 ASUS
가 아닌 2
를 출력한다. enum
은 묵시적 형변환(implicit type conversion)이 이루어짐을 의미한다. 따라서 다음과 같은 연산도 가능하다.
std::cout << ASUS - 1 << std::endl;
마치 용도가 const int
와 같다.
1-3 enum
값 지정
enum
에서 초기값을 줄 수도 있다. 위 코드에서 다음과 같이 바꾸고 각각 출력해 봤다.
enum Laptop {
SAMSUNG,
APPLE = 5,
ASUS
}
이렇듯 기본 enum
은 매직 넘버를 줄이기 위해 사용될 수 있다.
Laptop
형 변수에 enum
이외의 값을 넣어봤다.
Laptop myLaptop = 2;
std::cout << myLaptop << std::endl;
2. C++만 사용 가능한 enum class
2-1 enum class
기본 문법
만약 enum
에서 멤버가 겹치는 경우는 어떨까? 위 예시에서 국내 노트북 브랜드를 추가해서 열거형으로 표현해봤다.
enum Laptop {
SAMSUNG,
APPLE,
ASUS,
LG
};
enum KOR_Laptop {
SAMSUNG,
LG
};
이때 enum class
를 사용하면 컴파일 에러 없이 사용할 수 있다. 단, enum class
를 사용하면 묵시정 형변환이 이루어지지 않는다.
int main() {
int myLaptop = SAMSUNG;
return 0;
}
2-2 enum class
와 static_cast
enum class
를 int
로 바꿔주기 위해서는 static_cast
를 사용해야 한다.
int main() {
Laptop myLaptop = Laptop::SAMSUNG;
int myLaptopNum = static_cast<int>(myLaptop);
std::cout << myLaptopNum << std::endl;
return 0;
}
static_cast<Type_to>(Var_from)
: Type_to에 바꿀 타입(위 경우는 Laptop
에서 int
이므로 int
), Var_from에 바꿀 변수(위 경우는 myLaptop
을 바꾸고 싶으므로 myLaptop
)을 넣으면 된다. 이때 (위)[http://gsgh3016.github.io/c++/Cpp_enum/#1-3-enum-%EA%B0%92-%EC%A7%80%EC%A0%95] 코드처럼 값을 초기화한 경우에는 초기화한 값이 나온다.
Leave a comment