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를 함께 사용하는 방법을 꼭 익혀두시기 바랍니다.
'C#' 카테고리의 다른 글
속성은 컴파일 단계에서 변수를 자동 생성합니다 (0) | 2025.04.28 |
---|---|
병합 할당 연산자(??=) 이해하기 (0) | 2025.04.28 |
대리자를 이용한 FSM 만들기 (0) | 2025.04.24 |
delegate 를 더 간결하게 선언하는 방법 (0) | 2025.04.23 |
bool isValue = (조건식) : 삼항 연산자를 보다 단순하게 (0) | 2025.04.22 |