C#에서 enum은 열거형이라고 부른다.
열거형은 서로 관련 있는 상수들을 하나의 이름으로 묶어서 관리할 때 사용하는 자료형이다.
예를 들어 캐릭터의 상태를 숫자로 관리한다고 해보자.
int state = 0;
이 코드만 보면 0이 어떤 상태를 의미하는지 바로 알기 어렵다.
하지만 enum을 사용하면 상태를 이름으로 표현할 수 있다.
enum PlayerState
{
Idle,
Move,
Attack,
Die
}
이제 상태를 이렇게 사용할 수 있다.
PlayerState state = PlayerState.Idle;
Idle이라는 이름을 보고 현재 상태가 대기 상태라는 것을 쉽게 알 수 있다.
1. 열거형이란?
열거형은 정해진 값들 중 하나를 선택해서 사용할 수 있는 자료형이다.
예를 들어 방향을 표현할 때는 다음과 같이 만들 수 있다.
enum Direction
{
Up,
Down,
Left,
Right
}
이제 방향을 문자열이나 숫자로 직접 쓰지 않고 enum으로 표현할 수 있다.
Direction dir = Direction.Up;
즉, enum은 여러 선택지를 하나로 묶어두고 그중 하나를 골라 사용하는 방식이다.
2. enum을 사용하는 이유
1) 코드의 의미가 명확해진다
숫자로 상태를 표현하면 의미를 알기 어렵다.
int state = 2;
이 코드만 보면 2가 이동 상태인지 공격 상태인지 알기 어렵다.
하지만 enum을 사용하면 의미가 분명해진다.
PlayerState state = PlayerState.Attack;
이렇게 작성하면 현재 상태가 공격 상태라는 것을 바로 알 수 있다.
2) 실수를 줄일 수 있다
문자열로 상태를 관리하면 오타가 날 수 있다.
string state = "Attak";
Attack을 써야 하는데 Attak이라고 잘못 입력할 수 있다.
하지만 enum은 미리 정해둔 값만 사용할 수 있기 때문에 이런 실수를 줄일 수 있다.
PlayerState state = PlayerState.Attack;
3) 관련 있는 값을 한곳에 모을 수 있다
아이템 등급, 몬스터 상태, 게임 상태처럼 관련 있는 값들을 하나로 묶을 수 있다.
enum ItemGrade
{
Common,
Rare,
Epic,
Legendary
}
이렇게 하면 아이템 등급을 따로따로 관리하지 않고 하나의 enum으로 관리할 수 있다.
3. enum의 기본 문법
enum은 다음과 같이 선언한다.
enum 열거형이름
{
값1,
값2,
값3
}
예시는 다음과 같다.
enum GameState
{
Title,
Playing,
Pause,
GameOver
}
사용할 때는 enum 이름과 값을 함께 적는다.
GameState state = GameState.Playing;
4. enum의 내부 값
enum은 겉으로는 이름처럼 보이지만, 내부적으로는 숫자 값을 가진다.
기본적으로 첫 번째 값은 0부터 시작한다.
enum PlayerState
{
Idle, // 0
Move, // 1
Attack, // 2
Die // 3
}
따라서 Attack은 내부적으로 숫자 2에 해당한다.
int value = (int)PlayerState.Attack;
Console.WriteLine(value);
출력 결과는 다음과 같다.
2
5. enum 값 직접 지정하기
enum의 숫자 값을 직접 지정할 수도 있다.
enum ItemGrade
{
Common = 1,
Rare = 2,
Epic = 3,
Legendary = 4
}
이 경우 Common은 1, Rare는 2, Epic은 3, Legendary는 4가 된다.
중간 값만 지정하면 그 뒤의 값은 자동으로 1씩 증가한다.
enum MonsterType
{
Slime = 10,
Goblin, // 11
Orc, // 12
Dragon // 13
}
6. enum과 switch문
enum은 switch문과 함께 자주 사용된다.
enum PlayerState
{
Idle,
Move,
Attack,
Die
}
PlayerState state = PlayerState.Attack;
switch (state)
{
case PlayerState.Idle:
Console.WriteLine("대기 상태");
break;
case PlayerState.Move:
Console.WriteLine("이동 상태");
break;
case PlayerState.Attack:
Console.WriteLine("공격 상태");
break;
case PlayerState.Die:
Console.WriteLine("사망 상태");
break;
}
상태에 따라 다른 동작을 실행해야 할 때 enum과 switch문을 같이 사용하면 코드가 깔끔해진다.
7. Unity에서 enum 사용하기
Unity에서도 enum은 자주 사용된다.
예를 들어 적의 상태를 enum으로 만들 수 있다.
public enum EnemyState
{
Idle,
Patrol,
Chase,
Attack,
Dead
}
그리고 스크립트에서 사용할 수 있다.
using UnityEngine;
public class Enemy : MonoBehaviour
{
public EnemyState state;
private void Update()
{
switch (state)
{
case EnemyState.Idle:
Debug.Log("대기 상태");
break;
case EnemyState.Patrol:
Debug.Log("순찰 상태");
break;
case EnemyState.Chase:
Debug.Log("추격 상태");
break;
case EnemyState.Attack:
Debug.Log("공격 상태");
break;
case EnemyState.Dead:
Debug.Log("사망 상태");
break;
}
}
}
public으로 선언한 enum 변수는 Unity Inspector에서 드롭다운으로 선택할 수 있다.
public EnemyState state;
이렇게 하면 숫자를 직접 입력하지 않고 상태를 선택할 수 있어서 편리하다.
8. enum과 접근 제한자
enum에도 접근 제한자를 붙일 수 있다.
public enum GameState
{
Title,
Playing,
Pause,
GameOver
}
public을 붙이면 다른 스크립트에서도 사용할 수 있다.
클래스 안에 enum을 선언할 수도 있다.
public class Player
{
public enum PlayerState
{
Idle,
Move,
Attack
}
}
이 경우 사용할 때는 클래스 이름까지 함께 적어야 한다.
Player.PlayerState state = Player.PlayerState.Idle;
여러 스크립트에서 자주 사용할 enum이라면 클래스 밖에 따로 선언하는 것이 더 편할 수 있다.
9. enum과 문자열 변환
enum 값은 문자열로 변환할 수 있다.
PlayerState state = PlayerState.Attack;
string text = state.ToString();
Console.WriteLine(text);
출력 결과는 다음과 같다.
Attack
반대로 문자열을 enum으로 바꿀 수도 있다.
PlayerState state = (PlayerState)Enum.Parse(typeof(PlayerState), "Attack");
하지만 문자열에 오타가 있으면 오류가 발생할 수 있다.
그래서 더 안전하게 하려면 Enum.TryParse를 사용하는 것이 좋다.
PlayerState result;
bool success = Enum.TryParse("Attack", out result);
if (success)
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("변환 실패");
}
10. enum과 int 변환
enum은 숫자로 변환할 수 있다.
int value = (int)PlayerState.Move;
반대로 숫자를 enum으로 변환할 수도 있다.
PlayerState state = (PlayerState)1;
이 경우 1은 Move를 의미한다.
하지만 숫자를 enum으로 변환할 때는 주의해야 한다.
PlayerState state = (PlayerState)100;
이렇게 enum에 없는 숫자도 강제로 들어갈 수 있다.
따라서 enum은 가능하면 숫자보다 이름으로 사용하는 것이 좋다.
11. enum의 기본 자료형
enum은 기본적으로 int형을 기반으로 한다.
enum Test
{
A,
B,
C
}
필요하다면 다른 정수형을 사용할 수도 있다.
enum SmallType : byte
{
A,
B,
C
}
enum의 기반 자료형으로는 byte, short, int, long 같은 정수형을 사용할 수 있다.
하지만 특별한 이유가 없다면 기본값인 int를 그대로 사용하는 경우가 많다.
12. enum을 사용하기 좋은 상황
enum은 정해진 선택지가 있을 때 사용하기 좋다.
예를 들어 플레이어 상태를 표현할 수 있다.
enum PlayerState
{
Idle,
Move,
Jump,
Attack,
Die
}
게임 상태를 표현할 수도 있다.
enum GameState
{
Title,
Playing,
Pause,
GameOver,
Clear
}
아이템 종류를 표현할 수도 있다.
enum ItemType
{
Weapon,
Armor,
Potion,
Key
}
몬스터 종류를 표현할 수도 있다.
enum MonsterType
{
Slime,
Bat,
Goblin,
Boss
}
이처럼 enum은 상태, 종류, 등급처럼 정해진 값들을 표현할 때 유용하다.
13. enum을 사용하면 좋지 않은 상황
enum은 정해진 선택지를 표현할 때 좋지만, 모든 상황에 적합한 것은 아니다.
예를 들어 플레이어 이름은 enum으로 만들기 좋지 않다.
enum PlayerName
{
Minsoo,
Jisoo,
Chulsu
}
플레이어 이름은 사람마다 다르고 계속 바뀔 수 있기 때문에 string으로 관리하는 것이 더 적합하다.
string playerName = "Player";
또한 아이템의 이름, 가격, 설명, 이미지처럼 여러 정보를 저장해야 하는 경우 enum만으로는 부족하다.
enum ItemType
{
Potion,
Sword
}
이 코드는 아이템의 종류만 구분할 수 있다.
아이템의 가격이나 설명까지 관리하려면 클래스나 ScriptableObject를 함께 사용하는 것이 좋다.
14. enum과 클래스의 차이
enum은 종류를 구분할 때 사용한다.
enum WeaponType
{
Sword,
Bow,
Staff
}
클래스는 여러 정보를 가진 객체를 만들 때 사용한다.
class Weapon
{
public string name;
public int damage;
public int price;
}
즉, enum은 선택지 구분용이고, 클래스는 정보 저장용에 가깝다.
둘을 함께 사용할 수도 있다.
enum ItemType
{
Weapon,
Armor,
Potion
}
class Item
{
public string name;
public ItemType type;
public int price;
}
이렇게 하면 아이템의 종류는 enum으로 구분하고, 이름이나 가격 같은 정보는 클래스로 관리할 수 있다.
15. enum 이름 짓는 법
enum 이름은 보통 대문자로 시작하는 파스칼 케이스를 사용한다.
enum PlayerState
{
Idle,
Move,
Attack
}
enum 값의 이름도 대문자로 시작한다.
PlayerState.Idle
PlayerState.Move
PlayerState.Attack
또한 enum 이름은 보통 단수형으로 작성한다.
enum ItemType
{
Weapon,
Armor,
Potion
}
ItemTypes보다는 ItemType처럼 쓰는 것이 자연스럽다.
16. enum의 장점
enum의 장점은 다음과 같다.
- 코드의 의미가 명확해진다.
- 숫자나 문자열을 직접 쓰는 것보다 실수가 줄어든다.
- 관련 있는 값을 하나로 묶을 수 있다.
- switch문과 함께 사용하기 좋다.
- Unity Inspector에서 드롭다운으로 선택할 수 있다.
- 상태, 종류, 등급을 관리하기 좋다.
17. enum의 단점과 주의점
enum 값이 너무 많아지면 오히려 관리하기 어려워질 수 있다.
enum ItemType
{
Sword,
Axe,
Bow,
Staff,
Potion,
Key,
Map,
Coin,
Gem,
Book
}
값이 많아지고 각각의 데이터가 필요하다면 enum보다는 클래스나 ScriptableObject를 사용하는 것이 더 좋을 수 있다.
또한 enum은 단순히 값을 구분하는 역할만 한다.
자세한 정보를 저장하는 용도로는 적합하지 않다.
18. 실전 예제
아이템 등급에 따라 가격을 다르게 반환하는 코드를 작성해보자.
enum ItemGrade
{
Common,
Rare,
Epic,
Legendary
}
int GetPrice(ItemGrade grade)
{
switch (grade)
{
case ItemGrade.Common:
return 100;
case ItemGrade.Rare:
return 300;
case ItemGrade.Epic:
return 700;
case ItemGrade.Legendary:
return 1500;
default:
return 0;
}
}
사용 예시는 다음과 같다.
ItemGrade grade = ItemGrade.Epic;
int price = GetPrice(grade);
Console.WriteLine(price);
출력 결과는 다음과 같다.
700
이처럼 enum을 사용하면 등급별 처리를 깔끔하게 작성할 수 있다.
19. 정리
열거형 enum은 관련 있는 상수들을 이름으로 묶어서 관리하는 자료형이다.
숫자나 문자열로 상태를 표현하는 것보다 enum을 사용하면 코드의 의미가 더 명확해진다.
특히 게임 개발에서는 캐릭터 상태, 적 상태, 아이템 종류, 게임 상태, 등급 등을 표현할 때 자주 사용된다.
다만 enum은 단순히 종류나 상태를 구분하는 용도에 적합하다.
이름, 가격, 설명, 이미지처럼 여러 데이터를 함께 관리해야 한다면 클래스나 ScriptableObject를 함께 사용하는 것이 좋다.
결론적으로 enum은 정해진 선택지 중 하나를 표현할 때 사용하는 자료형이라고 정리할 수 있다.