"눈이 나쁘면 안경을 쓴댔으니 모자란 너에겐 모자를 씌워주마" – 김케장 / 동전주머니엔 동전이 들었지

20150224
객체 초기화자 오류

유니티로 개발 중에 이상한 동작을 발견했습니다.

//--------------------------------------------------
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

댓글이 하나 오오 | 타닥타닥

  1. 말씀하신 것처럼 0이 들어가면 아무것도 없는 초기화라고 인식을 하는 것 같네요..
    무엇보다 저렇게 배열 클래스 초기화가 쉽게 가능하다는게 참 신기합니다. ;ㅁ;

댓글 남기기

* 표시된 곳은 반드시 입력해주세요