쉐어드 레퍼런스(Shared Reference) 는 엔진의 UObject 시스템 외부에 있는 데이터 오브젝트에 대한 강력한 null 비허용 스마트 포인터 입니다. 이는 쉐어드 레퍼런스를 재설정하거나, null 오브젝트를 할당하거나, 빈 오브젝트를 생성할 수 없음을 의미합니다. 따라서 쉐어드 레퍼런스에는 항상 유효한 오브젝트가 포함되며 IsValid 메서드도 없습니다. 쉐어드 레퍼런스와 쉐어드 포인터 중에서 선택할 때, 비어 있거나 null을 허용하는 오브젝트가 필요하지 않는 한 쉐어드 레퍼런스를 선호합니다. 잠재적으로 비어 있거나 null을 허용하는 레퍼런스가 필요한 경우 쉐어드 포인터를 대신 사용해야 합니다.
표준 C++ 레퍼런스와 달리 쉐어드 레퍼런스는 생성 후 다른 오브젝트에 재할당할 수 있습니다.
선언 및 초기화
쉐어드 레퍼런스는 null을 허용하지 않으므로 초기화에는 데이터 오브젝트가 필요합니다. 유효한 오브젝트 없이 쉐어드 레퍼런스를 생성하려고 시도하면 컴파일되지 않으며 쉐어드 레퍼런스를 null 포인터 변수로 초기화하려고 시도합니다.
// 새 노드에 쉐어드 레퍼런스를 생성합니다.
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();
유효한 오브젝트 없이 쉐어드 레퍼런스를 생성하려고 하면 컴파일되지 않습니다.
// 이들 중 어느 것도 컴파일되지 않습니다.
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;
// 이것은 컴파일되지만 NullObject가 실제로 null인지 확인합니다.
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;
쉐어드 포인터와 쉐어드 레퍼런스 간 변환
쉐어드 포인터와 쉐어드 레퍼런스 간의 변환은 일반적인 작업입니다. 쉐어드 레퍼런스는 암시적으로 쉐어드 포인터로 변환되며 새 쉐어드 포인터가 유효한 오브젝트를 참조한다는 추가 보장을 제공합니다. 변환은 노멀 구문으로 처리됩니다.
TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;
쉐어드 포인터가 null이 아닌 오브젝트를 참조하는 한 쉐어드 포인터 함수인 ToSharedRef 를 사용하여 쉐어드 포인터에서 쉐어드 레퍼런스를 생성할 수 있습니다. null 쉐어드 포인터에서 쉐어드 레퍼런스를 생성하려고 하면 프로그램이 어서트를 발생시킵니다.
// 잠재적인 어서트를 방지하려면 역참조하기 전에 쉐어드 포인터가 유효한지 확인하세요.
If (MySharedPointer.IsValid())
{
MySharedReference = MySharedPointer.ToSharedRef();
}
비교
쉐어드 레퍼런스가 서로 동일한지 테스트할 수 있습니다. 여기서는 동일한 오브젝트를 참조하면 같은 것이라는 뜻입니다.
TSharedRef<FMyObjectType> ReferenceA, ReferenceB;
if (ReferenceA == ReferenceB)
{
// ...
}