C++의 스마트 포인터

Smart Pointer

언리얼 엔진에서 사용하는 Pointer에 대해 알아보자

크게 두 가지로 분류할 수 있다.

Managed Pointer ( 관리되는 포인터 )

Untitled

Garbage Collector에 의해 관리되는 포인터를 뜻한다.

UObject에서 활용이 가능한 경우

크게 강력(소유하는)/ 약한(소유하지 않는) 포인터로 구분할 수 있다.

1. Hard Object Pointer (강함)

UObject에 대해 ‘hold’ 혹은 ‘dependent’

즉, 점유하고 있는 상태를 말한다.

이런 Hard Object Pointer가 UObject를 참조하고 있는 경우,

GC가 Object를 참조하지 않는다.

UPROPERTY() UObject* Pointer = nullptr;

IsValid(Pointer) // 유효성 판별
TObjectPtr<UCapsuleComponent> CapsuleComponent;

Unreal Engine 5부터 이러한 형태로 사용하는 것을 권장함

2. Weak Object Pointer (약함)

UObject를 소유하지 않음.

그래서 GC(또는 리플렉션)가 해당 포인터가 객체를 참조하는 것을 알 수 없다.

그래서 Weak Pointer가 Object를 참조하고 있어도, GC가 삭제할 수 있다.

GC로 인해 Object가 삭제된 경우에는 Null값을 참조하게 된다.

그렇기 때문에 WeakObjectPointer로 선언한 pointer에 접근할 때에는

항상 유효성 판별이 필요

TWeakObjectPtr<UObject> Pointer;

IsValid(Pointer) // 유효성 판별

3. Soft Object Pointer

TSoftObjectPtr<UObject> Pointer;

Weak Object Pointer 처럼 소유하지 않는 약한 참조를 한다.

그런데 Weak Pointer와 차이점이 무엇이냐 하면,

얘는 어떤 instance를 pointing할 때, 메모리 주소 값 & asset의 주소 를 저장한다.

이것이 무슨 말이냐.

해당 UObject가 사용하는 Asset의 주소를 저장한다는 것.

때문에 Runtime에 에셋을 불러오는 것에 도움을 준다.

TSoftObjectPtr<UTexture2D> ItemImage;
ItemImage = "/Game/Textures/ItemTexture.ItemTexture";

ItemImage.LoadSynchronous(); // 이미지 Texture를 로드

자 그러면 이제 관리되지 않는 포인터를 함 보자.