UPROPERTY()
언리얼 엔진의 리플렉션 시스템에 해당 변수를 등록하는 매크로 입니다.
메타 데이터를 사용해서 옵션을 적용해 줄 수 있습니다.
메타데이터는 엔진이 어떻게 이 변수를 다룰지에 대한 설정이고, 자주 쓰이는 메타 데이터로는
- Category = ""
- BlueprintCallable
- BlueprintReadWrite
- BlueprintReadOnly
- EditAnywhere
- VisibleAnywhere
이 있습니다.
UCLASS() 와 UFUNCTION() 도 마찬가지로 리플랙션을 위한 매크로 입니다.
리플렉션?
리플렉션은 한 마디로 코드구조를 런타임에 조회하고 참조 할 수 있는 기능입니다.
구체적으로는 아래와 같습니다.
- 런타임 타입 정보 확인
게임이 돌아가는 도중에 특정 객체가 어떤 클래스인지, 어떤 부모를 가졌는지 확인 - 변수 및 함수 조작 (에디터 연동)
언리얼 에디터 창에서 값을 입력 및 수정가능 - 가비지 컬렉션 (GC)
가비지 컬렉션 (GC)
표준 C++은 new/delete로 직접 관리 필요합니다. 이는 메모리 누수 위험과 dangling 포인터 문제가 발생 할 수 있습니다.
언리얼 엔진에서는 GC가 자동으로 관리를 합니다. 이로인해 안전한 메모리 해제와 개발자 실수를 방지합니다.
가바지 컬렉션이 있지만 TSharedPtr이라는 UObject 미상속 외부 라이브러리도 있습니다.

프로젝트 세팅에서 가바지 컬렉션 간격을 만들 수 있습니다. 간격이 짧을수록 부화가 심해집니다.
가비지 컬렉션의 작동 과정은
- Root Set 수집
- 참조 탐색
- 미참조 객체 찾기
- 제거
위와 같은 순서를 따름니다.
주의점
UPROPERTY()
UObject* A;
위와 같은 케이스는 GC가 추적하고 있지만
UObject* A;
위와 같은 케이스는 GC가 삭제할 위험이 있습니다.
만약 GC가 삭제를 해버렸고 코드에서 계속 사용하면 크래시가 발생합니다
또한 Dangling Pointer가 발생할 위험도 있습니다.
UObject* A = NewObject<UObject>();
위와 같은 케이스에서 GC가 삭제해도 A는 여전히 주소를 가지고 있습니다.
여기서 접근하게 되면 발생합니다.
UBT
언리얼 빌더 툴.
언리얼 프로젝트를 컴파일(빌드)하는 전용 빌드 시스템 입니다.
빌더 툴이 하는 일은
우선 언리얼 빌더 툴이 먼저 켜집니다.
빌더툴은 이 프로젝트에서 어떤 모듈과 플러그인이 사용되는지 확인합니다.
모듈이나 플러그인을 읽고 각자 에디터를 킨 컴퓨터에 맞춘 개발환경을 세팅합니다.
UHT를 실행합니다.
UHT
리플렉션 코드 생성기 입니다.
언리얼을 실행하게되면 컴파일러가 켜지기 전에 우선
프로퍼티들의 메타데이터를 수집한다
(프로퍼터는 UFUNTION, UPROPERTY, UCLASS)
.generated.h 코드 생성합니다.
CDO
특정 클래스의 원본 역할을 하는 마스터 객체
모든 UObject 클래스는 메모리에 자신만의 CDO를 딱 하나씩 가지고 있으며, 이 객체는 해당 클래스의 모든 기본값을 보관하고 있습니다.
생성 시점
CDO는 엔진이 실행되는 아주 초기 단계인 엔진 초기화 과정에서 생성됩니다.
UBT > UHT > 컴파일 > 엔진 켜지는 시점 (이때 생성)
UHT이 분석한 정보를 바탕으로 엔진이 각 클래스의 생성자를 딱 한 번 호출합니다.