■ fake null
유니티의 Object 클래스는 C++ 객체인 nativeObject 객체의 주소 포인터를 갖고 있는 C# 클래스이다.
그래서 Destroy 함수를 호출하면 C++ nativeObject 객체의 메모리만 해제되고 (C# 객체는 가비지 콜렉터에 의해서만 메모리가 해제되기 때문에) UnityEngine의 Object 껍데기만 남아있게 된다.
→ 남은 UnityEngine.Object는 null이 아니지만 없어진 것 처럼 보여야 하기 때문에 null이 아닌 문자열 "null"로 처리된다. 이것이 fake null이다.
* 하지만 UnityEngine의 == 연산자에 오버로딩이 되어있어 (Destroy된 오브젝트 == null) 은 true를 반환한다.
* 만약 UnityEngine의 Object가 아니라 System.Object로 형변환하여 체크한다면 == 연산자 오버로딩이 없으므로 ((object)Destroy된 오브젝트 == null) 은 false를 반환한다.
● 결론
' == null ' 연산은 C++ 네이티브 객체 유무, 캐스팅 등 많은 성능을 소모하기 때문에 루프 내부에서나 프레임마다 호출하는 것은 좋지 않다.
* 다른 방법들
- System.Object (object) 로 다운캐스팅 후 비교
- obejct.ReferenceEquals 함수 사용
- is null / is not null 상수 패턴 사용
'🕹️ Unity' 카테고리의 다른 글
| ScrollRect 스크롤 위치 초기화 (0) | 2024.07.19 |
|---|---|
| 데칼 (Decal) (0) | 2024.07.03 |
| 시네머신 카메라 떨림 (지터링) 현상 (0) | 2024.07.03 |
| 렌더 파이프라인 (Render Pipeline) (0) | 2023.10.16 |
| 오브젝트의 월드 좌표, 스크린 좌표 변환하기 (0) | 2023.09.21 |