언리얼 엔진 5/공부

[언리얼 엔진 5] 언리얼 엔진에서의 순수 가상함수 사용법

ciel45 2024. 4. 10. 20:53

순수 가상함수는 부모클래스에서 당장은 구현을 제공하지 않고, 자식클래스에서 구현을 강제하는 문법이다.

 

C++ 프로그래밍에서, 순수 가상함수는 다음과 같은 포맷을 사용한다.

virtual void MyFunc() = 0;

 

C++의 순수 가상함수는 C# / java에서의 추상 함수와 같다.

 

순수 가상함수는 자식클래스가 해당 함수를 무조건 오버라이딩하도록 함으로써, 동적 바인딩을 통한 확장성을 높여 프로그램의 디자인을 좋게 만든다.

 

그런데, 언리얼 엔진 5에서는 순수 가상함수의 문법이 조금 다르다.

상단의 네이티브 C++ 문법을 그대로 쓰면, 다음과 같은 컴파일 에러 메시지를 볼 수 있다.

 

'Only functions in the second interface class can be declared abstract'.

 

기본적으로 언리얼 엔진에서 interface가 아닌 모든 UClass들은 CDO를 만들어야 하기 때문에, 모든 함수가 구현을 가지고 있어야 하기 때문이다.

 

CDO에 대한 설명은 https://ciel45.tistory.com/3

 

[언리얼 엔진 5] CDO(Class Default Object)에 대하여

언리얼 엔진 5는 Actor를 상속받은 C++클래스를 사용할 때, 해당 클래스를 기반으로 CDO를 생성한다. CDO란? 언리얼 엔진의 Reflection 시스템에 포함된 오브젝트의 Master Copy 각 클래스마다 만들어지는

ciel45.tistory.com

 

 

따라서 언리얼 엔진에서는 CDO 시스템을 사용하면서도 내부적으로 순수 가상함수를 쓸 수 있게 해주는 문법을 만들었다.

 

그 문법은 다음과 같다.

//PURE_VIRTUAL 매크로 사용
virtual void MyFunc() PURE_VIRTUAL (MyClass::MyFunc,);

 

 

다소 해괴한 문법이지만, 실제로 저렇게 작성할 시 가상함수가 잘 작동되는 것을 볼 수 있다.

 

 

 

프로젝트에서의 사용 예시 : https://ciel45.tistory.com/72

 

블루아카이브 TPS게임 개발일지 (54) - EX 스킬 제작 2 + LSP

바로 이전 포스팅에서 ExProjectile을 임시로 만들었는데, ExProjectile도 제대로 C++ 클래스를 만들어 코드 상으로 관리하고자 한다. ExProjectile은 Projectile과 굉장히 비슷하다. Projectile의 거의 모든 특징

ciel45.tistory.com