본문 바로가기

C++ 일기

12. 열거형 타입 enum

앞서 switch문을 다룰 때, switch는 if문과는 다르게 조건을 비교 연산자로 설정할 수 없고,

오직 상수로만 정할 수 있다고 하였다.

따라서 switch문을 사용할 때 아래와 같은 문제점이 발생하기도 한다.

 

#include<iostream>

int main()
{
   int input = 0;
   std::cout << "행동하기 (1. 이동 2. 공격 3. 방어 4. 회피 5. 스킬) : ";
   std::cin >> input;
   
   switch(input)
   {
   case 1:
      // 이동하기
      break;
   case 2:
      // 공격하기
      break;
   case 3:
      // 방어하기
      break;
   case 4:
      // 회피하기
      break;
   case 5:
      // 스킬 사용
      break;
   default:
      break;
   }
}

위와 같은 형태로 분기를 나누면, 1번부터 5번에 해당하는 행동이 무엇인지 switch문만 보고는 알기 어렵고,

위의 행동선택지를 참고하여 각 switch문에 해당하는 행동이 무엇인지를 알아내야 한다.

위와 같은 예시는 단순한 형태로, 가독성이 떨어지는 것이 크게 느껴지지는 않지만,

코드가 복잡하거나 분기가 많아지면 코드를 짜면서도 많이 어려움을 느낄 수 있다.

 

 

이를 위해, enum을 사용하여 상수를 글자로 표현하여 가독성을 올릴 수 있다.

enum은 0부터 나열되어있는 상수에 직접 원하는 문자를 대입하여 상수 대신에 문자를 사용할 수 있게 하는 자료형으로,

switch문의 분기를 알기 쉽게 표현하거나, 상수에 직접 의미를 부여하고 싶을 때 사용할 수 있다.

enum의 사용법은 다음과 같다.

#include<iostream>

enum ACTION
{
   NONE,
   MOVE,
   ATTACK,
   GUARD,
   DODGE,
   SKILL
};

int main()
{
   int input = 0;
   std::cout << "행동하기 (1. 이동 2. 공격 3. 방어 4. 회피 5. 스킬) : ";
   std::cin >> input;
   
   switch(input)
   {
   case MOVE:
      // 이동하기
      break;
   case ATTACK:
      // 공격하기
      break;
   case GUARD:
      // 방어하기
      break;
   case DODGE:
      // 회피하기
      break;
   case SKILL:
      // 스킬 사용
      break;
   default:
      break;
   }
}

먼저 enum의 이름을 입력하고, 중괄호 안에 0부터 시작하는 상수에 해당하는 의미를 문자로 입력하면 된다.

enum의 맨 첫번째로 오는 문자에는 상수 0이 저장되기 때문에, 사용에 유의하여야 한다.

또한 아래처럼 enum에 직접 상수를 대입하여 그 값을 바꿀 수도 있다.

#include<iostream>

enum NUMBER
{
   ZERO,
   THREE = 3,
   FOUR,
   SIX = 6,
   SEVEN
};

int main()
{
   std::cout<< ZERO + THREE + SEVEN;
   // 출력값 10
}

enum에 직접 상수를 대입하면 해당 enum이 그 상수를 갖게되고, 그 이후의 enum은 해당 상수에서 1씩 더한 값을

차례로 가지게 된다.

위 처럼 THREE에 3을 대입한다면 다음으로 오는 FOUR가 4를 갖게되고,

SIX에 6을 대입하면 다음으로 오는 SEVEN이 7의 값을 갖게 된다.

 

 

 

enum의 대표적 사용처는 switch이지만, 이 외에도 배열이나 다른 자료형을 다룰 때,

상수를 사용한 데이터 관리에 매우 용이하다.

메모리 절약적 측면의 효율성이나, 반복작업 회피처럼 직접적으로 효율적인 코딩에 영향을 끼치지는 않지만,

사용자의 편의성 측면에 굉장히 유용하며, 효율적인 코딩 만큼이나 중요한 가독성을 올리는데에 큰 기여를 한다.

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

14. 사용자 정의 자료형 struct (구조체)  (2) 2024.02.27
13. 난수 발생  (0) 2024.02.27
11 - 2. 함수 오버로딩  (2) 2024.02.26
11 - 1. 함수  (2) 2024.02.26
10. 배열 (array[])  (0) 2024.02.23