unreal 5기

251015 언리얼엔진 본캠프 45일차 UCLASS와 USTRUCT

parkjinnam 2025. 10. 15. 19:37

UStruct와 UClass

언리얼엔진 C++을 다루다 보면 UCLASS()와 UStruct 같은 매크로를 볼 수 있다 C++에서의 class와 struct는 굳이 비교하자면 class는 struct에서 발전된 문법이기에 기본적인 성질들과 동작은 같고 기본 접근 지정자가 struct는 public class는 private라는 차이점만 존재할 뿐이고 언리얼에서의 UCLASS와 USTRUCT도 비슷한 맥락이겠거니 생각하게 되는데 이는 잘못된 생각이다. 오늘은 이 둘에 대해서 공부해 보았다.

 

UStruct(구조체)

언리얼엔진에서의 구조체역할을 하는 UStruct는 데이터를 묶어서 관리하는 목적으로 사용된다. C++에서 처럼 다른 C++자체의 Struct를 상속하는 것은 가능 하지만 UObject의 계열이 아니기에 UObject를 상속받는 것은 불가능하다. 또 제한적이나마 리플렉션 시스템을 지원하기에 USTRUCT(Atomic, BlueprintType)의 방식으로 선언하면 블루프린트에 변수로 활용이 가능하게끔 노출이 가능하고  추가로 인수로 받는 Atomic은 해당 구조체가 하나의 단위로서 동작하여 구조체를 저장하거나 전송할 때 온전한 상태로 수행됨을 보장한다. 그렇기에 UStruct는 게임 데이터나 벡터, 설정값 등의 구조를 정의할 때 사용되며 UPROPERTY()나 USTRUCT()를 사용하여 에디터에 노출이 가능하다. 또한 값으로 다루며 복사로 전달하는 특징이 있으며 GC의 대상이 아니기에 UStruct를 소유한 객체에서 메모리를 관리하거나 수동적인 메모리 관리가 필요하며 UFUNCTION()사용이 불가능하다.

 

 

UClass

UClass는 언리얼엔진에서 객체를 정의하고 관리하기 위해서 사용된다. 언리얼 엔진의 모든 객체는 UObject를 통해 관리되기에  UObject 기반으로 해야 한다. 또한 UStruct와 다르게 리플렉션 시스템에 완전히 통합되어 있으며 에디터에 노출시키거나 블루프린트에서 사용하기 위해서는 UCLASS() 매크로가 필요하다. 이렇기에 UClass는 게임 오브젝트, 엑터, 컴포넌트 등 동적인 객체를 정의하는 데 사용되며 네트워크 복제나 블루프린트 상호작용 등 고급 기능을 지원한다. 또한 주로 포인터로 다루게되며 GC의 대상이기에 에디터에서 자동으로 메모리를 관리해주며 UFUNCTION()를 사용하여 함수 정의 및 블루프린트에 노출시키는 것이 가능하다.

 

둘의 차이점

기본 접근자의 차이 밖에 없던 C++ 에서와는 다르게 언리얼엔진에서의 구조체와 클래스는 정말히 다른 사용목적을 갖고 사용하게 된다. UClass는 객체와 동작을 정의하고 UStruct는 데이터를 묶는 가벼운 컨테이너로 사용된다. UClass는 리플렉션 시스템이 완전 지원되는데 반해 UStruct는 제한적인 지원만 된다는 점과 GC의 대상인 UClass와 그와 반대로 GC의 대상이 아닌 UStruct도 기억해 두면 좋다.