프로그래밍/공부

유니티의 Null Check에 관해

유니티 오브젝트는 C++로 작성된 네이티브 객체의 래퍼입니다.

이 네이티브 객체는 씬 변경 또는 Object.Destroy()를 사용하면 제거됩니다.

이 네이티브 객체를 C#으로 래핑한 유니티 오브젝트는 가비지 컬렉터가 수집을 완료할 때까지 남아있게 됩니다.

 

이 상태를 유니티에선 "Fake Null"이라고 합니다.

 

이러한 이유로 UnityEngine.Object 클래스에선 같음 연사자(==, !=)를 오버로딩하여

네이티브 객체의 존재 여부까지 판단해서 비교한 후 결과를 돌려줍니다만

여기서 두가지 문제가 발생합니다.

 

1. 닷넷의 기본 오브젝트로 보았을 때와 결과가 일치하지 않는 문제

2. 네이티브 리소스가 남아있는지 체크하는 과정에서 비용이 소모되는 문제

 

단순한 캐싱이나 생성된 이후에는 파괴되지 않을 싱글턴의 구현같은 경우에는

유니티 오브젝트가 아닌 닷넷 오브젝트로서 null 체크를 하는 것이 좋습니다.

 

직접 파괴처리를 한다면 반드시 유니티 오브젝트로서 null 체크를 하고

더 나아가서는 C++에서 그랬듯 Destroy 후 해당 변수에 null을 명시적으로 넣어주는 것이 좋습니다.