[유니티 / C#] 열거형(Enumeration Type)

열거형이란?

열거형 형식은 기본 정수 형식의 명명된 상수 집합에 의해 정의된 값 형식입니다.
쉽게 말해 열거형의 값은 정수형이지만 뜻이 있는 이름을 붙여준다 생각하면 됩니다.

 

 

 

열거형 사용법

 

enum 키워드를 통해 열거형을 생성할 수 있습니다.

 

아래에서 생성한 PlayerState 타입의 열거형을 보시면 총 6개의 상태가 있습니다.

각 상태들은 사실 0 ~ 5의 값을 가지고 있지만 이해하기 쉽게 상태 이름을 붙여놓은 것입니다.

//열거형 생성
enum PlayerState
{
    Idle,         // 0
    Walk,         // 1
    Run,          // 2
    Jump,         // 3
    Attack = 20,  // 이렇게 직접 정수값을 정해줄 수 있음, 뒤의 멤버들도 20부터 증가
    Dead          // 21
}

 

 

 

열거형은 보통 상태를 제어하거나 몬스터의 타입을 정의해 주는 등의 상황에서 유용하게 쓰입니다.

 

 

PlayerState를 직접 생성하고 바꾸고 싶은 타이밍에 직접 상태를 대입해 주면 됩니다.

PlayerState state;          //PlayerState 생성

state = PlayerState.Run;    //state를 Run 상태로 변경

state = (PlayerState)3;     //숫자로도 변경 가능

 

 

 

예제. 플레이어 상태 입력하기

 

게임을 개발할 때 필수적인 요소인 플레이어의 상태에 따라 제어해주는 코드를 예제로 만들어보겠습니다.

간단한 예제를 위해서 switch문을 통해 작성하였으나 실제 개발 과정에선 인터페이스 등을 이용하여 상속을 통해 상태를 제어하시는게 훨씬 좋습니다.

 

더보기
더보기

< 열거형 예제 >

//PlayerState 타입 열거형
enum PlayerState
{
    Idle,    // 0
    Walk,    // 1
    Run,     // 2
    Jump,    // 3
    Attack,  // 4
    Dead     // 5
}

static void Main(string[] args)
{
    PlayerState state;  //PlayerState 타입의 state 변수 선언

    Console.Write("상태를 입력해주세요: ");

    string input = Console.ReadLine();  //input 변수에 사용자 입력값을 받음
    Enum.TryParse(input, true, out state);  //입력받은 문자열을 Enum형으로 변환 후 state에 대입

    switch(state) //입력값에 따라 case문 출력
    {
        case PlayerState.Idle:
            Console.WriteLine("상태: 서있기");
            break;
        case PlayerState.Walk:
            Console.WriteLine("상태: 걷기");
            break;
        case PlayerState.Run:
            Console.WriteLine("상태: 달리기");
            break;
        case PlayerState.Jump:
            Console.WriteLine("상태: 점프");
            break;
        case PlayerState.Attack:
            Console.WriteLine("상태: 공격");
            break;
        case PlayerState.Dead:
            Console.WriteLine("상태: 사망");
            break;
        default:
            Console.WriteLine("잘못된 입력입니다.");
            break;
    }
}

 

 

먼저 플레이어의 상태 멤버를 정할 PlayerState 타입의 열거형을 만듭니다.

enum PlayerState
{
    Idle,
    Walk,
    Run,
    Jump,
    Attack,
    Dead
}

 

 

PlayerState 타입의 변수 state를 선언합니다.

PlayerState state;

 

 

string 변수를 선언 후 사용자 입력을 받은 후 Enum 타입으로 캐스팅 하여 위에서 선언한 state 변수에 할당합니다.

Console.Write("상태를 입력해주세요: ");

string input = Console.ReadLine();
Enum.TryParse(input, true, out state); // input 문자열을 Enum형으로 변환 후 state에 할당
                                       // 두 번째 매개변수는 대소문자 구분을 할 것인지에 대한 것
                                       // true => 대소문자 구분 X / false => 대소문자 구분 O

 

 

switch문을 이용해 state 변수의 값에 따라 명령을 수행합니다.

switch(state)
{
    case PlayerState.Idle:
        Console.WriteLine("상태: 서있기");
        break;
    case PlayerState.Walk:
        Console.WriteLine("상태: 걷기");
        break;
    case PlayerState.Run:
        Console.WriteLine("상태: 달리기");
        break;
    case PlayerState.Jump:
        Console.WriteLine("상태: 점프");
        break;
    case PlayerState.Attack:
        Console.WriteLine("상태: 공격");
        break;
    case PlayerState.Dead:
        Console.WriteLine("상태: 사망");
        break;
    default:
        Console.WriteLine("잘못된 입력");
        break;
}