"우리 중에 인물이 없는 것은 인물이 되려고 마음먹고 힘쓰는 사람이 없는 까닭이다. 인물이 없다고 한탄하는 그 사람 자신이 왜 인물이 될 공부를 아니 하는가." – 도산 안창호

문제문제 태그가 붙어있는 글

2015/02/24

객체 초기화자로 초기화가 안 될 때

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

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

댓글이 하나 오오 | cat > 타닥타닥 | tag > ,

예전 글

최근 글