GC 추적과 델리게이트 바인딩에는 왜 UPROPERTY, UFUNCTION이 꼭 필요한가?
언리얼 엔진에서 UPROPERTY()와 UFUNCTION()은 단순히 에디터 노출을 위한 키워드 그 이상입니다. 이들은 언리얼의 리플렉션 시스템을 통해 다양한 내부 기능과 연동되며, 특히 Garbage Collection(가비지 컬렉션)과 델리게이트 바인딩에서 중요한 역할을 합니다. 이번 글에서는 이 두 시스템에서 왜 리플렉션이 반드시 필요한지를 집중적으로 다뤄보겠습니다. 전체적으로 GC 추적, 델리게이트의 개념과 활용 방식, 그리고 각각에 대해 UPROPERTY()와 UFUNCTION()이 필요한 이유를 구조적으로 설명하며, 마지막에는 리플렉션이 꼭 필요한 상황을 표로 정리해드립니다.
📦 Garbage Collection 추적
✅ GC란?
Garbage Collection은 사용하지 않는 객체를 자동으로 제거해 메모리 누수를 방지하는 시스템입니다. 기본적인 C++은 수동 메모리 관리 방식이지만, 언리얼 엔진은 자체 GC 시스템을 통해 UObject 기반 객체를 안전하게 관리합니다.
🔍 왜 UPROPERTY()가 필요한가?
언리얼의 GC는 C++ 포인터만으로는 객체를 추적하지 않습니다. 반드시 UPROPERTY()를 사용해 해당 객체를 리플렉션 시스템에 등록해야 GC가 이를 활성 참조(active reference)로 인식하고 수명을 관리합니다.
AActor* MyActor; // GC 대상 아님
UPROPERTY()
AActor* MyActor; // GC가 추적함
만약 UPROPERTY() 없이 UObject 포인터를 선언하면, 해당 객체가 제거된 후에도 포인터는 살아 있기 때문에, 예를 들어 해당 포인터를 통해 함수나 변수에 접근하려 하면 'Accessed None' 에러가 발생하거나 실행 중 충돌(Crash)이 발생할 수 있습니다. 특히 GC가 해당 객체를 제거한 이후 접근하면 런타임에서 예외 없이 프로그램이 강제 종료될 수 있습니다.
💡 핵심 요약
- GC는 UPROPERTY()가 있는 포인터만 추적함
- 누락 시 사용 중인 객체가 GC에 의해 삭제돼 크래시 유발 가능
- UObject 포인터는 반드시 UPROPERTY()로 선언해야 안전
📡 델리게이트 바인딩
✅ 델리게이트란?
델리게이트는 특정 이벤트 발생 시 등록된 함수를 실행할 수 있는 시스템입니다. C++뿐만 아니라 블루프린트에서도 이벤트 노드와 연결되어 시각적으로 함수 호출을 처리할 수 있어, 비프로그래머도 직관적으로 이벤트 로직을 구성할 수 있게 해줍니다. C#의 이벤트 시스템과 유사하며, 언리얼에서는 흔히 AddDynamic() 등을 통해 사용됩니다.
OnActorBeginOverlap.AddDynamic(this, &AMyActor::HandleOverlap);
이 코드는 액터가 겹칠 때 HandleOverlap 함수가 자동으로 호출되도록 합니다.
🔍 왜 UFUNCTION()이 필요한가?
언리얼의 델리게이트 시스템은 함수 정보를 런타임에 리플렉션을 통해 관리합니다. 이 정보를 기반으로:
- 함수 포인터를 안전하게 연결하고
- 이벤트를 직렬화하거나 복제할 수 있으며
- 블루프린트와의 연결도 유지됩니다
UFUNCTION()
void HandleOverlap(AActor* Other);
UFUNCTION() 없이 선언한 함수는 AddDynamic()으로 바인딩할 수 없고, 컴파일 에러가 발생합니다. AddDynamic()은 내부적으로 리플렉션 시스템을 통해 해당 함수를 등록하기 때문입니다.
💡 핵심 요약
- UFUNCTION()이 없으면 AddDynamic() 사용 불가
- 런타임 이벤트 처리에는 리플렉션 메타데이터가 필수
- 델리게이트 바인딩을 위해서는 반드시 UFUNCTION()을 붙여야 함
🧠 정리: 언제 리플렉션이 필요한가?
지금까지 살펴본 내용을 바탕으로, 각 기능별로 리플렉션이 필요한지를 한눈에 확인할 수 있도록 정리해보았습니다.
기능 리플렉션 필요 여부 관련 키워드
에디터 노출 | 선택적 | EditAnywhere 등 |
GC 추적 | 필수 | UPROPERTY() |
델리게이트 바인딩 | 필수 | UFUNCTION() |
블루프린트 연동 | 필수 | BlueprintCallable 등 |
네트워크 복제 | 필수 | Replicated, Server 등 |
🧩 마무리
UPROPERTY()와 UFUNCTION()은 단순한 꾸밈말이 아닌, 언리얼 엔진의 리플렉션 기반 구조를 활용하기 위한 핵심 키워드입니다. 특히 GC 추적과 델리게이트 바인딩처럼 엔진의 메모리 및 이벤트 시스템과 긴밀히 연결되는 기능에서는 반드시 사용해야만 하는 요소입니다.
🎮 게임 개발에서 발생하는 크래시나 예기치 않은 이벤트 누락은 대부분 UPROPERTY 누락으로 인한 GC 문제, 혹은 UFUNCTION 없이 델리게이트에 함수 바인딩을 시도하는 등의 실수에서 비롯됩니다. 이러한 문제를 예방하려면 UPROPERTY()와 UFUNCTION()의 쓰임새를 명확히 이해하고, 적절한 위치에 정확히 사용하는 습관을 들이는 것이 중요합니다.
'언리얼 엔진' 카테고리의 다른 글
Unreal Engine - FBX 헬기 모델 병합 및 Skeletal Mesh 변환 과정 (0) | 2025.04.21 |
---|---|
Unreal UI #8 - 데미지 텍스트 색상 · 위치 · 연속표시 문제 해결기 (1) | 2025.04.20 |
Unreal Engine 5.5 + Steam: JoinSession 실패 트러블슈팅 (0) | 2025.04.18 |
Unreal Engine - 애니메이션 몽타주를 활용한 상황별 연출 구현 정리 (0) | 2025.04.17 |
Unreal AI - AI 점프에 애니메이션 넣기 (0) | 2025.04.17 |