본문 바로가기
Unreal

왜 언리얼 엔진의 클래스 등록 절차는 복잡할까?

by Oz Driver 2025. 12. 27.

유니티에 비해 언리얼은 클래스 등록 절차가 다소 시간이 걸리고 복잡해 보입니다.

이것은 언리얼 자체의 문제라기 보다는 지원하는 언어가 C++ 이라는 보다 근본적인 이유에 있습니다. 

 

1. C# 과 C++ 의 근본적인 차이

C# 과 C++의 가장 큰 차이는 런타임에 클래스 정보를 가져올 수 있느냐의 차이입니다.

용어로는 리플렉션이라고 하는데 C# 은 런타임에 리플렉션을 지원하는 언어입니다. 

쉽게 설명하면, 프로그램이 실행 중일 때, 클래스 이름, 멤버 변수, 함수 정보 같은 타입 정보를 런타임에서 확인할 수 있다는 의미입니다.

 

반면 C++은 런타임에 클래스 정보를 조회할 수 없는 언어입니다. 언어 차원에서 리플렉션을 지원하지 않기 때문입니다. 따라서 프로그램이 실행된 이후에는 이 클래스가 어떤 멤버를 가지고 있는지 어떤 함수가 정의되어 있는지를 언어 차원에서 알 방법이 없습니다. 이 차이로 인해 C++ 이 성능에서는 우위에 있지만, 개발 과정에서는 불편함으로 작용합니다.

 

2. 컴파일 타임에 리플렉션을 구현하여 해결

C++에는 리플렉션이 없기 때문에 언리얼 엔진은 컴파일 타임에 리플렉션과 유사한 시스템을 직접 구현했습니다.

그 대표적인 수단이 다음과 같은 매크로들입니다.


UCLASS
USTRUCT
UPROPERTY
UFUNCTION

 

이들은 C++ 문법이 아니라 엔진에게 이 클래스와 멤버를 등록하라는 표식입니다.
언리얼은 이 표식을 통해 에디터, 블루프린트, 직렬화, 네트워크 등에서 사용할 정보를 미리 수집합니다.

 

3. UHT 의 역할

이 작업을 담당하는 것이 UHT (Unreal Header Tool) 입니다.

UHT 는 C++ 컴파일러가 아니라, 언리얼 전용 도구입니다.

헤더 파일을 읽어서 엔진이 사용할 메타 정보를 생성하고 자동으로 필요한 코드들을 만들어냅니다.
이 과정에서 generated 헤더 파일이 생성되고 클래스 정보가 엔진에 등록됩니다.

 

4. 왜 엔진을 다시 실행해야 할까

헤더에 클래스 구조가 변경되면 UHT 가 다시 실행되어야 합니다.
리플렉션 정보 자체가 다시 만들어져야 하기 때문입니다.

그 결과 클래스 등록, 코드 생성, 컴파일, 엔진 재구동 이라는 비교적 복잡한 과정을 거치게 됩니다.

유니티는 이 과정을 C# 의 런타임 리플렉션으로 처리합니다.
그래서 이런 복잡한 단계가 없고 개발자 입장에서는 훨씬 개발 친화적으로 느껴집니다.

 

5. 블루 프린트

언리얼의 클래스 등록 절차가 복잡한 이유는 엔진 설계의 문제가 아니라 C++이라는 언어의 근본적인 한계 때문입니다. 언리얼은 이 문제를 블루프린트라는 리얼타임 리플렉션 시스템으로 어느 정도 해결했습니다.
블루프린트는 C# 처럼 동작하기 때문에 C++에 비해 느릴 수는 있지만 개발의 용이함이라는 큰 장점이 있습니다.

최근에는 컴퓨터 성능이 크게 향상되었기 때문에 C#으로도 충분히 게임을 만들 수 있는 것처럼 블루프린트를 과도하게 남발하지 않는다면 가성비 좋은 선택이 될 수 있습니다.