#1. TUniquePtr
1. 개념
TUniquePtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로 단일 소유권을 가진 스마트 포인터입니다.
2. 특징
- 단일 소유권
- 복사 불가, 이동 허용
- 낮은 메모리 오버헤드
3. 코드
TUniquePtr<FMyClass> UniquePtr = MakeUnique<FMyClass>();
UniquePtr->DoSomething();
// 소유권 이전
TUniquePtr<FMyClass> NewPtr = MoveTemp(UniquePtr);
// 이제 UniquePtr은 nullptr이 되고, NewPtr이 객체를 소유합니다.
#2. TSharedPtr
1. 개념
TSharedPtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로, 공유 소유권을 가진 포인터입니다. C++의 shared_ptr와 같이 레퍼런스 카운팅을 통해 객체 수명을 관리합니다. 여러 TSharedPtr 유형의 포인터 변수는 하나의 객체를 동시에 참조할 수 있습니다.
2. 특징
- 공동 소유권
- 레퍼런스 카운팅을 통한 객체 수명 관리
- 순환 참조 문제
4. 코드
TSharedPtr<FMyClass> SharedPtr1 = MakeShared<FMyClass>();
TSharedPtr<FMyClass> SharedPtr2 = SharedPtr1;
if (SharedPtr1.IsValid())
{
SharedPtr1->DoSomething();
}
// SharedPtr1과 SharedPtr2가 모두 소멸되면 객체가 삭제됩니다.
#3. TWeakPtr
1. 개념
TWeakPtr는 Unreal에서 제공하는 스마트 포인터 클래스 중 하나로, TSharedPtr의 약한 참조 버전입니다. TWeakPtr는 공동 소유권을 통해 발생하는 순환 참조 문제를 방지하며, 가비지 컬렉션 작업 시 가리키던 객체가 소멸되면 null로 설정됩니다.
2. 특징
- TSharedPtr의 약한 참조 버전
- 객체 수명에 영향 X
- 순환 참조 문제 해결
- IsValid() 활용 객체 존재 여부 확인
3. 코드
TSharedPtr<FMyClass> SharedPtr = MakeShared<FMyClass>();
TWeakPtr<FMyClass> WeakPtr = SharedPtr;
if (TSharedPtr<FMyClass> LockedPtr = WeakPtr.Pin())
{
LockedPtr->DoSomething();
}
// SharedPtr이 소멸되면 WeakPtr은 자동으로 무효화됩니다.
#4. TObjectPtr
1. 개념
TObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로 UObject 파생 클래를 위홰 최적화된 스마트 포인터입니다. TObjectPtr는 자동 참조 및 역참조 연산을 지원하며, UObject에 대하여 내부적으로 최적화되어 있어 성능상 이점이 있습니다.
2. 특징
- 자동 참조 및 역참조
- 내부 최적화 및 성능상 이점
- UObject 및 파생 클래에만 사용 가능
- Game과 Editor의 직렬화 제공
- 가비지 컬렉션 지원
3. 코드
UPROPERTY()
TObjectPtr<UMyObject> ObjectPtr;
void UseObject()
{
if (ObjectPtr)
{
ObjectPtr->DoSomething();
}
}
// 가비지 컬렉션 중에 ObjectPtr은 자동으로 null로 설정될 수 있습니다.
#5. TWeakObjectPtr
1. 개념
TWeakObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로 UObject에 대한 약한 참조를 제공하는 스마트 포인터입니다.
2. 특징
- 객체 수명에 영향 X
- 가비지 컬렉션 과정에서 null로 변경
- 순환 참조 문제 해결
- 객체의 유효성 검사
3. 코드
UPROPERTY()
TObjectPtr<UMyObject> ObjectPtr;
void UseObject()
{
if (ObjectPtr)
{
ObjectPtr->DoSomething();
}
}
// 가비지 컬렉션 중에 ObjectPtr은 자동으로 null로 설정될 수 있습니다.
#6. TSoftObjectPtr
1. 개념
TSoftObjectPtr는 Unreal에서 제공하는 스마트 포인터 중 하나로, UObject 및 파생 클래스 유형에 대한 느슨한 참조를 제공합니다. TSoftObjectPtr는 주로, 대용량 애셋의 지연 로딩, 순환 참조 방지, 모듈간 느슨한 결합, 데이터에서 애셋 참조를 관리하기 위해 활용됩니다.
2. 특징
- 지연 로딩: 객체를 즉시 로드하지 않고, 필요할 때 로드
- 비동기 로딩: 비동기적으로 로드하여 성능상 이점
- 직렬화 기능: 에디터와 게임 간 안전한 직렬화
- 널 안전성: 참조된 객체가 로드되지 않거나, 존재하지 않아도 안전
- 메모리 효율: 실제 객체 대신 경로 문자열만 저장
3. 동작 방식
- 내부적으로 FSoftObjectPath 활용하여 객체의 경로 저장
- 객체 접근 시 필요에 따라 객체를 로드
- 로드된 객체애 대한 느슨한 참조 유지
4. 코드
UPROPERTY()
TSoftObjectPtr<UTexture2D> TexturePtr;
void LoadAndUseTexture()
{
if (UTexture2D* Texture = TexturePtr.LoadSynchronous())
{
// 텍스처 사용
}
else
{
// 비동기 로드
TexturePtr.LoadAsync();
}
}
// TexturePtr은 객체가 메모리에 없어도 참조를 유지합니다.
#7. Summary
종류 | 장점 | 단점 | 활용처 |
TUniquePtr | 1. 명확한 소유권 2. 메모리 누수 방지 3. 가장 적은 메모리 오버헤드 |
1. 복사 불가능 | 1. 독점 소유권 리소스 2.RAII 패턴 구현 3. 팩토리 함수 반환값 |
TSharedPtr | 1. 공동 소유권 2. 자동 메모리 관리 |
1. 순환 참조 문제 2. 메모리 오버헤드 |
1. 공동 소유 리소스 |
TWeakPtr | 1. 순환 참조 방지 2. 객체 존재 여부 확인 3. 객체 수명과 연관 x |
1. TSharedPtr에 의존적 2. 객체 접근 불가 |
1. 캐시 구현 2. 관찰자 패턴 구현 3. 콜백 4. 순환 참조 방지 |
종류 | 장점 | 단점 | 활용처 |
TObjectPtr | 1. UObject 최적화 2.가비지 컬렉션 지원 3. 직렬화와 네트워크 복사 |
1. UObject만 가능 | 1. 멤버 변수 2. Reflection |
TWeakObjectPtr | 1. UObject 최적화 2. 가비지 컬렉션 지원 3. 순환 참조 방지 |
1. 유효성 검사 필수 2. UObject만 가능 |
1. Delegate 2. 캐시 3. 임시 참조 |
TSoftObjectPtr | 1. 비동기 로딩 지원 2. 메모리 로드 되지 않은 애셋 참조 가능 3.직렬화 지원 |
1. 접근 시 추가 로딩 2. 런 타임 오버헤드 |
1. 대용량 애셋 참조 2. 레벨 스트리밍 3. 지연 로 |
'게임개발 > Unreal C++' 카테고리의 다른 글
[Unreal]#ESlateVisibility, UI 가시성 (0) | 2024.08.21 |
---|---|
[Unreal]#Delegate, Event, Delegate vs Event (0) | 2024.07.30 |
[Unreal]#생명 주기 함수 (0) | 2024.07.24 |
[Unreal]#UBlueprintAsyncActionBase (0) | 2024.07.01 |
[Unreal]#27_Actor 클래스 vs Character 클래스 (0) | 2024.06.25 |