언리얼

리플렉션/UHT/UBT/CDO (feat. Garbage Collection)

eclipse2 2026. 4. 10. 16:38

1. 리플렉션

프로그램이 실행 중에 자기 자신의 구조를 조사하고 수정할 수 있는 능력

  •  정의: 컴파일러가 코드를 기계어로 바꾸고 나면 보통 변수 이름이나 함수 이름 같은 정보는 사라진다. 하지만 리플렉션 기능을 활용하면 실행 중에도 클래스 내의 변수, 함수의 이름과 같은 정보를 알아낼 수 있다.
  • 용도: 에디터 상세 창에 변수 노출, 블루프린트와 c++ 연결, 직렬화, 가비지 컬렉션 대상 파악.
  • 특징: 언리얼 엔진은 c++ 자체의 한계를 넘기 위해 고유의 리플렉션 시스템을 구축

가비지 컬렉션의 동작 원리

표준 C++ -> new/delete으로 직접 관리 필요

  • 메모리 누수 위험
  • dangling 포인터 문제(언젠가 터짐)

언리얼 엔진: GC가 자동 관리

  • 안전한 메모리 해제
  • 개발자 실수 방지

UObject를 상속받으면 관리할 수 있지만 아닌 경우 스마트 포인터를 사용할 수 있음

Object를 UPROPERTY로 감싸지 않으면 포인터를 사용하게 됐을 때 위험함

감싸지 않을 때는 스마트 포인터 TWeakObjectPtr, UObjectPtr 등 사용해야 함

UPROPERTY를 안 붙이는 경우 코드끼리만 상호작용할 때 즉 블루프린트에서 사용 안 할 때

실제 위크포인터 사용 예시, 적 유닛(Target)을 저장할 때, 적 유닛이 죽어서 없어질 수도 있어서 위크포인터로 저장


2. UBT(Unreal Build Tool) & UHT(Unreal Header Tool)

언리얼의 리플렉션 시스템을 지탱하는 두 시스템

언리얼은 표준 C++에 리플렉션 기능이 부족하기 때문에, 별도의 도구를 사용하여 추가 정보를 생성

 

UBT의 핵심 역할

  • 가장 먼저 실행되는 빌드 도구
  • 전체 프로젝트 구조 파악
  • 플랫폼별 환경 설정

주요 기능들

  • 플러그인 및 모듈 검색
  • .Target.cs 파일 분석
  • .Build.cs 파일 처리
  • 플랫폼 호환성 확인
  • 개발 환경 자동 구성

UHT가 하는 일

  • UCLASS, UPROPERTY, UFUNCTION 메타데이터 수집 (메타데이터는 사진의 촬영 정보처럼, 코드의 숨겨진 세부 정보)
  • MyObject.generated.h 파일 자동 생성
  • 에디터 디테일 창 연동 정보 생성(리플랙션)
  • 블루프린트 노드 연결 정보 준비(리플렉션)

정리 테이블:

구분 역할 설명
UBT 관리자 전체적인 빌드 프로세스를 관리. 어떤 모듈을 빌드할 지, 어떤 컴파일 옵션을 넣을지 결정
UHT  파서(Parser) 헤더 파일에서 UCLASS, UPROPERTY, UFUNCTION 같은 매크로를 찾아 분석, 리플렉션을 위한 코드(.generated.h, GENERATED_BODY()) 를 생성

- 흐름 : 소스 코드 작성 -> UBT 빌드 시작 -> UHT 헤더 분석 후 리플렉션 데이터 생성 -> 컴파일러 최종 빌드 수행

중요: UHT, 헤더파일의 변경은 라이브코딩으로 실행이 안됨. 따라서 빌드하고 실행해서 에디터를 켜야 문제없음


3. CDO(Class Default Object) - 붕어빵 틀 비유

클래스 당 딱 하나 존재하는 원본 모델 객체

  • 정의: 엔진이 시작될 때 즉 마지막 단계에서 각 클래스에 대해 생성되는 기본 객체
  • 특징: 해당 클래스의 모든 인스턴스가 생성될 때 기본 값으로 참고하는 마스터 복사본 역할을 함
    • 생성자에서 설정한 초기값들을 모두 이 CDO에 저장
  • 장점: 인스턴스를 수천 개 생성하더라도, 기본값 정보는 메모리상에 딱 하나만 존재하면 되므로 메모리 효율 증가, 빠른 초기화, 델타 직렬화

중요: CDO는 수정하지 말자!!