게임 프로그래밍 | C++ | 열거형

2024. 4. 10. 23:51·개발/C++

개요

제가 저번 글에서 다음 글은 메모리와 빌드가 될 것이라고 얘기한적이 있습니다.

하지만 오늘의 주제는 열거형(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의 문제점은


  1. 암시적 형변환
  2. 이름 충돌

이 있었습니다.


예를 들어봅시다.

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++ | 연산자 오버로딩 (Overload)  (1) 2024.04.23
게임 프로그래밍 | C++ | 메모리 구조  (0) 2024.04.17
게임 프로그래밍 | C++ | 콘솔 / 입력  (1) 2024.04.08
자료구조 | C++ | 클래스  (1) 2024.04.05
자료구조/게임 프로그래밍 | C++ | 함수, 포인터  (1) 2024.03.28
'개발/C++' 카테고리의 다른 글
  • 자료구조 | C++ | 연산자 오버로딩 (Overload)
  • 게임 프로그래밍 | C++ | 메모리 구조
  • 게임 프로그래밍 | C++ | 콘솔 / 입력
  • 자료구조 | C++ | 클래스
SundG0162
SundG0162
블로그 프로필은 머핀입니다.
  • SundG0162
    게임개발고수가될거야
    SundG0162
  • 전체
    오늘
    어제
    • 분류 전체보기 (77) N
      • 주저리 (2)
        • 잡담 (1)
        • 장현우 (0)
        • 회고록 (1)
      • 개발 (50)
        • CITADEL : 성채 (1)
        • HEXABEAT (1)
        • FRACTiLE (6)
        • UNNAMED (9)
        • Default Defense (10)
        • T-Engine (1)
        • Project EW (0)
        • 졸업작품 (0)
        • Unity (3)
        • C# (4)
        • C++ (13)
        • WinAPI (1)
        • 그 외 (0)
      • 알고리즘 (13) N
        • C# (1)
        • C++ (12) N
      • 자료구조 (2)
        • C++ (1)
        • C# (0)
        • 공용 (1)
      • 기타 (10)
        • 아트 (6)
        • AI (2)
        • 수학 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩
    코딩트리조별과제
    코딩테스트
    생성형ai
    AI
    티스토리챌린지
    C#
    LLM
    코드트리
    오블완
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
SundG0162
게임 프로그래밍 | C++ | 열거형
상단으로

티스토리툴바