2024. 4. 4. 09:51ㆍProgramming Language/C++
아래 링크 클릭 시 해당 본문으로 이동
enum
• 열거형 자료형
• 각 열거자는 열거 목록의 위치에 따라 정수 값이 자동으로 할당된다.
• 컴파일러가 기본적으로 첫 번째 열거자에는 정수 0을 할당하며, 그 이후 열거자는 이전 열거자에 1을 더한 값이 할당된다.
• 자동으로 값이 주어지지만 직접 숫자를 지정할 수도 있다.
숫자를 지정한 후의 만약 다음 열거자에 숫자를 지정하지 않았다면 1을 더한 값으로 할당된다.
• 열거형은 고유한 자료형이기 때문에 다른 열거형을 할당하려고 하면 컴파일 에러가 발생한다.
enum 타입은 enum값이 숫자로 간주되기 때문에 기본적으로 정수형이다.
• `enum` 식별자는 보통 모두 대문자로 이름을 짓는다.
enum MY_TYPE
{
// 컴파일러는 0부터 시작한 숫자로 받아들인다.
TYPE_1, // 0
TYPE_2, // 1
TYPE_3, // 2
TYPE_4, // 3
TYPE_5 = 100, // 직접 숫자를 지정할 수도 있다.
TYPE_6, // 101
};
enum OTHER_TYPE
{
//TYPE_1,
TYPE_10,
};
int main()
{
TYPE_1 type1 = 200; // 오류 => TYPE_1은 기본적으로 정수 0이므로, TYPE_1 타입 변수에 200을 할당할 수 없다.
return 0;
}
enum 클래스
이름이 겹치는 문제 때문에 enum 클래스가 나왔다.
그냥 enum을 사용하면 enum 클래스를 사용하라는 경고를 띄우기도 한다.
되도록이면 enum은 class로 사용하기
#define과의 차이점
전처리기 #define과 비슷하지만 디버깅할 때 편의성에서 차이가 난다.
`#define CLASS_1 0`을 하고 `int a = CLASS_1`을 하면 `int a = 0`인 것과 같다.
#define CLASS_1 0
int main()
{
int a = CLASS_1 // int a = 0와 같다.
return 0;
}
하지만 enum class로 선언해서 넣으면?
enum class MY_TYPE
{
TYPE_1, // 0
TYPE_2, // 1
TYPE_3, // 2
TYPE_4, // 3
TYPE_5 = 100,
TYPE_6, // 101
};
int main()
{
int a = (int)MY_TYPE::TYPE_1; // 0
return 0;
}
`int a = (int)MY_TYPE::TYPE_1;`도 0으로 받아들여지지만 `enum`이라는 이름 자체가 symbol table에 남는다.
그래서 디버깅할 때 컴파일러는 단순히 0을 넣었다고 받아들이지 않고 `MY_TYPE`의 `TYPE_1`값을 넣었다고 생각한다.
중단점 걸고 확인해보면 어떤 enum 타입의 무엇을 넣었는지 시각적으로 보인다.
ex) PLAYER 타입을 넣었다고 생각했는데 MONSTER 타입이 들어가 있을 때, 이를 시각적으로 확인할 수 있다.
반면, `#define`은 중단점으로 확인해봐도 값만 알 수 있다.
▷ 예시
enum class MY_TYPE
{
TYPE_1, // 0
TYPE_2, // 1
TYPE_3, // 2
TYPE_4, // 3
TYPE_5 = 100,
TYPE_6, // 101
};
enum class OTHER_TYPE
{
TYPE_1,
};
int main()
{
//int a = TYPE_6; // 101
//int a = TYPE_1; // 오류 (재정의) => MY_TYPE의 TYPE_1인지 OTHER_TYPE의 TYPE_1인지를 모르기 때문이다.
// *enum 클래스*
// enum 클래스로 사용할거면 반드시 어떤 클래스인지 적고 해당 타입으로 캐스팅을 해줘야 한다.
int a = (int)MY_TYPE::TYPE_1;
OTHER_TYPE::TYPE_1;
return 0;
}
'Programming Language > C++' 카테고리의 다른 글
[C++] BST의 중위 후속자, 중위 선행자 및 BST의 삭제 구현 (0) | 2024.04.04 |
---|---|
[C++] enum 클래스를 활용하여 BST(이진 탐색 트리) 구현 (0) | 2024.04.04 |
[C++] BST(이진 탐색 트리) 구현 (0) | 2024.04.03 |
[C++] friend 선언(클래스, 함수) (0) | 2024.04.03 |
[C++] vector 내부에 iterator 클래스 구현 (+ 연산자 오버로딩, 복사 생성자) (0) | 2024.04.03 |