언리얼에서 인터페이스 클래스는 다양한 액터와 객체가 구현할 수 있는 인터페이스 함수들을 선언하는 클래스이다. UInterface 베이스 클래스와 IInterfaceName 인터페이스 객체를 다루고 있다.
인터페이스 클래스는 여러 클래스간에 공통의 기능(메서드)을 강제하는 계약(Contract)을 정의할 때 사용한다. C++의 순수 가상함수를 이용한 인터페이스와 유사하지만 언리얼은 UInterface 라는 시스템을 통해 리플렉션과 블루프린트 통합, 가비지 컬렉션 등의 엔진 기능과도 연동할 수 있도록 지원한다.
언리얼에서 예를 들어 ItemInterface 라는 인터페이스를 만들려면 두 개의 클래스를 생성해야 한다.
👉 UItemInterface → UInterface
를 상속받는 "메타데이터 클래스"
👉 IItemInterface → 실제로 인터페이스를 구현하는 "기능 클래스"
즉, 인터페이스를 선언하면 UItemInterface
와 IItemInterface
두 개가 동시에 필요하다.
(🔥여기서 잠깐) 메타 데이터의 일반적 의미 : 메타데이터(metadata or metainformation)는 데이터(data)에 대한 데이터이다. 이렇게 흔히들 간단히 정의하지만, 캐런 코일(Karen Coyle)에 의하면 '어떤 목적을 가지고 만들어진 데이터(constructed data with a purpose)'라고도 정의한다.
언리얼 엔진에서 메타데이터(Metadata)는 에디터 및 리플렉션 시스템에서 클래스, 변수, 함수 등의 속성을 정의하는 추가 정보를 의미한다. 이를 통해 특정 기능을 추가하거나, 엔진이 객체를 처리하는 방식을 제어할 수 있다.
언리얼에서 인터페이스를 만드는 방식
언리얼 엔진의 인터페이스는 일반적인 C++ 인터페이스와 다르게 UCLASS가 적용된 "메타데이터용 클래스"와 C++인터페이스 클래스로 나뉘어 있다.
왜 UInterface가 필요한가?
UInterface 클래스는 리플렉션 시스템이 해당 인터페이스를 인식할 수 있도록 하는 역할을 한다.
언리얼 엔진의 리플렉션 시스템은 UCLASS, USTRUCT, UENUM 등의 오브젝트만 인식할 수 있다.
그런데, C++의 순수 인터페이스는 UObject가 아니기 때문에 리플렉션 시스템이 인식할 수 없다.
즉, 리플렉션 시스템이 인식하도록 하기 위해 UInterface가 필요하다.
UItemInterface
와 IItemInterface
의 관계// 1️⃣ 인터페이스의 메타데이터 부분 (UItemInterface)
UINTERFACE(MINIMAL_API)
class UItemInterface : public UInterface
{
GENERATED_BODY()
};
// 2️⃣ 실제 인터페이서 기능을 정의하는 부분 (IItemInterface)
class IItemInterface
{
GENERATED_BODY()
public:
virtual void UseItem() = 0; // 인터페이스에서 꼭 구현해야 하는 함수 (순수 가상 함수)
};
이제 이 인터페이스를 사용하려면 IItemInterface를 상속해야 한다.
class AMyCharacter : public AActor, public IItemInterface
{
GENERATED_BODY()
public:
virtual void UseItem() override
{
UE_LOG(LogTemp, Warning, TEXT("Item Used"));
}
};
📌 UItemInterface
는 직접 사용할 일이 거의 없고, IItemInterface
만 상속받아서 사용한다.