Unity : C#과 Unity에서의 암묵적 Boolean 값 변환 => if (gameObject) 가능??

2026. 3. 2. 18:09·Unity

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
'Unity' 카테고리의 다른 글
  • Unity : 마샬링(Marshalling) 과 메모리 풀링(Memory Pooling)
  • Unity : 같은 PC에서 클라이언트 여러개 실행시 멈추는 현상 (Firestore)
  • Unity : 관리자 콘솔 구현 및 프리징 현상 개선
  • Unity : Firebase 등록 및 Auth로 (이메일/소셜) 로그인 구현
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    console
    터미널
    delegate
    inputsystem
    list
    class
    게임
    Network
    자료구조
    클래스
    최적화
    stack
    struct
    Abstract
    유니티
    useState
    firebase
    unity
    네트워크
    interface
    콘솔
    알고리즘
    추상 클래스
    Design Pattern
    Photon
    큐
    Queue
    스택
    C#
    function
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
Unity : C#과 Unity에서의 암묵적 Boolean 값 변환 => if (gameObject) 가능??
상단으로

티스토리툴바