⚡이 문서는 이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 강의를 바탕으로 작성되었습니다.
인터페이스란 ?
객체가 반드시 구현해야하는 행동을 지정할때 사용하는 타입이다.
언리얼의 Pawn 클래스 -> 언리얼 엔진에서의 오브젝트 설계의 한 예시임
- Pawn 클래스는 Actor 클래스를 상속받았음. 월드에 배치되는 모든 오브젝트를 Actor라고 함
- Pawn은 길찾기 시스템을 반드시 사용하면서 움직이는 오브젝트임 (INavAgentInterface 인터페이스를 구현)

언리얼 인터페이스 특징
인터페이스를 생성하면 두 개의 클래스가 생성됨
- U로 시작하는 타입 클래스
- I로 시작하는 인터페이스 클래스
I 인터페이스 클래스를 사용해서 구현을 진행한다.
- U 타입 클래스의 용도 -> 런타임에 인터페이스의 구현 여부를 파악하는 용도밖에 없다.
- U 타입 클래스에서 작업할 일 자체가 없음
- 인터페이스 구성 및 구현은 I 인터페이스에서 전부 진행한다.
C++ 인터페이스의 특징을 가진다
- Java, C#과 달리 인터페이스에서 구현이 가능하다.
인터페이스 생성
언리얼 에디터에서 Tool -> New c++ Class 선택 후 Common Classes에서 가장 아래를 찾으면 Unreal Interface 가 있으니 클릭한다.

생성된 인터페이스는 VS 솔루션 탐색기에서 확인 가능하다

인터페이스 코드 구조
LessonInterface.h 코드
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "LessonInterface.generated.h"
// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class ULessonInterface : public UInterface
{
GENERATED_BODY()
};
/**
*
*/
class UNREALINTERFACE_API ILessonInterface
{
GENERATED_BODY()
public:
virtual void DoLesson() = 0;
};
다음은 코드에 대한 설명이다.
- ULessonInterface : 타입 정보를 관리하기 위해 언리얼 엔진이 자동으로 생성한 클래스다. 해당 클래스에서 작업을 할 일은 없을것이다. 타입을 관리하기 위해 자동으로 생성된 코드라는 점만 알아두자.
- ILessonInterface : 실제로 인터페이스 관련 기능을 구현하기 위해 수정해야 되는 클래스다.
- ILessonInterface를 상속받는 클래스는 반드시 DoLesson() 함수를 구현해야 한다.
ILessonInterface를 상속받는 클래스가 DoLesson() 함수를 구현하지 않으면 컴파일 오류가 발생한다.

DoLesson() 가상함수를 반드시 미구현 상태로 둘 필요는 없다. 원한다면 미리 구현을 해놓을 수도 있다. 이렇게 미리 구현을 해놓으면 상속받는 하위 클래스에서 반드시 강제로 구현을 할 필요는 없어진다.
virtual void DoLesson()
{
UE_LOG(LogTemp, Log, TEXT("수업에 입장합니다."));
}
Interface 구현 예시
Student.h
ILessonInterface 클래스를 상속받고 가상함수를 정의힌다.
#include "CoreMinimal.h"
#include "Person.h"
#include "LessonInterface.h"
#include "Student.generated.h"
/**
*
*/
UCLASS()
class UNREALINTERFACE_API UStudent : public UPerson, public ILessonInterface
{
GENERATED_BODY()
public:
UStudent();
virtual void DoLesson() override;
};
Student.cpp
DoLesson() 함수를 구현한다.
상위 인터페이스의 DoLesson()도 호출하는 것을 알 수 있다. 상위 인터페이스 코드를 호출하기 위해서는 Super키워드를 사용할 수 없다(UStudent 클래스는 이미 UPerson을 상속받은 상태이기 때문이다.) 대신 인터페이스 클래스의 DoLesson() 함수를 호출하는 방식으로 동작한다.
#include "Student.h"
UStudent::UStudent()
{
Name = TEXT("이학생");
}
void UStudent::DoLesson()
{
ILessonInterface::DoLesson();
UE_LOG(LogTemp, Log, TEXT("%s님은 공부합니다."), *Name);
}
Interface 구현 여부 파악 방법
ILessonInterface로 캐스팅 시 형변환 결과의 null 여부를 통해 구현 여부를 파악한다.
아래 코드에서 UStaff 클래스는 LessonInterface 클래스를 구현하지 않기 때문에 캐스팅 결과가 null이 되어야 한다.
TArray<UPerson*> Persons = { NewObject<UStudent>(), NewObject<UTeacher>(), NewObject<UStaff>() };
for (const auto Person : Persons)
{
ILessonInterface* LessonInterface = Cast<ILessonInterface>(Person);
if (LessonInterface)
{
LessonInterface->DoLesson();
}
else
{
UE_LOG(LogTemp, Log, TEXT("%s님은 수업에 참여할 수 없습니다."), *Person->GetName());
}
}
코드를 빌드 후 실행하면 정상적으로 출력된다.

'Unreal Engine 학습' 카테고리의 다른 글
| [UE5] 프로젝트 코드 재사용 팁 (0) | 2023.09.23 |
|---|---|
| [UE5] Unreal Object 리플렉션 시스템 - 2 (0) | 2023.09.22 |
| [UE5] 언리얼 엔진 헤더 파일 #include시 주의사항 (0) | 2023.09.18 |
| [UE5] Unreal Object 리플렉션 시스템 - 1 (0) | 2023.09.17 |
| [UE5] Unreal Object 기초 (0) | 2023.09.17 |