C++

[C++] 둘이 뭐가 다른데? Enum vs Enum class

차차냥 2023. 12. 22. 00:18

사실 내가 Enum class 를 쓰게된지는 얼마 되지 않았다.

Enum 을 쓰던 버릇이 남아있었기 때문이었다.그러나 실제 업무를 하다보니 다른 실무자분들은 Enum class를 주로 쓰고 있었기에, 코드 스타일을 맞추려 Enum class를 쓰려고 노력하게 되었다.

 

그러던 어느 날, Enum class를 쓴 내 코드를 보고 팀장님이 던진 한마디."너, 여기서 Enum class 왜 쓰는지 알고 쓰는거야?"

 

Enum class와 Enum의 차이에 대해 자세히 인지하지 못하고, 언제쓰면 효율적인지 알고 쓰는게 중요함을 잊고 무지성으로 코드를 짜려고했던 나를 돌아보게 하는 날이었다.


 

열거형 (Enumerator)

 

열거형을 쓰는 이유

  • 프로그래머가 봤을 때, 직관적이기 때문에 가독성이 좋다.

enum 으로 구성된 전체의 형태는 '열거형' 이라고 칭하고,
그 안의 부속품들은 '열거자'라고 칭한다. (ARMOR, WEAPON, FACE)

열거자들은 대문자로 넣는게 일반적이며, 코드 내 다른 변수명들과 쉽게 구분하기 위해서이다.

 

열거자들은 정수 값이 자동 할당 된다. 정수 값은 양의 값, 음의 값이 모두 가능하다.

[참고 1] 처럼 정수 값을 명시하지 않은 경우엔 정수 값 0부터 시작된다.
하단으로 갈 수록 +1이 되므로

ARMOR = 0, WEAPON = 1, FACE = 2 라고 보면 되겠다.

꼭 정수 값 0으로 시작하지 않아도 된다.

 

[참고 2] 처럼 ARMOR 의 옆에 = 10을 붙이고, WEAPON과 FACE의 정수 값을 지정하지 않으면 자동으로 11, 12로 각각 자동 할당된다.

 

Enum의 특징, 정수 대입 가능

이처럼 정수로 할당되는 Enum 은 int 변수에 바로 대입할 수 있다.

다만 반대로 정수 값을 Enum으로 변환해서 표현하려고 할 때는, 바로 대입은 안되고 static_cast 를 통해 변환이 가능하다.


그래서, Enum class는 뭐가 다른데?

  • 선언은 enum class로 시작을 한다.
  • 다른 enum과 비교를 하거나, 정수형 비교와 같은 다른 자료형 비교가 불가능해진다. (열거형 비교를 남발하면서 생기는 문제점을 방지하는 효과)
  • 기존의 enum은 열거자 WEAPON만 쓸 수 있었다면, enum class에서는 해당 열거자의 열거형을 같이 보여줘야한다.(ECostumeType::WEAPON) . 범위지정 연산자가 없으면 오류를 발생시킨다.
  • 보통 enum class에서는 열거형의 이름 뒤에 자료형(int8)을 명시함으로서 해당 열거형의 열거자들이 어떤 자료형인지 알게 하고, 크기 할당이 가능하다. (추가. enum 에서도 가능해졌다) 

 

그럼 언제 Enum을 쓰는게 좋고, 언제 Enum class를 쓰는게 좋지?

 

아래에 나열된 열거형들을 보자.

ECostumeType은 내가 입을 수 있는 아이템 유형의 목록이고, EShopItemType은 상점에서 파는 아이템 목록이다.

이런식으로 ECostumeType::WEAPON 과 EShopItemType::WEAPON은 완전히 다른 개념이어서 혼동해서 바꿔쓰는 실수를 방지할 수 있을 때 좋다.

특히 int로 변환해서 사용 할 때 enum을 쓸 때 가능하던 묵시적 형변환이 enum class에선 불가능하므로, 혼동을 방지한다.

 

그러나 한 클래스 내에 다른 enum이 없고 int로의 형 변환이 자주 일어나는 상황이라면 묵시적 형변환이 가능한 enum을 쓰는 것이 편할 때도 있다.

 

즉, enum class는 필수적으로 사용해야 하는 것은 아니다. 실수를 방지하기 위해 나온 기능이니, 실수가 일어나지 않을 상황인지 판단하고, 코드 스타일에 따라 자유롭게 응용 가능하다는 점을 기억하자.

 

 

더 읽어보면 좋을 글

https://unikys.tistory.com/376

 

[C++11] enum과 enum class

* 최근에 C++로 코딩하면서 옛날에 머물러있었던 C++ 개발 실력이었기 때문에 새로 보는 내용들이 아주 많다. 지금은 그냥 여기서 그렇게 하고 있으니까 따라한다는 마음이 크지만, 조금씩은 왜

unikys.tistory.com

 

'C++' 카테고리의 다른 글

C++11 auto  (0) 2023.02.16