FMyClass : public TSharedFromThis<FMyClass>라는 문장을 접했다.
대체 뭘 상속 받은 거야? 했는데 TSharedFromThis는 언리얼 스마트 포인터 라이브러리가 제공하는 헬퍼 클래스라고 한다.
언리얼 스마트 포인터 라이브러리
언리얼 스마트 포인터 라이브러리는 C++11 스마트 포인터들의 커스텀 구현이라고 한다. 익히 알고 있는 SharedPointer, WeakPointer, UniquePointer에 SharedReference까지 추가되어 있다.
단, 언리얼 오브젝트들은 별도의 메모리 추적 시스템을 사용하기 때문에 이러한 클래스들은 UObject 시스템과 사용할 수 없다고 한다.
(강의에서 TWeakPtr로 사용하지 않았나? 이 부분 확인해 보기.)
SharedReference(TSharedRef)
- 쉐어드 레퍼런스는 참조하는 오브젝트를 소유한다는 측면에서 쉐어드 포인터와 같은 역할을 하지만 쉐어드 레퍼런스는 항상 null이 불가능한 오브젝트를 참조해야 한다.
- 참조한 오브젝트가 null이 불가능한 오브젝트라는 것을 보장하길 원하거나 공유된 오브젝트 소유권을 보여주길 원할 경우에는 쉐어드 레퍼런스를 사용한다.
- 쉐어드 레퍼런스는 절대 null일 수 없기 때문에 런타임에 안전하며 언제든지 참조 해제될 수 있다.
TSharedFromThis
- 언리얼 스마트 포인터 라이브러리의 헬퍼 클래스이다.
- TSharedFromThis에서 클래스를 파생시키면 AsShared 혹은 SharedThis 함수가 추가된다. 이러한 함수들을 통해 오브젝트에 대한 TSharedRef를 구할 수 있다.
MakeShared 및 MakeShareable
- 언리얼 스마트 포인터 라이브러리의 헬퍼 함수이다.
- 일반 C++ 포인터로 쉐어드 포인터를 생성한다.
- MakeShared 함수는 새 오브젝트 인스턴스와 레퍼런스 컨트롤러를 한 메모리 블록에 할당하지만, 오브젝트가 public 생성자를 제공해야만 한다.
- MakeShareable 함수는 덜 효율적이지만 오브젝트의 생성자가 private이더라도 접근 가능하여 직접 생성하지 않은 오브젝트에 대한 소유권을 가질 수 있고, 오브젝트를 소멸시킬 경우에는 커스텀 비헤이비어가 지원된다.
가급적이면 함수에 데이터를 TSharedRef 또는 TSharedPtr 매개변수로 넣지 않는 것을 권장한다. 이러한 데이터의 해제와 참조 카운팅으로 인해 오버헤드가 발생하기 때문이다. 레퍼런스된 오브젝트를 const &로 넣도록 한다.