개요
제가 저번 글에서 다음 글은 메모리와 빌드가 될 것이라고 얘기한적이 있습니다.
하지만 오늘의 주제는 열거형(Enum)입니다.
왜냐하면 생각해보니 어제 정리했던 콘솔 / 입력 이 제가 지금 정리하는 열거형 보다 다음 진도이기 때문입니다.
겹치는 부분은 별로 없기 때문에 빠르게 다시 정리하러 왔습니다.
열거형 단 하나만 다루기 떄문에 분량이 굉장히 짧습니다.
원래 같이 배운 힙 메모리에 관한 내용이 있는데 이건 다음 정리글이 될 예정인 메모리와 빌드에서 같이 정리하겠습니다.
열거형
열거형, Enum은 int형 상수에 이름을 붙인 것과 같습니다.
#define과 비슷한 느낌이지만 매크로가 아니고 int와의 형변환이 자유롭지 않습니다.
enum은 다음과 같이 선언하며
enum FRUIT
{
APPLE, // 0
BANANA, // 1
KIWI // 2
}
바로 전 구성 요소에서 +1을 한 값을 가지고 있습니다.
초기값이 0이 아닐 수도 있고 불규칙 적으로 값을 뒤바꿀 수 있어서 단순 가독성이 아닌 숫자로서의 기능도 하는 편입니다.
enum class?
C++에선 enum의 종류가 2가지 입니다.
첫번째는 방금 말한 enum, 두번째로는 enum class 입니다.
둘 다 선언 방법이나 활용 방법은 똑같은데 차이가 있습니다.
enum class는 enum의 문제점을 보완하게 만들어졌거든요.
과거에 있던 enum의 문제점은
- 암시적 형변환
- 이름 충돌
이 있었습니다.
예를 들어봅시다.
enum FRUIT
{
APPLE, // 0
BANANA, // 1
KIWI // 2
}
int main()
{
int apple = FRUIT::APPLE;
FRUIT banana = 1;
}
다음과 같은 상황에서 apple에는 enum 값이 암시적으로 형변환되며 문제가 없지만
banana에 들어간 1은 형변환이 되지 않아서 컴파일 에러가 납니다.
이것만 봤을때는 딱히 문제가 없어 보이는데 진짜 문제는 두번째입니다.
enum PLAYERSTATE
{
IDLE,
ATTACK
}
enum ENEMYSTATE
{
IDLE,
ATTACK
}
int main()
{
PLAYERSTATE playetState = PLAYERSTATE::ATTACK;
}
다음과 같은 상황에서 컴파일 에러가 납니다.
enum의 이름은 다르더라도 내부 구성 요소의 이름이 같다면 컴파일러가 이를 구분하지 못해서 오류가 납니다.
그렇기 때문에 C++11 부터 enum class가 생긴것이죠.
enum class의 특징으로는 절대 암시적 형변환을 지원하지 않고,
원래 FRUIT apple = APPLE;
과 같이 어느 enum인지 표시하지 않아도 되던 enum과 달리 명시적으로 FRUIT apple = FRUIT::APPLE
표기해줘야 한다는 차이가 있습니다.
마치는 말
와!! 개날먹!
앞으로 간간히 이런글을 좀 써야겠네요. 감사합니다.
'개발 > C++' 카테고리의 다른 글
C++ | 동적 배열 (3) | 2024.04.17 |
---|---|
게임 프로그래밍 | C++ | 메모리 구조 (0) | 2024.04.17 |
게임 프로그래밍 | C++ | 콘솔 / 입력 (1) | 2024.04.08 |
자료구조 | C++ | 클래스 (1) | 2024.04.05 |
자료구조/게임 프로그래밍 | C++ | 함수, 포인터 (1) | 2024.03.28 |