언리얼 C++ 프로그래밍

[언리얼 C++] 쉐어드 레퍼런스 사용법

언린이 2021. 7. 22. 19:13

쉐어드 레퍼런스는 엔진 시스템 외부의 데이터 개체에 대해 null이 불가능한 스마트 포인터입니다.

즉, 쉐어드 레퍼런스를 재설정하거나 null 개체를 할당하거나 빈 참조를 만들 수 없다는 뜻입니다.

따라서 쉐어드 레퍼런스에는 항상 유효한 개체가 포함되어 있습니다. 쉐어드 레퍼런스와 쉐어드 포인터 중 하나를 선택할때 빈 개체나 null이 가능한 개체가 필요하지 않는 한 쉐어드 레퍼런스가 기본 옵션입니다.

비어 있거나 null이 가능한 참조가 필요한 경우 쉐어드 포인터를 사용해야 합니다.

 

 

1. 선언 및 초기화

// Create a shared reference to a new node
TSharedRef<FMyObjectType> NewReference = MakeShared<FMyObjectType>();

쉐어드 레퍼런스를 선언할때는 항상 유효한 데이터 개체로 초기화를 해줘야 합니다.

 

// Neither of these will compile:
TSharedRef<FMyObjectType> UnassignedReference;
TSharedRef<FMyObjectType> NullAssignedReference = nullptr;

// This will compile, but will assert if NullObject is actually null.
TSharedRef<FMyObjectType> NullAssignedReference = NullObject;

위 예제 코드처럼 유효한 개체없이 쉐어드 레퍼런스를 생성하려고 하면 컴파일되지 않습니다.

 

 

2. 쉐어드 포인터와 쉐어드 레퍼런스 간에 변환

TSharedPtr<FMyObjectType> MySharedPointer = MySharedReference;

쉐어드 포인터와 쉐어드 레퍼런스 간에 변환하는 것은 일반적인 방법입니다. 쉐어드 레퍼런스는 암시적으로 쉐어드 포인터로 변환하고 쉐어드 포인터가 유효한 개체를 참조할 것이라는 추가 보증을 제공해줍니다.

 

// Ensure your shared pointer is valid before dereferencing to avoid a potential assertion.
If (MySharedPointer.IsValid())
{
    MySharedReference = MySharedPointer.ToSharedRef();
}

쉐어드 포인터가 null이 아닌 개체를 참조하는 한 ToSharedRef() 함수를 사용하여 쉐어드 포인터에서 쉐어드 레퍼런스를 만들 수 있습니다.

null 쉐어드 포인터에서 쉐어드 레퍼런스를 만들려고 시도하면 어서트가 발생하므로 항상 변환 이전에 타당성 검사를 해줘야 합니다.

 

 

3. 비교

TSharedRef<FMyObjectType> ReferenceA, ReferenceB;
if (ReferenceA == ReferenceB)
{
    // ...
}

쉐어드 레퍼런스는 operator==을 사용하여 비교할 수 있습니다.

여기서 비교하는 부분은 두 쉐어드 레퍼런스가 동일한 개체를 참조하는지에 대한 것입니다.