[Unity] 유니티에서 ?.(널 조건부 연산자)가 제대로 동작하지 않는 이유
Unity에서 C#의 ?. (null 조건부 연산자)를 사용해서 코드를 간결하게 작성하려는 경우가 많습니다.
하지만 GameObject나 Component를 다룰 때 ?. 연산자가 예상대로 동작하지 않아 NullReferenceException이 발생하는 경우가 있습니다.
왜 이런일이 발생하는지, 그리고 이를 어떻게 해결할 수 있는지 살펴보겠습니다.
<목차>
1. ?.연산자가 동작하는 방식
2. Unity의 GameObject가 다른 점.
3. 결론
1. ?.연산자가 동작하는 방식
?. 연산자는 Null 조건부 연산자라 불리며, 객체가 null이 아닐 경우에만 뒤따르는 메서드나 프로퍼티를 호출합니다.
코드를 보면
위 코드를 얼핏 봤을 때 아래와 같은 해석이 가능합니다.
bulletObject 게임 오브젝트가 null이면 아무것도 하지 않고,
bulletObject 게임 오브젝트가 null이 아닌 경우에 SetActvie(true)를 호출하겠구나.
일반적인 C#객체에서는 정확히 맞는 말이겠지만, Unity에서는 약간 다른 문제가 발생하게 됩니다.
2. Unity의 GameObject가 다른 점.
Unity에서 GameObject나 Component는 일반적인 C# 객체와는 다르게 동작합니다.
📌중요 📌
- Unity에서는 파괴된(Destroy) GameObject나 Component에 대한 참조가 여전히 메모리에 남아 있을 수 있습니다.
- 이 상태에서 ?. 연산자를 사용하면, Unity가 이것을 완전히 null로 인식하지 않고 "파괴된 객체의 참조"로 간주하게 됩니다.
- 결과적으로 ?.이 안전하게 처리되지 않고 NullReferenceException이 발생할 수 있습니다.
해당 문제는 Unity의 메모리 관리 방식과 C#의 null 처리 방식이 다르기 때문에 발생하는 것입니다.
이게 보통 Fake Null 이슈라 불리며, 제 경험으로는 종종 게임 오브젝트를 Destory를 하고 null 체크를 할 때 당하고는 했습니다.
아래 예시로 null 해결 방법에 대해서 설명드리겠습니다.
해결 방법
Unity에서는 ?. 연산자 대신 명시적인 null 체크를 사용하는 것이 가장 안전합니다.
3. 결론
Unity에서 ?. 연산자는 GameObject나 Component에서 완벽하게 안전하지 않습니다.
- Unity의 파괴된 객체의 참조는 일반적인 C#의 null 과는 다르게 동작하므로 예외가 발생할 가능성이 있습니다.
- 이를 방지하기 위해 명시적인 Null 체크를 사용하거나 GameObject의 상태를 직접 확인하는 방식으로 코드를 작성하는 것을 추천합니다.
오늘도 읽어주셔서 감사합니다.
BlockDMask입니다.