유니티로 개발 중에 이상한 동작을 발견했습니다.
public class Test : MonoBehaviour { void Start() { for ( int i = 0; i < 6; ++i ) { Debug.Log( _classlass[ i ]._enumnum ); } } public Classlass[] _classlass = new Classlass[] { new Classlass{ _enumnum = ENUMNUM.qqq }, new Classlass{ _enumnum = ENUMNUM.www }, new Classlass{ _enumnum = ENUMNUM.eee }, new Classlass{ _enumnum = ENUMNUM.rrr }, new Classlass{ _enumnum = ENUMNUM.ttt }, new Classlass{ _enumnum = ENUMNUM.yyy } }; } public class Classlass { public ENUMNUM _enumnum = ENUMNUM.yyy; } public enum ENUMNUM { qqq, www, eee, rrr, ttt, yyy }
Test 클래스의 필드인 _classlass를 객체 초기화자로 초기화를 했는데요. Start 함수의 출력 결과를 보면 이렇습니다.
yyy UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8) www UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8) eee UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8) rrr UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8) ttt UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8) yyy UnityEngine.Debug:Log(Object) Test:Start() (at Assets/Test.cs:8)
보시면 다른 건 다 잘 나오는데 _classlass의 첫 번째 애는 qqq가 안 나오고 Classlass 초깃값인 yyy가 나옵니다. 코드 상 문제는 없는 것(제가 놓치고 있는 것이 있다면 알려주세요 ;ㅁ;) 같은데 이렇게 나오네요.
이넘을 public enum ENUMNUM { qqq = -3, www = -2, eee = -1, rrr = 0, ttt = 1, yyy = 2 }
이렇게 해놓고 하면 이번엔 지정 값이 0인 네 번째 rrr이 yyy로 나옵니다. 이유는 모르겠는데 0인 요소의 초기화가 안 되는 것 같네요. 구글에 검색하니 다른 사람들도 이런다고 하는데 유니티에서만 이런다고 하는 거 보니 유니티 자체 버그인 것 같습니다.
해결(?) 방법이라고 해야 되나 이를 회피하는 방법은 이넘의 첫 번째 요소(값 지정 시 0인 요소)를 none이나 empty 같은 초기화용으로 지정(사용)하거나, 객체 초기화자를 사용하지 않고 직접 초기화를 하면 문제가 발생하지 않습니다.
http://stackoverflow.com/questions/13593944/strange-behavior-with-c-sharp-enums
말씀하신 것처럼 0이 들어가면 아무것도 없는 초기화라고 인식을 하는 것 같네요..
무엇보다 저렇게 배열 클래스 초기화가 쉽게 가능하다는게 참 신기합니다. ;ㅁ;