하나의 언리얼 오브젝트가 만들어지기 위해서는 실제 컴파일 전에 언리얼 헤더 툴에 의해 헤더 파일을 분석하는 과정이 선행되며, 이 과정이 완료되면 Intermediate 폴더에 언리얼 오브젝트의 정보를 담은 메타 파일이 생성됩니다.
언리얼 엔진이 컴파일 전에 먼저 메타 소스 파일과 헤더 파일을 생성하는 목적은 여러가지가 있겠지만, 기존의 C++ 문법에서 제공하지 못하는 런타임에서의 빠른 클래스 정보의 검색이라고 생각합니다.
이 메타 정보는 언리얼 엔진이 지정한 UClass라는 특별한 클래스를 통해 보관됩니다. UClass에는 언리얼 오브젝트에 대한 클래스 계층 구조 정보와 멤버 변수, 함수에 대한 정보를 모두 기록하고 있습니다. 하지만 단순히 검색하는 것에서 더 나아가, 런타임에서 특정 클래스를 검색해 형(Type)을 알아내 인스턴스의 멤버 변수 값을 변경하거나 특정 인스턴스의 멤버 함수를 호출하는 것이 가능합니다. C++에서 말이죠. Java나 C#과 같은 C++ 다음 세대의 언어에서는 이와 유사한 기능을 리플렉션(Reflection)이라는 이름으로 제공합니다.
정리하면 Java나 C#의 리플렉션 기능을 C++ 표준 문법에서는 제공하지 않으므로 언리얼 엔진이 자체적으로 프레임워크를 만들어 제공한다고 생각하면 됩니다.
컴파일 단계에서 언리얼 오브젝트마다 UClass가 생성된다면,
실행 초기의 런타임 과정에서는 언리얼 오브젝트마다 클래스 정보와 함께 언리얼 오브젝트의 인스턴스가 생성됩니다. 이 특별한 인스턴스는 언리얼 오브젝트의 기본 세팅을 지정하는데 사용되는데,
이를 클래스 기본 객체 ( Class Default Object ) 줄여서 CDO라고 합니다.
언리얼 엔진에서 CDO를 만드는 이유는 언리얼 오브젝트를 생성할 때마다 매번 초기화 시키지 않고, 기본 인스턴스를 미리 만들어 놓고 복제하는 방식으로 메커니즘이 구성되어 있기 때문입니다. 하나의 언리얼 오브젝트가, 예를 들어 복잡한 기능을 수행하는 캐릭터까지 담당할 정도로 기능이 확장되면, 굉장히 큰 덩어리의 객체로 커질 수 있습니다.
만일 게임 실행 중, 런타임에서 이 캐릭터를 한번에 100명을 스폰시킨다고 가정해봅시다. 캐릭터를 하나씩 처음부터 생성하고 초기화시키는 방법보다, 미리 큰 기본 객체 덩어리를 복제한 후에 속성 값만 변경하는 방법이 보다 효과적이겠지요?
정리하자면 하나의 언리얼 오브젝트가 초기화 될 때에는 두 개의 인스턴스가 항상 생성됩니다.
언리얼 오브젝트의 생성자는 인스턴스를 초기화해 CDO를 제작하기 위한 목적으로 사용됩니다. 이 생성자 코드는 초기화에서만 실행되고 실제 게임 플레이에서 생성자 코드는 사용할 일이 없다고 보면 됩니다.
참고로 언리얼 엔진에서 게임 플레이에서 사용할 초기화 함수는 생성자 대신 Init 이나 혹은 BeginPlay 함수를 제공합니다.
언리얼 엔진이 로딩될 때 위 과정을 거치게 됩니다.