본문 바로가기
C#

Enum을 활용한 Dictionary 이해하기

by Oz Driver 2025. 4. 28.

 

enum 은 무엇인가요?

C# 에서 enum은 상수들의 집합을 의미합니다. 기본적으로 0부터 숫자가 자동으로 할당되지만, 명확하게 = 0을 지정해주는 것이 좋습니다. 이렇게 하면 배열이나 다른 자료구조와 연동할 때 헷갈릴 위험이 줄어듭니다.

enum PlayerState
{
    Idle = 0,
    Run,
    Jump
}

 

위와 같이 작성하면 Idle은 0, Run은 1, Jump는 2의 값을 갖습니다. 특별히 값을 지정하지 않으면 1씩 증가합니다.

 

문자열로부터 enum 값을 얻는 방법 (Enum.TryParse)

문자열을 enum 값으로 변환해야 하는 상황에서는 Enum.TryParse<T>() 메서드를 사용합니다. 예를 들어, "Run"이라는 문자열이 있을 때 이를 PlayerState.Run으로 변환할 수 있습니다.

Enum.TryParse<PlayerState>("Run", out PlayerState state);
Debug.Log(state);
// 출력 : Run

 

변환에 성공하면 state에는 PlayerState.Run 값이 저장됩니다. 변환에 실패하면 false를 반환하므로, 안전하게 실패 처리를 할 수 있습니다.

int.TryParse와의 비교

int.TryParse("123", out int number)처럼, int는 단일 타입이기 때문에 제네릭을 쓰지 않습니다.

하지만 enum은 여러 종류가 있을 수 있습니다. 예를 들어, PlayerState, MonsterState, WeaponState처럼 서로 다른 enum이 존재합니다.

따라서 enum 변환에서는 어떤 enum 타입으로 변환할지 알려줘야 하기 때문에 Enum.TryParse<변환할타입>() 형태로 제네릭을 사용하는 것입니다.

 

배열과 enum 을 함께 사용할 때 주의할 점

enum을 이용하여 배열에 접근할 때는 주의가 필요합니다. 배열은 항상 0부터 시작하지만, enum 값이 0부터 시작하지 않는다면 배열 인덱스가 어긋날 수 있습니다.

enum PlayerState
{
    Idle = 3,
    Run,
    Jump
}

 

위에서 처럼 3부터 시작한다면, 배열의 인덱스 [3], [4], [5]를 사용할 수 있도록 배열 크기를 크게 잡아야 합니다. 이 경우 0~2 인덱스가 비게 되어 메모리 낭비가 발생할 수 있습니다.

따라서 배열과 enum을 연동할 때는 enum 값을 0부터 연속적으로 정의하는 것이 가장 안전하고 깔끔한 방법입니다.

 

Dictionary 를 사용하는 방법과 간단한 사용 예시

배열 대신 Dictionary를 사용하면, enum 값이 띄엄띄엄이어도 쉽게 관리할 수 있습니다. Dictionary를 초기화할 때는 다음과 같이 간단하게 작성할 수 있습니다.

var playerStateDic = new Dictionary<PlayerState, string>
{
    { PlayerState.Idle, "지금은 Idle 상태입니다." },
    { PlayerState.Run, "지금은 Run 상태입니다." },
    { PlayerState.Jump, "지금은 Jump 상태입니다." }
};

 

이렇게 작성하면 PlayerState 값에 맞는 설명을 바로 연결할 수 있습니다.

Dictionary 를 사용하는 예시

string runStateText = playerStateDic[PlayerState.Run];
Debug.Log(runStateText);
// 출력 : 지금은 Run 상태입니다.

 

배열처럼 인덱스를 따질 필요가 없고, 이름만 알면 쉽게 접근할 수 있습니다.

enum 을 순회하여 Dictionary 자동 채우기

모든 PlayerState 항목에 대해 Dictionary를 자동으로 만들고 싶을 때는, foreach 문을 사용하여 간단하게 채울 수 있습니다.

var playerStateDic = new Dictionary<PlayerState, string>();

foreach (PlayerState state in Enum.GetValues(typeof(PlayerState)))
{
    playerStateDic.Add(state, "지금은 " + state + " 상태입니다.");
}

 

Enum.GetValues()를 사용하여 PlayerState 항목들을 하나씩 가져옵니다. 가져온 항목을 키로 하여 "지금은 Idle 상태입니다.", "지금은 Run 상태입니다."처럼 자동으로 문자열을 추가합니다.

확인 예시

string idleText = playerStateDic[PlayerState.Idle];
Debug.Log(idleText);
// 출력 : 지금은 Idle 상태입니다.

string jumpText = playerStateDic[PlayerState.Jump];
Debug.Log(jumpText);
// 출력 : 지금은 Jump 상태입니다.

 

마무리

enum은 코드의 가독성을 높여주고, Dictionary를 이용하면 복잡한 상태 관리도 훨씬 깔끔하고 안전하게 할 수 있습니다. 특히 상태별로 이름이나 설명을 연결하고 싶을 때 매우 유용하므로, 이번 기회에 enum과 Dictionary를 함께 사용하는 방법을 꼭 익혀두시기 바랍니다.