# 오브젝트

> UnityEngine.Object is the base class for all objects the Editor can reference from fields in the Inspector window.

`UnityEngine.Object` 클래스는 Unity가 Unity 에디터에서 참조할 수 있는 모든 오브젝트의 기본 클래스입니다. `UnityEngine.Object`에서 상속하는 클래스를 인스펙터의 필드에 끌어서 놓거나 오브젝트 필드 옆의 오브젝트 피커를 사용하여 선택할 수 있습니다.


**인스펙터 창의 오브젝트 필드 예시입니다. 오브젝트 피커는 필드 오른쪽의 원형 아이콘입니다.:**
![](/api/media?file=/engine/6000.0/media/images/ExampleObjectField.png)

커스텀 클래스의 `Object`에서 직접 상속하는 것보다는 목표에 맞게 설계된 클래스에서 상속하는 것이 좋습니다. 예시:

* `GameObject`에 추가할 수 있는 커스텀 컴포넌트를 작성하거나, `GameObject`가 수행하는 작업을 제어하거나, 일부 관련 기능을 제공하려면 `MonoBehaviour`에서 상속합니다.
* 직렬화된 데이터를 저장할 수 있는 커스텀 에셋을 생성하려면 `ScriptableObject`에서 상속합니다.

둘 다 `UnityEngine.Object`에서 상속되지만 이러한 목적에 적합한 추가 기능을 제공합니다.

**참고:** 이름이 충돌하지 않도록 `UnityEngine.Object`는 기본 스크립트 템플릿에 포함되지 않는 .NET의 기본 `System.Object`와 같지 않습니다. 인스펙터에서 할당할 필요가 없는 클래스를 만들려는 경우 여전히 .NET의 `System.Object`에서 상속할 수 있습니다.

`Object` 클래스는 오브젝트를 인스턴스화하고 제거하고 특정 유형의 오브젝트에 대한 레퍼런스를 찾기 위한 메서드를 제공합니다. Object 클래스의 API에 대한 자세한 내용은 [오브젝트의 스크립트 레퍼런스 페이지](/engine/6000.0/script-reference/unity-engine/object.md)를 참조하십시오.

## UnityEngine.Object의 특수 동작

`UnityEngine.Object`는 관리되지 않는(C++) 대응 오브젝트에 연결되어 있기 때문에 Unity의 특수한 C# 오브젝트 유형입니다. 예를 들어 [Camera](/engine/6000.0/script-reference/unity-engine/camera.md) 컴포넌트를 사용하는 경우 Unity는 C# 오브젝트 자체가 아니라 C++로 구현된 대응 오브젝트에 오브젝트의 상태를 저장합니다.


**Frame:**
![](/api/media?file=/engine/6000.0/media/images/unity-engine-object.png)

Unity는 현재 C# `WeakReference` 클래스를 `UnityEngine.Object` 인스턴스와 함께 사용할 수 없습니다. 따라서 로드된 에셋을 참조하기 위해 `WeakReference`를 사용해서는 안 됩니다. `WeakReference` 클래스에 대한 자세한 내용은 Microsoft의 [WeakReference 기술 자료](https://docs.microsoft.com/en-us/dotnet/api/system.weakreference?view=netcore-3.1)를 참조하십시오.

### Unity C# 및 Unity C++가 공유하는 UnityEngine 오브젝트

`UnityEngine.Object`에서 파생된 오브젝트를 제거하기 위해 [Object.Destroy](/engine/6000.0/script-reference/unity-engine/object/destroy.md) 또는 [Object.DestroyImmediate](/engine/6000.0/script-reference/unity-engine/object/destroy-immediate.md) 같은 메서드를 사용하는 경우 Unity는 C++ 대응 오브젝트를 제거(언로드)합니다. 가비지 컬렉터가 메모리를 관리하므로 명시적인 호출로 C# 오브젝트를 제거할 수 없습니다. 관리되는 오브젝트에 대한 레퍼런스가 더 이상 없으면 가비지 컬렉터가 이를 수집하고 제거합니다.

애플리케이션이 삭제된 `UnityEngine.Object`에 다시 액세스하려고 하면 Unity는 대부분의 유형에 대한 네이티브 대응 오브젝트를 다시 생성합니다. 이 재생성 동작에는 [MonoBehaviour](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) 및 [ScriptableObject](/engine/6000.0/script-reference/unity-engine/scriptable-object.md)라는 두 가지 예외가 있습니다. Unity는 이러한 오브젝트가 제거된 후에는 다시 로드하지 않습니다.

`MonoBehaviour` 및 `ScriptableObject`는 같음(==) 및 같지 않음(!=) 연산자를 오버라이드합니다. 제거된 `MonoBehaviour` 또는 `ScriptableObject`를 `null`과 비교하면 관리되는 오브젝트가 여전히 존재하고 가비지 수집이 아직 이루어지지 않은 경우 연산자는 true를 반환합니다.

?? 및 ?. 연산자를 오버로드할 수 없으므로 `UnityEngine.Object`에서 파생된 오브젝트와 호환되지 않습니다. 관리되는 오브젝트가 여전히 존재하는 동안 제거된 `MonoBehaviour` 또는 `ScriptableObject`에서 사용하는 경우 같음 및 같지 않음 연산자와 동일한 결과를 반환하지 않습니다.

## 추가 리소스

* [Null 레퍼런스](/engine/6000.0/manual/scripting/object-oriented-development/null-reference-exception.md)
* [UnityEngine.Object API 레퍼런스](/engine/6000.0/script-reference/unity-engine/object.md)
