Unity - 비교 연산자
https://blogs.unity3d.com/2014/05/16/custom-operator-should-we-keep-it/
읽어두면 좋은 내용.
C++ 백엔드 시스템에서 C# 을 동시에 사용하는 유니티 특징상, GameObject 처럼 c# wrapper 객체가 c++ 객체를 참조하고 있는 경우가 존재한다.
따라서
읽어두면 좋은 내용.
C++ 백엔드 시스템에서 C# 을 동시에 사용하는 유니티 특징상, GameObject 처럼 c# wrapper 객체가 c++ 객체를 참조하고 있는 경우가 존재한다.
따라서
1
|
if (myGameObject == null) {}
|
위 코드의 == 연산자는 생각보다 복잡한 의미를 가진다.
c#의 wrapper 객체는 c#의 생명주기를 따르며 gc가 관리하게 되지만, wrapper 객체가 참조하는 c++객체는 c++의 생명주기를 따른다. -> c++ 객체가 파괴되어도 gc가 미처 수거하지 못한 c# 객체는 null값을 참조하며 존재할 수 있다.
이 경우, == 연산자로 널값과 비교를 하면 true를 반환한다고 한다. c# 객체는 사실 진짜 null이 아닌데 말이다.
== 연산자로 null 비교를 하면 요런 특징이 있는데
- 비직관적
- UnityEngine.Objects 를 서로 비교하거나 null과 비교하는 것은 생각보다 비용이 비쌈
- thread safe 보장하지 않음
- ?? 연산자와는 모순된게 작동한다. 다만 ?? 쪽은 순수하게 C# null 값을 체크
결론적으로는
if(myObject.destroyed) {} // myObject가 파괴된 object를 가리키는지 확인
와 같은 == 연산자를 대체할 방법도 있으니 충분히 고려해 볼것.
댓글
댓글 쓰기