🔹 기본 원칙
UObject는 NewObject 또는 SpawnActor 등의 함수로 생성됩니다.
UObject를 참조하는 객체가 없거나, Root Set에 속하지 않으면 GC의 대상이 됩니다.
UObject는 TWeakObjectPtr, TSoftObjectPtr 등을 사용하면 안전하게 참조할 수 있습니다.
TSharedPtr / TUniquePtr은 UObject와 함께 사용하면 안 됩니다. (UObject는 GC가 관리하기 때문)
UObject의 멤버 변수나 배열을 따라가면서 참조가 존재하는지 확인합니다.
참조가 남아 있는 객체는 "살아 있음(Reachable)"으로 표시됩니다.
UPROPERTY() 매크로가 붙어 있지 않은 멤버 변수는 GC가 인식하지 못합니다.
🔹 2) 스윕 단계 (Sweep)
"살아 있음"으로 표시되지 않은 객체들을 정리합니다.
BeginDestroy()를 호출하여 객체가 정리될 준비를 합니다.
이후 실제 메모리를 해제하고, UObject가 삭제됩니다.
RemoveFromRoot()를 호출하면 다시 GC의 관리 대상이 됩니다.
✅ 2) UPROPERTY()
UPROPERTY() 매크로를 사용하면 GC가 객체를 자동으로 추적할 수 있습니다.
UPROPERTY()가 없으면 GC가 참조를 인식하지 못해 객체가 삭제될 수 있습니다.
✅ 3) Smart Pointer와 GC
TWeakObjectPtr: 안전하게 UObject를 참조할 수 있지만, 객체가 삭제되면 nullptr이 됩니다.
TSoftObjectPtr: 경로 기반으로 UObject를 참조하는 방식으로, 레벨 스트리밍에 유용합니다.