이전 글의 내용을 보면 UnityEngine.Object의 ==, != 연산은 System.Object 형의 동일한 연산 대비 더 비싼 연산임을 알 수 있다. (C++의 Native 객체까지 검사함)
그렇다면 사용할수 있는 다른 연산이 있을까 싶어서 찾아봤다.
Object uobj = new UnityEngine.Object();
Debug.Log($"1) uobj : {uobj}");
Debug.Log($"2) uobj == null : {uobj == null}");
Debug.Log($"3) uobj is null : {uobj is null}");
Debug.Log($"4) ReferenceEquals(uobj) : {ReferenceEquals(uobj, null)}");
// ✏️ implict bool 형변환
if (uobj)
Debug.Log($"5) if (uobj) == true");
else
Debug.Log($"5) if (uobj) == false");
구글링을 했을 때에는 == 연산자와 implicit bool 형변환의 코드가 다르게 구성되어 있는걸로 봤는데
직접 뜯어봤을때는 같은 함수를 사용하고 있었다.
public static implicit operator bool(Object exists) { return !CompareBaseObjects(exists, null); }
그래서 1번, 2번, 5번이 같은 결과가 나온듯 싶다.
is null 구문이 어떻게 동작할지 궁금했는데 System.Object 형과 동일하게 결과가 나오는것을 알 수 있었다.
object sobj = new System.Object();
Debug.Log($"1) sobj : {sobj}");
Debug.Log($"2) sobj == null : {sobj == null}");
Debug.Log($"3) sobj is null : {sobj is null}");
Debug.Log($"4) ReferenceEquals(sobj) : {ReferenceEquals(sobj, null)}");
// ✏️ System.Object 에는 implict bool 형변환이 존재하지 않음 => 에러 발생
// if (sobj)
// Debug.Log($"5) if (sobj) == true");
// else
// Debug.Log($"5)if (sobj) == false");
결과 값이 정반대가 되기 때문에 어떤 연산을 어느 경우에 사용할 것인지 잘 고려하는게 중요할 것 같다.
UnityEngine.Object의 == 연산이 비싸다고 해서 마냥 사용하지 않을 수도 없고,
(👉 public으로 선언되고 null로 초기화 된 변수의 경우 fake null 상태가 됨.
이 때는 UnityEngine.Object의 null 검사구문이 필요)
빠르다고 해서 마냥 is null 이나 ReferenceEquals 를 사용할 수도 없다.
is null 을 적절히 사용하기 위해서는 명시적으로 Destroy 후에는 = null 구문으로 초기화하는 습관을 들이는 연습을 해야겠다.
참고
👀 https://doublsb.tistory.com/138
👀 https://doublsb.tistory.com/148