[C++] enum과 enum 클래스

2024. 4. 4. 09:51Programming Language/C++

아래 링크 클릭 시 해당 본문으로 이동

enum

enum 클래스


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;
}