게임엔진/Unreal

[Unreal] GetClass 와 StaticClass 의 차이

ShovelingLife 2023. 10. 26. 15:37

GetClass vs StaticClass

StaticClass 는 컴파일 타임에서 UClass 타입의 정보를 얻어오는 것이며, GetClass 는 런타임에서 실제 객체의 클래스를 조회할때 사용된다.

AMyActor* ActorPtr = NewObject<AMyActor>(...);
UObject*  ObjPtr   = Actor;

UClass* MyActorClass  = AMyActor::StaticClass(); // AMyActor
UClass* ObjectClass   = UObject::StaticClass();  // UObject
UClass* ActorPtrClass = ActorPtr->GetClass();    // AMyActor
UClass* ObjPtrClass   = ObjPtr->GetClass();      // AMyActor

StaticClass 는 컴파일 타임에 이미 정해진 것이다. 하지만 포인터가 가리키는 실제 객체의 타입은 런타임에서 달라질 수 있으므로, 실제 객체의 클래스를 리턴하는 GetClass 의 리턴값은 StaticClass 의 리턴값과 다를 수 있다.

 

+ 추가 테스트 코드

void ASampleCodingPractise::GetClassVsStaticClass()
{
	UTestUObject* TestUObject = NewObject<UTestUObject>(this,TEXT("TestUObject"));
	UClass* TestUObjectClass = TestUObject->GetClass();
	UClass* TestUObjectStaticClass = UTestUObject::StaticClass();
	UClass* TestUObjectStaticClassTakenFromGetClass = TestUObject->GetClass()->StaticClass();
	UE_LOG(LogCodePractise, Log, TEXT("TestUObject->GetClass(): %s"), *TestUObject->GetClass()->GetName());
	UE_LOG(LogCodePractise, Log, TEXT("UTestUObject::StaticClass(): %s"), *UTestUObject::StaticClass()->GetName());
	UE_LOG(LogCodePractise, Log, TEXT("TestUObject->GetClass()->StaticClass(): %s"), *TestUObject->GetClass()->StaticClass()->GetName());


	bool Test1 = false;
	if (TestUObject->IsA(TestUObject->GetClass()))
	{
		Test1 = true;
	}
	UE_LOG(LogCodePractise, Log, TEXT("TestUObject->IsA(TestUObject->GetClass() result is: %s"), Test1?TEXT("True") : TEXT("False"));


	bool Test2 = false;
	if (TestUObject->IsA(UTestUObject::StaticClass()))
	{
		Test2 = true;
	}
	UE_LOG(LogCodePractise, Log, TEXT("TestUObject->IsA(UTestUObject::StaticClass()) result is: %s"), Test2 ? TEXT("True") : TEXT("False"));

	bool Test3 = false;
	if (TestUObject->IsA(TestUObject->GetClass()->StaticClass()))
	{
		Test3 = true;
	}
	UE_LOG(LogCodePractise, Log, TEXT("TestUObject->GetClass()->StaticClass()) result is: %s"), Test3 ? TEXT("True") : TEXT("False"));
}

 

결과)

Output:
LogCodePractise: TestUObject->GetClass(): TestUObject
LogCodePractise: UTestUObject::StaticClass(): TestUObject
LogCodePractise: TestUObject->GetClass()->StaticClass(): Class

LogCodePractise: TestUObject->IsA(TestUObject->GetClass() result is: True
LogCodePractise: TestUObject->IsA(UTestUObject::StaticClass()) result is: True
LogCodePractise: TestUObject->GetClass()->StaticClass()) result is: False

 

언리얼 GetClass 와 StaticClass 의 차이 (koreanfoodie.me)