C++의 스마트 포인터
언리얼 엔진에서 사용하는 Pointer에 대해 알아보자
크게 두 가지로 분류할 수 있다.
Garbage Collector에 의해 관리되는 포인터를 뜻한다.
UObject에서 활용이 가능한 경우
크게 강력(소유하는)/ 약한(소유하지 않는) 포인터로 구분할 수 있다.
UObject에 대해 ‘hold’ 혹은 ‘dependent’
즉, 점유하고 있는 상태를 말한다.
이런 Hard Object Pointer가 UObject를 참조하고 있는 경우,
GC가 Object를 참조하지 않는다.
UPROPERTY() UObject* Pointer = nullptr;
IsValid(Pointer) // 유효성 판별
TObjectPtr<UCapsuleComponent> CapsuleComponent;
Unreal Engine 5부터 이러한 형태로 사용하는 것을 권장함
UObject를 소유하지 않음.
그래서 GC(또는 리플렉션)가 해당 포인터가 객체를 참조하는 것을 알 수 없다.
그래서 Weak Pointer가 Object를 참조하고 있어도, GC가 삭제할 수 있다.
GC로 인해 Object가 삭제된 경우에는 Null값을 참조하게 된다.
그렇기 때문에 WeakObjectPointer로 선언한 pointer에 접근할 때에는
항상 유효성 판별이 필요
TWeakObjectPtr<UObject> Pointer;
IsValid(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를 로드
자 그러면 이제 관리되지 않는 포인터를 함 보자.