Unreal Engine에서 TObjectPtr와 TSubclassOf는 각각 다른 목적과 사용 방식을 가진 템플릿 클래스입니다. 간단히 말하면 인스턴스와 클래스에 대한 접근 시 사용하는 클래스입니다. 아래에서 두 개념을 비교 및 설명합니다.
| 구분 | TObjectPtr | TSubclassOf |
|---|---|---|
| 목적 | UObject 인스턴스(객체) 포인터 관리 | 특정 클래스 타입(클래스 정보) 저장 |
| 주 용도 | 객체 참조 및 메모리 관리 | 클래스 타입 지정 및 타입 체크 |
| 대표 사용 예시 | TObjectPtr<UStaticMesh> | TSubclassOf<AActor> |
| 설명 | 실제 UObject 인스턴스를 가리킴 | 특정 부모 클래스를 상속한 모든 클래스 타입을 저장 가능 |
| 에디터 노출 | 인스턴스(객체) 선택 | 클래스(타입) 선택 |
| 블루프린트 | 객체를 직접 할당 | 블루프린트 클래스 타입 할당 |
목차
ToggleTObjectPtr
- Unreal Engine 5에서 도입된 스마트 포인터로, 기존의
UObject*대신 사용을 권장합니다. - UObject의 포인터를 안전하게 관리하며, 가리키는 객체가 유효한지 자동으로 검사하고, 객체의 참조 카운트를 관리합니다.
- 주로 실제 인스턴스(예: 특정 메쉬, 사운드 등)를 가리킬 때 사용합니다.
- 예시: cpp
UPROPERTY() TObjectPtr<UStaticMeshComponent> Box; - 객체 인스턴스를 직접 참조합니다.
TSubclassOf
- 특정 클래스를 상속받은 모든 클래스의 타입(즉, UClass 정보)을 저장할 수 있는 템플릿 클래스입니다.
- 객체 인스턴스가 아니라 클래스 타입 자체를 변수로 저장합니다.
- 에디터나 블루프린트에서 클래스 타입을 선택할 수 있게 해줍니다.
- 주로 SpawnActor 등에서 어떤 타입의 객체를 생성할지 지정할 때 사용합니다.
- 예시: cpp
UPROPERTY() TSubclassOf<AActor> ActorClass; - 타입 정보만 저장하며, 실제 인스턴스는 아닙니다.
주요 차이점
- TObjectPtr: 실제 객체(인스턴스)를 가리키는 포인터. 메모리 관리와 안전성 보장.
- TSubclassOf: 특정 부모 클래스를 상속한 클래스의 타입 정보(UClass*)를 저장. 객체가 아닌 타입 자체를 다룸.
쉽게 말해,
- TObjectPtr은 “이 객체를 가리킨다.”
- TSubclassOf는 “이런 타입(클래스)을 가리킨다.”
즉, 인스턴스 vs. 타입 정보의 차이입니다.
예시 코드
cpp// 객체 인스턴스 참조 (TObjectPtr)
UPROPERTY()
TObjectPtr<UStaticMeshComponent> MeshComp;
// 클래스 타입 참조 (TSubclassOf)
UPROPERTY()
TSubclassOf<AActor> ActorBlueprintClass;
이처럼 두 타입은 의도와 용도가 다르므로 상황에 맞게 선택해서 사용해야 합니다.
- 객체를 직접 다룰 땐
TObjectPtr - 클래스를 지정하고 싶을 땐
TSubclassOf를 사용합니다.