리플렉션이란?.

리플렉션(Reflection)은 프로그램이 런타임(실행 중)에 자기 자신을 조사하고 수정할 수 있는 기능이다.
쉽게 말해, 코드가 자기 자신의 구조(클래스, 변수, 함수 등)를 런타임에 확인하고 조작할 수 있도록 하는 시스템.
(리플렉션은 그래픽 용어이기도 하기때문에 혼동 조심!)
C++은 리플렉션 기능이 지원하지 않는다(C#은 지원 해준다.)
그래서 언리얼은 리플렉션 시스템을 만들었다.Unreal Header Tool(UHT)가 그 프로젝트를 컴파일 할 때 해당 정보를 수집합니다.
언리얼 리플렉션에 대한 이해
문서 : https://www.unrealengine.com/ko/blog/unreal-property-system-reflection

Unreal Header Tool (UHT)란

Unreal Header Tool(UHT)은 언리얼 엔진의 리플렉션 시스템을 처리하는 도구로, UCLASS, USTRUCT, UPROPERTY, UFUNCTION 등의 매크로를 분석하고 필요한 코드 및 메타데이터를 자동으로 생성하는 역할을 합니다.

Unreal Header Tool (UHT)동작 과정 : UHT는 빌드 과정에서 실행되며, UnrealBuildTool(UBT)이 UHT를 호출하여 헤더 파일을 분석하고 필요한 파일을 생성합니다.

 

  • C++ 소스 파일에서 UCLASS, USTRUCT, UPROPERTY, UFUNCTION을 찾음
  • 이 정보들을 기반으로 자동으로 *.generated.h 파일 생성( 중요! *.generated.h는 항상 제일 Include 마지막 구간에 선언해줘야 한다.!!)
  • 엔진이 런타임에서 리플렉션 시스템을 활용하여 객체를 관리할 수 있도록 지원

UHT가 처리하는 주요 매크로
UCLASS() :
매크로는 언리얼 엔진의 리플렉션 시스템에서 객체를 관리할 수 있도록 함
GENERATED_BODY() :
UHT가 자동 생성한 코드와 연결
(GENERATED_USTRUCT_BODY() / GENERATED_UCLASS_BODY() 가있었는데  5들어오면서 GENERATED_BODY() 통합 되었다.)
UPROPERTY : 가비지 컬렉션 & 직렬화 지원( UPROPERTY를 사용하면 에디터에서 수정 가능, 가비지 컬렉션(GC)에서 자동 관리됨)
UFUNCTION - 블루프린트 및 네트워크 지원( UFUNCTION을 사용하면 블루프린트에서 호출 가능)
USTRUCT - 언리얼 구조체( USTRUCT는 언리얼의 데이터 구조체를 정의하는 매크로)

언리얼 오브젝트의 구성 이미지
언리얼 오브젝트의 클래스 기본 오브젝트 이미지

프로퍼티 시스템에 대한 유형 계층구조

UField  (모든 리플렉션 대상의 기반 클래스)
├── UStruct        (클래스 및 구조체를 위한 기본 클래스)
│   ├── UClass         (C++ 클래스 / UCLASS() 기반)
│   ├── UScriptStruct  (C++ 구조체 / USTRUCT() 기반)
│   ├── UFunction      (C++ 함수 / UFUNCTION() 기반)

├── UEnum         (C++ 열거형 / UENUM() 기반)

├── UProperty     (C++ 멤버 변수 / UPROPERTY() 기반)
    ├── FIntProperty        (int32)
    ├── FFloatProperty      (float)
    ├── FBoolProperty       (bool)
    ├── FObjectProperty     (UObject* 참조)
    ├── FStructProperty     (UStruct 기반 구조체)
    ├── FArrayProperty      (TArray<>)
    ├── FMapProperty        (TMap<>)

UField → 모든 리플렉션 대상의 최상위 클래스
UStruct → UClass(클래스), UScriptStruct(구조체), UFunction(함수)의 부모 클래스
UEnum → UENUM()으로 선언된 열거형 관리
UProperty → UPROPERTY()로 선언된 멤버 변수 관리

 

'언리얼 엔진 공부 > 언리얼C++' 카테고리의 다른 글

직렬화  (2) 2025.04.08
언리얼C++델리게이트(Delegate)  (0) 2025.04.03
컴포지션  (0) 2025.04.03
인터페이스  (1) 2025.04.02
언리얼C++ 기본 타입과 문자열(Unreal C++ Primitive Types And String)  (0) 2025.03.31

+ Recent posts