어떠한 상태에 따라 값이 바뀌게 하고 싶을 때 열거형인 Enum을 자주 사용하고있다. 시도하는 과정 중에서 굉장히 간단했던 건데 잘 처리를 못한 스스로를 반성하며 기록으로 남긴다.
현재 나는 게임 내에서 작동하는 Save & Load 시스템을 제작하고 있다. 유저, AI 들의 위치 값들을 잘 불러오고 있으나 현재 Episode가 몇 번인지 불러오기 위해 Enum의 상태 체크를 해야 하던 상황이다.
위치 값의 경우는 종료되는 시점에 필요한 값들을 저장 해주면 되는데, Episode(Enum)의 경우는 흔히 저장할 때 썻던 int, bool과 같은 형식이 아니라 다른 방법을 써야 하지 않나 고민이 되었다.
원하는 구조는 enum의 상태가 0 부터 시작하는 숫자로 되어있으니 현재 상태를 int로 저장해놓고 불러오는 방식으로 구현하고 싶었다. 또한 괜히 int 변수 하나를 더 만들어 저장해놓고 싶지는 않았다.
아직은 감이 잘 오지 않아 일단 Enum에서 어떠한 메소드 들이 있나 MS Docs를 찾아 봤다.
https://docs.microsoft.com/ko-kr/dotnet/api/system.enum?view=net-6.0
System.Enum.GetName
System.Enum.GetName(typeof(EpisodeState), 4);
GetName은 Value를 통해 이름(String)을 반환하는 것 return 값으로 "Episode3"이 반환 된다.
System.Enum.IsDefined
현재 있는 Enum의 개수 만큼 저장 된다.
for (int i = 0; i < max; i++)
{
if (System.Enum.IsDefined(typeof(EpisodeState), i))
missionNum = i;
}
IsDefined 해당 Enum 있는지 체크하고 return 값으로 해당 bool 값이 반한된다.
이런게 있구나 라는 정도로 봐도 잘 모르겠어서 비슷한 케이스가 있나 검색을 하다 어느정도 힌트를 얻었다.
System.Enum.Parse(type, string)
-- 다형성 되어있으나 이번 문제 해결에는 요걸 사용
이 메소드를 int로 캐스팅를 할 경우 현재 state를 string으로만 넣어주면 원하던 대로 int 값으로 저장을 해서 보관을 할 수 있을 것 같았다.
string 값은 정말 간단하게 현재 상태를 .ToString() 으로 변환하여 문자열 타입으로 대입해주니 원하는 대로 저장이 되었다
(int)System.Enum.Parse(typeof(불러오고자 하는 State), 불러오고자 하는 State 변수명.ToString())
아래는 내 코드에 적용 예시
(int)System.Enum.Parse(typeof(EpisodeState),
EpisodeManager.episodeManager.episodeState.ToString())
지금 생각해보면 정말 별거 아닌데 enum 값을 .ToString() 변환할 수 있다는 거 자체를 생각하지 못해서 시간이 오래 걸려버렸다..
자주 사용하는 만큼 탐구가 부족했던 것이라고 생각 된다. 그래도 이번 기회에 조금 더 Enum과 친해진것 같아 나름 뿌듯 ^-^