Unity 개발 중 MonoBehaviour를 만들 때, 보통은 AddComponent<T>()를 사용합니다.
그런데 혹시 new 키워드로 MonoBehaviour를 직접 생성하면 어떤 일이 일어날까요?
이 글에서는 MonoBehaviour를 AddComponent로 만든 경우와 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가 다음 과정을 자동으로 수행합니다.
- C# 객체를 생성
- Unity 네이티브 객체를 생성
- 둘을 연결하여 관리 시작
Awake(),Start(),Update()등의 생명주기 함수를 호출
즉, 이 방법만이 MonoBehaviour를 Unity 엔진이 인식할 수 있는 상태로 등록하는 방법입니다.
⚙️ 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()로만 정상적으로 작동한다.
'Public' 카테고리의 다른 글
| [Unity] 프리팹 안의 프리팹 : Nested Prefab (중첩 프리팹) (0) | 2025.12.18 |
|---|---|
| [Unity] 프리팹 간에 상속이 가능하다고? Prefab Variant 활용법 (0) | 2025.12.11 |
| Unity Vector2.Reflect 함수 완벽 가이드 (0) | 2025.08.24 |
| Unity Mathf.Lerp 함수 완벽 가이드 (0) | 2025.08.23 |
| Unity Mathf.Clamp 함수 완벽 가이드 (0) | 2025.08.23 |