언리얼/언리얼 C++

언리얼 C++ - 구조체

monstro 2024. 7. 27. 16:40
728x90
반응형

C++을 통해 동작하는 무언가를 만들게 되면, 대부분의 상황에서는 클래스를 사용합니다.

클래스라는 거대한 틀에서 찍어낸 인스턴스라는 객체를 사용하여 프로그램을 구성하는 것이 

객체지향 프로그래밍의 기본구조이기 때문입니다.

 

그런데, 다른 코드 예시를 살펴보면 눈에 띄는 구조가 하나 있습니다.

구조체(Struct)라는 것인데, 살펴보면 클래스와는 그렇게 큰 차이가 없는 듯 합니다.

하지만, 클래스처럼 구조체 역시 프로그램의 구성에 있어서 매우 유용하고 중요한 개념입니다.

 

이러한 구조체를 언리얼 엔진에서는 어떻게 사용하는지 한번 알아보겠습니다.

 

1) 구조체에 대하여

구조체는 클래스와 마찬가지로 자신만의 멤버를 갖게 됩니다.

하지만 클래스가 멤버와 더불어 수행하는 동작만을 갖고 있다면

구조체는 오로지 멤버에만 집중하는 것이 클래스와 가장 큰 차이점입니다.

 

더 자세하게 구조체와 클래스간의 차이점에 대해 알아보겠습니다.

우선 구조체입니다.

  1. 멤버는 기본적으로 public입니다.
  2. struct 키워드를 통해 선언됩니다.
  3. 주로 데이터를 그룹화하는데 사용합니다.

다음으로 클래스입니다.

  1. 멤버는 기본적으로 private입니다.
  2. class 키워드를 통해 선언됩니다.
  3. 주로 데이터를 정의하거나 확장하는데 사용합니다.

위와 같은 차이점으로 인해

데이터를 하나의 그룹으로 관리하고 싶다면 구조체를,

데이터를 추상화와 상속을 통해 정의하거나 확장하고 싶다면 클래스를 사용하시면 됩니다.

 

2) 언리얼 엔진에서의 구초제 - UStruct

언리얼 엔진에서는 U가 수식된 매크로를 사용하여 언리얼 엔진이 리플렉션(=관리)할 수 있게 한다고 말씀드렸습니다.

구조체 역시 USTRUCT()를 작성하여 언리얼 엔진이 관리할 수 있게 만들어 줄 수 있습니다.

그러나 클래스와는 다르게 제한된 부분이 여럿 존재합니다. 

이는 이어질 특징에서 설명하도록 하겠습니다.

 

아래의 그림은 UOBJECT로부터 파생된 언리얼 리플렉션 매크로 간의 계층구조입니다.

언리얼엔진에서는 구조체에 USTRUCT()를 수식해도 되고 수식하지 않아도 되지만,

수식하지 않는 경우에 해당 구조체는 언리얼 엔진의 관리를 받지 못해 설계자가 직접 제어해야 하는 위험이 존재합니다.

그러므로 구조체는 최대한 단순하게 만들어주는 것이 좋습니다.

 

3) 언리얼 엔진에서 구조체의 특징

1) 단순한 데이터 타입에 적합합니다. 따라서 복잡한 인터렉션을 구현하는 것은 권장하지 않습니다.

2) USTRUCT가 수식된 구조체 내에서는 UPROPERTY()는 지원하지만, 가비지 컬렉터의 관리 대상이 되지 않습니다.

3) 또한 UFUNCTION()은 지원되지 않습니다.

4) 언리얼 엔진에서는 구조체를 위한 생성과 소멸 함수를 자동적으로 생성하는 기능이 제공됩니다.

5) 대부분의 경우 GENERATED_BODY() 매크로를 사용하여 언리얼 엔진이 일부라도 관리하게끔 하는 것이 좋습니다.

6) 구조체 그 자체는 언리얼 오브젝트가 아니므로 NewObject()를 통한 생성이 불가능합니다.

7) 또한 언리얼 오브젝트가 아니므로 구조체를 선언할 때는 가급적 F를 앞에 수식해주는 것이 좋습니다.

 

위의 특징을 종합하여 보면 구조체는 

언리얼 엔진에서 데이터를 저장하고 또 데이터를 전송하는 역할을 주로 수행할 수 있음을 알 수 있습니다.

 

4) UStruct의 사용예시

이제 간단하게 구조체를 사용한 예시를 보여드리겠습니다.

새로운 GameInstance 클래스를 하나 만들고 GameInstance클래스의 헤더 파일 안에 구조체를 만들었습니다.

 

 

헤더 파일은 위와 같이 구성되고,

 

cpp 파일에서는 구조체의 3개의 인스턴스를 대상으로 비교 연산을 하여 로그를 띄우게 됩니다.

실행결과는 다음과 같습니다.

 

 

언리얼 엔진에서는 간단한 데이터의 집합을 사용할 때 구조체를 사용할 것을 권장합니다.

구조체 역시 언리얼 오브젝트로서 다룰 수 있지만, 다른 언리얼 오브젝트와는 다른 점이 있음을 명시해주셔야 합니다.

긴 포스트를 읽어 주셔서 감사드립니다.

728x90
반응형