본문 바로가기
Unreal/Manual

Unreal GENERATED_BODY(), generated.h

by Dev_카페인 2024. 4. 30.
반응형

[Unreal/C++] GENERATED_BODY(), generated.h

 

Unreal UCLASS()에서의 GENERATED_BODY() 와 {className}.generated.h를 살펴봅니다.

 

GENERATED_BODY() 매크로는 ObjectMacros.h파일에 선언되어 있습니다. (하단 경로 참조)

UE_{Version}\Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectMacros.h

 

아래 사진을 살펴보면 708번 째 줄에 GENERATED_BODY() 매크로가 있습니다.

 

이 매크로는 다시 BODY_MACRO_COMBINE 매크로를 호출합니다.

CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY 인자를 받고 있는 것을 확인할 수 있고

이 매크로는 또 BODY_MACRO_COMBINE_INNER (A,B,C,D)를 호출합니다.

최종적으로 이 매크로가 가지고 있는 토큰 '##'을 사용하여 A, B, C, D 인자를 하나로 묶은 긴 단어를 만들어 냅니다.

 

결국 GENERATED_BODY() 매크로는

CURRENT_FILE_ID,

_,

__LINE__,

_GENERATED_BODY

4가지 정보를 합쳐 하나의 긴 문자를 만든다고 볼 수 있습니다.

 

이 정보는 어디에서 활용되는지 이해하려면 generated.h 파일을 열어봐야합니다.

이 파일은 프로젝트 폴더 내에서 아래 경로를 확인해야합니다.

{ProjectName}\Intermediate\Build\Win64\UnrealEditor\Inc\CatchMe\UHT

 

이 파일들이 복잡한 경로에 있는 이유는 굳이 이 파일을 건드릴 필요가 없다는 것을 의미합니다.

 

이 파일을 열어 확인해 보면 아래와 같이 복잡하고 알 수 없는 정보들로 가득합니다.

 

파일 하단을 보면 위에서 잠깐 보았던 CURRENT_FILE_ID 항목을 볼 수 있습니다.

BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_GENERATED_BODY) 에서 사용되었습니다.

그렇게 ID와 '_'가 들어가고 뒤로 라인 정보와 GENERATED_BODY라는 것이 붙게됩니다.

이 정보는 정확하게 합쳐져서 만들어진다고 볼 수 있습니다.

 

결론적으로 GENERATED_BODY() 매크로는 generated.h 파일의 저 부분을 담당하고 있다고 볼 수 있습니다.

그 아래에 선언된 매크로들은 몰라도 무방합니다.

궁금하다면 한 번 찾아보는 것도 좋지만, 객체 지향 설계를 위해서 제공되는 기능들을 언리얼 엔진이 자동으로 생성해서 지원해 준다고만 알고 있어도 코드를 작성하는데 지장이 없습니다.

 

generated.h 파일은 삭제가 되어도 언리얼 엔진이 자동으로 생성해줍니다.

삭제하게 되면 Unreal에서는 언리얼 에디터용 빌드에 있는 헤더파일을 파싱합니다.

Parsing headers for UnrealObjectEditor

이 작업은 UnrealHeaderTool(UHT)이라는 프로그램이 실행되면서 generated.h 파일을 생성합니다.

그러므로 {className}.generated.h 파일이 없다면 언리얼 C++ 코드를 사용할 수 없게 됩니다.

 

반응형