Class Default Object(CDO)
언리얼에서는 클래스 멤버 변수의 기본값을 에디터에서도 수정이 가능하고 C++ 클래스의 멤버 변수는 블루프린트 클래스에서 오버라이드 되기도 한다.
소스코드 에디터에서 생성자에다가 기본 값을 100으로 초기화 하더라도 에디터에서 200으로 기본 값을 수정할 수 있고 혹은 블루프린트 클래스에서 오버라이드 되어 300으로 수정될 수도 있다.
CDO는 C++ 클래스의 생성자에서 초기화 된 기본 값 뿐 아니라 블루프린트 클래스 애셋 등에서 초기화된 기본값까지 모두 한 번 반영을 시켜둔 개체이다. 그리하여 언리얼에서는 개체를 생성할 때 마다 CDO의 값을 그대로 복사받고 그 뒤에 생성자가 호출되는 방식을 채택했다. 이를 통해 한 클래스로부터 다수의 개체가 생성될 때 일관성 있게 생성되게끔 했다.
CDO의 생성 시점
언리얼 엔진이 초기화 되면(C++ 빌드하고 실행될 때) 엔진 구동에 필요한 모듈이 순차적으로 로딩이 된다.
해당 모듈에 작성된 언리얼 클래스들도 함께 로드되면서 클래스마다 CDO가 생성이 된다.

엔진이 초기화되면 모든 CDO는 메모리에 올라간 상태다. 메모리에 올라간 CDO는 GetDefault() 함수를 통해 가져올 수 있다. 엔진이 종료될 때 까지 상주하기 때문에 언제든지 가져올 수 있다.
Garbage Collection(GC)
기존의 C++에서는 할당 받은 메모리는 반드시 프로그래머가 직접 해제까지 해줘야 한다.
이를 지키지 않으면 메모리 누수부터 여러 문제점이 발생된다.
언리얼 엔진의 메모리 관리는 Mark-Sweep 방식의 가비지 컬렉션 시스템을 통해 관리가 된다.
더이상 사용되지 않는 언리얼 오브젝트를 자동으로 감지하고 특정 상황에 회수하는 시스템이다.
생성된 모든 언리얼 오브젝트 정보를 모아둔 저장소를 사용해서 추적한다.
루트 셋이라는 UObject 개체 집합이 있음. 이 루트 셋에서 부터 참조 여부를 파악하기 시작한다.
Mark-Sweep 방식의 가비지 컬렉션
1. 루트 셋의 UObject 개체가 참조하는 개체를 찾아서 마크를 한다.(루트 셋은 가비지 컬렉션의 대상이 아님.)
2. 마크된 개체로부터 해당 개체가 참조하는 또 다른 개체를 찾아서 다시 마크를 반복한다.
3. 저장소에서 마크된 개체와 마크되지 않은 개체로 나뉜다.
4. 가비지 컬렉터는 저장소에서 마크되지 않은 개체들의 메모리를 회수한다.(Sweep)
위에서 말한 저장소는 GUObjectArray로 관리되는 모든 언리얼 오브젝트 정보를 저장하는 전역 자료구조이다.
GUObjectArray의 각 요소에는 가비지 컬렉션 관련 플래그 정보가 있다.
RootSet 플래그 : 다른 언리얼 오브젝트로부터 참조가 없어도 회수 되지 않는다.
Garbage 플래그 : 다른 언리얼 오브젝트로부터 참조가 없어서 회수 예정이다.
프로그래머가 직접 플래그를 세울 수 있다.
지정된 주기마다 가비지를 몰아서 없애는 주기를 GCCycle이라 한다.
Project Settings > Garbage Collection에서 확인 가능하다.
언리얼 오브젝트 사용을 통한 C++ 로우 포인터 문제 해결
메모리 누수: 가비지 컬렉션 시스템을 통해 자동으로 해결.
댕글링 포인터: 언리얼에서는 IsValid() 함수를 제공함. nullptr 예외처리만 하면 댕글링 포인터 문제가 발생할 수 있음.
와일드 포인터: 언리얼 오브젝트의 속성은 UPROPERTY() 매크로 작성시 자동 nullptr 초기화. UPROPERTY() 매크로를 작성하지 않은 속성은 초기화 되지 않음.
'언리얼 + cpp' 카테고리의 다른 글
| 언리얼 C++ (새로 알게 된 지식들) (0) | 2025.10.24 |
|---|---|
| 언리얼 C++ (Reflection, Delegate) (0) | 2025.10.23 |
| 언리얼C++ 11일차(파티클, 사운드) (0) | 2025.09.26 |
| 언리얼C++ 10일차(UI 애니메이션, Widget Component) (0) | 2025.09.25 |
| 언리얼C++ 10일차(메뉴 위젯, 게임 흐름에 따라 UI 생성하기) (0) | 2025.09.25 |