"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
언리얼 엔진에서 인터페이스 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
언리얼 엔진에서 인터페이스 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
**언리얼 엔진에서 인터페이스(Interface)**는 클래스 간의 통신과 기능 공유를 가능하게 하는 시스템으로, 다중 상속의 한계를 극복하고 코드의 유연성을 높이기 위해 사용됩니다. 인터페이스는 특정 메서드의 이름과 구조만 정의하며, 이를 구현하는 클래스에서 실제 로직을 제공합니다.
1. 인터페이스의 특징
- 다중 상속 가능:
- 여러 클래스에 걸쳐 공통적인 메서드를 구현할 수 있습니다.
- 클래스가 상속 계층의 제한을 받지 않고 인터페이스를 추가로 구현할 수 있음.
- 구현 강제:
- 인터페이스를 구현한 클래스는 정의된 메서드를 반드시 구현해야 합니다.
- 독립적 정의:
- 인터페이스 자체는 구현이 없는 순수한 메서드의 정의만 포함.
- 블루프린트와 통합:
- C++뿐만 아니라 블루프린트에서도 인터페이스를 정의하고 활용할 수 있음.
2. 인터페이스의 정의
C++에서의 인터페이스 정의
인터페이스 클래스 생성
인터페이스 클래스는 UInterface를 기반으로 작성됩니다.
// MyInterface.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "MyInterface.generated.h"
UINTERFACE(MinimalAPI)
class UMyInterface : public UInterface
{
GENERATED_BODY()
};
/**
* 인터페이스 함수 정의
*/
class YOURPROJECT_API IMyInterface
{
GENERATED_BODY()
public:
// 인터페이스 메서드 선언
virtual void PerformAction() = 0;
};
클래스에서 인터페이스 구현
// MyActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyInterface.h"
#include "MyActor.generated.h"
UCLASS()
class YOURPROJECT_API AMyActor : public AActor, public IMyInterface
{
GENERATED_BODY()
public:
virtual void PerformAction() override;
};
// MyActor.cpp
#include "MyActor.h"
#include "GameFramework/Actor.h"
void AMyActor::PerformAction()
{
UE_LOG(LogTemp, Warning, TEXT("PerformAction executed in MyActor"));
}
3. 인터페이스의 활용
(1) 클래스 간의 통신
인터페이스를 사용하면 특정 클래스를 알지 않고도 메서드를 호출할 수 있습니다.
객체가 특정 인터페이스를 구현했는지 확인하고, 구현된 메서드를 호출할 수 있습니다.
// 특정 클래스가 인터페이스를 구현했는지 확인
if (SomeActor->GetClass()->ImplementsInterface(UMyInterface::StaticClass()))
{
// 인터페이스 메서드 호출
IMyInterface* Interface = Cast<IMyInterface>(SomeActor);
if (Interface)
{
Interface->PerformAction();
}
}
(2) 블루프린트와의 통합
블루프린트에서 인터페이스 정의
- 인터페이스 생성:
- 콘텐츠 브라우저에서 우클릭 → 블루프린트 → 블루프린트 인터페이스를 선택하여 정의.
- 함수 추가:
- 인터페이스에 함수를 정의합니다.
클래스에 인터페이스 추가
- 클래스 세부 설정에서 인터페이스 추가.
- 인터페이스 함수 구현:
- 블루프린트에서 제공된 함수의 로직을 작성.
인터페이스 함수 호출
- 다른 블루프린트 또는 C++ 코드에서 인터페이스를 호출하여 통신.
(3) 다중 상속의 대안
C++에서 다중 상속은 복잡성을 증가시키고 예상치 못한 충돌을 야기할 수 있습니다. 인터페이스를 사용하면 다음과 같은 방식으로 다중 상속의 대안을 제공할 수 있습니다.
예: 여러 객체가 행동을 공유
class IWalkable
{
virtual void Walk() = 0;
};
class ISwimmable
{
virtual void Swim() = 0;
};
class AHuman : public AActor, public IWalkable, public ISwimmable
{
public:
virtual void Walk() override
{
UE_LOG(LogTemp, Warning, TEXT("Human is walking"));
}
virtual void Swim() override
{
UE_LOG(LogTemp, Warning, TEXT("Human is swimming"));
}
};
4. 장점과 단점
장점
- 코드 재사용성:
- 다양한 클래스에서 공통 인터페이스를 활용 가능.
- 유연성:
- 클래스의 상속 계층과 무관하게 기능 확장 가능.
- 의존성 감소:
- 특정 클래스에 종속되지 않고도 기능을 추가.
- 블루프린트 통합:
- C++과 블루프린트 간의 작업을 유연하게 연결.
단점
- 추적 어려움:
- 인터페이스 구현이 여러 곳에 분산될 수 있음.
- 복잡성 증가:
- 지나치게 많은 인터페이스를 정의하면 코드 가독성이 떨어질 수 있음.
5. 베스트 프랙티스
- 역할 기반 설계:
- 인터페이스는 클래스의 역할(behavior)을 정의하는 데 적합. 예를 들어, IDamageable, IPickable과 같은 이름으로 사용.
- 인터페이스 수 제한:
- 각 클래스가 구현해야 할 인터페이스 수를 제한하여 복잡성을 줄임.
- 구현 표준화:
- 인터페이스를 기반으로 구현을 표준화하여 유지보수성을 향상.
인터페이스는 언리얼 엔진에서 모듈화, 유연성, 재사용성을 제공하는 중요한 도구입니다. 특히, 클래스 간의 강한 결합을 피하면서 공통 기능을 구현하는 데 매우 효과적입니다. 이를 통해 더욱 구조적인 설계를 하고, 코드의 유지보수성을 크게 향상시킬 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com