Public

Unity에서 `MonoBehaviour`를 `new`로 만들면 무슨 일이 일어날까?

김치킨. 2025. 10. 21. 17:11

Unity 개발 중 MonoBehaviour를 만들 때, 보통은 AddComponent<T>()를 사용합니다.
그런데 혹시 new 키워드로 MonoBehaviour를 직접 생성하면 어떤 일이 일어날까요?

이 글에서는 MonoBehaviourAddComponent로 만든 경우와 new로 만든 경우의 차이점
동작, 구조, 런타임 관점에서 자세히 살펴보겠습니다.


🧩 1. MonoBehaviour는 일반 C# 클래스가 아니다

MonoBehaviour는 단순한 C# 객체가 아니라,
Unity 엔진(C++) 쪽 객체와 C# 객체가 연결된 하이브리드 구조입니다.

즉,

  • C# 객체: 우리가 코드에서 접근하고 조작하는 부분
  • Unity 네이티브 객체: Unity 엔진 내부에서 실제로 관리되는 GameObject 컴포넌트

따라서 new 키워드로 생성하면 엔진 쪽 네이티브 객체가 전혀 생성되지 않습니다.
이게 핵심입니다.


🚫 2. 잘못된 생성 방식 — new

TempObj obj = new TempObj(); // ❌ 잘못된 방식

이렇게 생성하면 C# 입장에서는 객체가 생기지만,
Unity는 그 존재를 전혀 모릅니다.

즉, 이 객체는 C# 힙에만 존재하는 유령 객체이며,
Unity 씬 어디에도 연결되지 않습니다.


✅ 3. 올바른 생성 방식 — AddComponent

TempObj obj = gameObject.AddComponent<TempObj>(); // ✅ 올바른 방식

AddComponent를 사용하면 Unity가 다음 과정을 자동으로 수행합니다.

  1. C# 객체를 생성
  2. Unity 네이티브 객체를 생성
  3. 둘을 연결하여 관리 시작
  4. Awake(), Start(), Update() 등의 생명주기 함수를 호출

즉, 이 방법만이 MonoBehaviourUnity 엔진이 인식할 수 있는 상태로 등록하는 방법입니다.


⚙️ 4. 실제 차이점 비교

항목 AddComponent로 생성 new로 생성
GameObject 연결 ✅ 연결됨 ❌ 연결 안 됨
Unity 네이티브 객체 ✅ 존재함 ❌ 없음
gameObject, transform ✅ 유효 ❌ null
Awake(), Start() ✅ 정상 호출 ❌ 호출 안 됨
Hierarchy 창 표시 ✅ 표시됨 ❌ 안 보임
Inspector 표시 ✅ 가능 ❌ 불가능
Destroy() 작동 ✅ 작동함 ❌ 무효
메모리 관리 Unity + GC C# GC만 관리
실질적 유효성 엔진 관리 중인 정상 객체 엔진에 등록되지 않은 유령 객체

🧠 5. 예시: new로 만든 객체의 동작

TempObj obj = new TempObj();

if (obj != null)
{
    Debug.Log("obj는 null이 아닙니다."); // ✅ 출력됨
    Debug.Log(obj.transform.position);   // ❌ NullReferenceException 발생
}
  • obj != null 은 참입니다.
    (C# 상에서 분명히 객체가 존재하기 때문입니다.)
  • 하지만 obj.transform 은 Unity 네이티브 객체가 없기 때문에 null이며,
    접근 시 예외가 발생합니다.

즉, 살아는 있지만 엔진과 연결되지 않은 유령 객체입니다.


🔍 6. AddComponent로 생성된 객체인지 구분하는 방법

Unity 엔진에 실제로 등록된 컴포넌트인지 확인하려면
아래와 같이 검사하면 됩니다.

if (obj != null && obj.gameObject != null)
{
    Debug.Log("✅ Unity에 등록된 실제 컴포넌트입니다.");
}
else
{
    Debug.Log("❌ new로 만들어진 유령 객체입니다.");
}

gameObject 프로퍼티는 Unity 네이티브 객체가 연결될 때 자동으로 채워지는 필드이므로,
이 값이 null이라면 AddComponent로 생성된 객체가 아닙니다.


💬 7. 요약

구분 설명
new 로 생성 C# 객체만 존재. Unity는 모름
AddComponent 로 생성 Unity 네이티브 객체와 연결되어 엔진이 관리
gameObject, transform AddComponent 객체에서만 유효
Destroy() Unity 관리 객체에서만 작동
판별 코드 if (obj != null && obj.gameObject != null)

🧾 결론

MonoBehaviour는 단순한 C# 클래스가 아니라
Unity 엔진이 관리하는 컴포넌트입니다.

new로 생성하면 Unity 세계에서는 존재하지 않는 유령 객체가 됩니다.

✅ 따라서 MonoBehaviour를 만들 때는 반드시 AddComponent<T>()를 사용해야 합니다.


🧩 참고

만약 순수 데이터나 로직만 다루는 클래스라면
MonoBehaviour 대신 그냥 일반 클래스나 ScriptableObject를 사용하는 것이 적절합니다.

public class TempData // MonoBehaviour 제거
{
    public int hp;
}

// 이렇게 안전하게 생성 가능
TempData data = new TempData();

👉 한 줄 요약:

MonoBehaviour는 Unity 엔진이 관리하는 컴포넌트다.
new로 만들면 유령 객체가 되고, AddComponent()로만 정상적으로 작동한다.