1. 핵심 개념
- 언리얼 스마트 포인터
- MakeShareable vs MakeShared
- css 식 UI 제어
- named slot
2. 상세 내용
1.1. 언리얼 스마트 포인터
| 스마트 포인터 타입 | 설명 |
|---|---|
Shared Pointers (TSharedPtr) |
레퍼런스 카운터로 오브젝트를 관리한다. 레퍼런스 카운터가 0이 되면 자동으로 해제된다. Shared Pointers를 만들 때 MakeShared를 사용할 수 있다면 MakeShareable을 대신해서 사용하는 것이 낫다.(아래 참조) |
Shared References (TSharedRef) |
참조한 오브젝트가 null이 불가능한 오브젝트라는 것을 보장하길 원하거나 공유된 오브젝트 소유권을 보여주길 원할 경우에는 쉐어드 레퍼런스를 사용하세요. |
Weak Pointers (TWeakPtr) |
위크 포인터는 쉐어드 포인터와 비슷하지만 참조하는 오브젝트를 소유하지 않기 때문에 생명 주기에 영향을 주지 않습니다. GC 수거 주의 |
Unique Pointers (TUniquePtr) |
유니크 포인터는 참조하는 오브젝트를 유일하고 명시적으로 소유합니다. 특정 자원에 대해서는 하나의 유니크 포인터만 있을 수 있기 때문에, 유니크 포인터는 소유권을 이전할 수 있지만 공유는 할 수 없습니다. 유니크 포인터를 복사하려 하면 컴파일 오류가 발생합니다. 또한, 유니크 포인터가 스코프(Scope)를 벗어나게 되면, 참조하는 오브젝트가 자동 소멸됩니다. |
1.2. 헬퍼 클래스와 함수
TSharedFromthis: 여기서 클래스를 파생시키면AsShared,SharedThis함수가 추가되는데 이걸로 This(자신에 대한TSharedRef)를 구할 수 있다. 단AsShared,SharedThis를 생성자에서 호출하지 말 것(크래시)MakeShared()&MakeShareable(): 일반 c++ 포인터로 쉐어드 포인터를 생성한다. 전자는 한 번의 힙 할당으로 생성이 가능하지만 오브젝트가 public 생성자를 제공해야 한다.StaticCastSharedRef()&StaticCastSharedPtr: 주로 정적 형변환(down cast) 시 사용한다.ConstCastSharedRef()&ConstCastSharedPtr:const스마트 레퍼런스 또는 스마트 포인터를mutable스마트 레퍼런스 또는 스마트 포인터로 각각 변환한다.
3. 질문 및 해결 (Q&A)
- 왜 공유 포인터는 this로 자신을 참조할 수 없을까?
- 공유 포인터는 실제 객체를 가리키는 원시 포인터(this), 이 객체를 몇 명이 공유하고 있는지 세는 레퍼런스 카운터(제어 블록)를 메모리로 가지고 있다. 그런데 TSharedPtr(this)를 호출하면 TSharedPtr은 this 자체가 이미 다른 카운터에 의해 관리되는 사실을 알 수 없다. 따라서 this를 관리하기 위한 새로운 레퍼런스 카운터가 생성되는데 이 때문에 독립적인 카운터가 2개가 생기는 문가 발생한다.
따라서 이 문제를 해결하기 위해 TSharedFromThis는 객체 스스로 자신의 카운터를 추적할 수 있는 TWeakPtr과 유사한 멤버 변수가 추가된다.
- 공유 포인터는 실제 객체를 가리키는 원시 포인터(this), 이 객체를 몇 명이 공유하고 있는지 세는 레퍼런스 카운터(제어 블록)를 메모리로 가지고 있다. 그런데 TSharedPtr(this)를 호출하면 TSharedPtr은 this 자체가 이미 다른 카운터에 의해 관리되는 사실을 알 수 없다. 따라서 this를 관리하기 위한 새로운 레퍼런스 카운터가 생성되는데 이 때문에 독립적인 카운터가 2개가 생기는 문가 발생한다.
4. 관련 문서 (Links)
'내일배움캠프 > TIL' 카테고리의 다른 글
| TIL260528 - 챕터2 프로젝트 - 2 (0) | 2026.05.28 |
|---|---|
| TIL260526 - CPP (0) | 2026.05.26 |
| TIL260521 - Unreal (0) | 2026.05.21 |
| TIL260518 - VFX (0) | 2026.05.18 |
| TIL260515 - Unreal (0) | 2026.05.15 |