JS, Phyton 같은 타 언어에서는 암묵적 Bool 변환을 지원한다.
if 조건문에 넣은 값에 따라 true나 false로 평가되는 방식으로 말이다.
하지만 C#은 엄격한 타입 안정성을 지향하기에 반드시 명시적으로 bool 타입을 사용하지 않으면 컴파일 에러가 발생한다.
하지만 Unity 환경에서는 특이하게도 if (gameObject) 나 if (transform) 과 같이 객체 자체를 조건문에 넣어도 정상 작동이 되는 것을 볼 수 있다.
위에서 말한 C#의 기본적인 정책과 상충하는 것으로 보이는 이 현상에 대해 간략하게 정리해보자.
Unity 에서의 내부 구현
C# 언어 자체에서는 지원하지 않는 문법을 유니티가 쓸 수 있는 이유는, C#의 연산자 오버로딩(Operator Overloading)을 활용해 UnityEngine.Object 클래스 내부에 변환 로직을 직접 구현해 두었기 때문이다.
실제 유니티 엔진의 UnityEngine.Object C# 래퍼 코드를 살펴보면 다음과 같이 정의되어 있다.
namespace UnityEngine
{
public partial class Object
{
// ... 생략 ...
// 객체가 null이거나 파괴되었는지 확인하는 내부 로직
private static bool CompareBaseObjects(Object lhs, Object rhs)
{
bool lhsNull = ((object)lhs == null) || !lhs.IsNativeObjectAlive();
bool rhsNull = ((object)rhs == null) || !rhs.IsNativeObjectAlive();
return lhsNull == rhsNull;
}
// 핵심: Object 형을 bool 형으로 암묵적 변환해주는 연산자 오버로딩
public static implicit operator bool(Object exists)
{
return !CompareBaseObjects(exists, null);
}
// 추가로 ==, != 연산자도 동일한 방식으로 오버로딩되어 있다.
public static bool operator ==(Object x, Object y)
{
return CompareBaseObjects(x, y);
}
}
}
위 코드에서 볼 수 있듯이 유니티 내부에서 implicit operator bool 을 정의하여 유니티 객체가 if 문 안에 들어갈 때 자동으로 내부의 CompareBaseObjects 함수를 호출하도록 설계했다.
그렇다면 굳이 왜 표준 C#의 규칙을 벗어나면서까지 이런 오버로딩을 구현했을까?
유니티 객체는 C# 영역의 관리형 객체(Managed Object)와 C++ 영역의 네이티브 객체(Native Object)로 분리되어 있다.
사용자가 Destroy(gameObject)를 호출하면 C++ 영역의 실제 메모리는 파괴되지만, 이를 가리키는 C# 객체 껍데기는 GC가 수거하기 전까지 메모리에 남아있게 된다.
만약 유니티가 순수 C#의 null 체크 방식을 그대로 쓴다면, 이미 파괴된 객체임에도 C# 껍데기가 남아있어 if (gameObject != null) 조건문을 통과해 버리는 치명적인 버그가 발생한다.
이를 막기 위해 유니티는 암묵적 Bool 변환 발생 시, C# 껍데기 뿐만 아니라 C++ 네이티브 객체가 실제로 살아있는지 (IsNativeObjectAlive)까지 검사하도록 내부 동작을 덮어씌운 것이다.
이러한 암묵적 변환은 UnityEngine.Object를 상속받는 모든 유니티 엔진 기반 객체들에게 적용된다.
GameObject, Component, MonoBehavior, ScriptableObject 등 그 외 유니티 에셋 타입들 모두 적용된다.
반대로 기본 자료형들과 순수 C# 클래스, 인터페이스 들은 지원하지 않는다.
기본 자료형의 경우 num != 0 같은 형태로 비교해야하고
string의 경우 반드시 string.IsNullOrEmpty 등으로 체크해야한다.
'Unity' 카테고리의 다른 글
| Unity : 마샬링(Marshalling) 과 메모리 풀링(Memory Pooling) (0) | 2026.03.02 |
|---|---|
| Unity : 같은 PC에서 클라이언트 여러개 실행시 멈추는 현상 (Firestore) (0) | 2026.02.08 |
| Unity : 관리자 콘솔 구현 및 프리징 현상 개선 (0) | 2026.02.08 |
| Unity : Firebase 등록 및 Auth로 (이메일/소셜) 로그인 구현 (0) | 2026.01.11 |
| Unity Network : Photon Pun2 - PhotonView, IPunObservable, RPC (0) | 2026.01.07 |