다양한 기록

[UE] Interface (인터페이스) 본문

언리얼 엔진/Unreal C++

[UE] Interface (인터페이스)

라구넹 2024. 12. 22. 20:33

인터페이스

- 객체가 반드시 구현해야 할 행동을 지정하는데 활용

- 다형성의 구현, 의존성이 분리된 설계에 유용

 

언리얼 c++인터페이스

인터페이스 생성 시 두 개의 클래스 생성..

- U로 시작하는 타입 클래스 (클래스 타입 정보 제공)

- I로 시작하는 인터페이스 클래스

 

객체 설계 => I 인터페이스 클래스 사용

- U타입 클래스에서 작업 안함

* C++기반이라, 클래스로 인터페이스 구현해서 인터페이스에도 구현이 가능함

 

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#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()

	// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
	virtual void DoLesson()
	{
		UE_LOG(LogTemp, Log, TEXT("수업에 입장합니다."));
	}
};

DoLesson은 = 0; 으로 순수 가상 함수를 지정해도 되는데, 저렇게 기본 구현을 넣는게 가능함

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "Student.h"

UStudent::UStudent()
{
	Name = TEXT("김학생");
}

void UStudent::DoLesson()
{
	ILessonInterface::DoLesson();
	UE_LOG(LogTemp, Log, TEXT("%s님은 공부합니다"), *Name);
}

C++는 다중 상속을 지원하긴 하는데, Super 호출 시 Person을 뜻해서

위처럼 ILessonInterface:: 같은 방식으로 접근 필요

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"
#include "Student.h"
#include "Teacher.h"
#include "Staff.h"

UMyGameInstance::UMyGameInstance()
{
	// CDO에 저장됨
	// CDO를 고치는, 생성자를 바꾸는 경우에도 에디터 다시 켜줘야 함
	// 에디터 켜진 이후에 수정하면 인지 못함 
	SchoolName = TEXT("기본학교");
}

void UMyGameInstance::Init()
{
	Super:: Init();
	
	TArray<UPerson*> Persons = { NewObject<UStudent>(), NewObject<UTeacher>(), NewObject<UStaff>() };

	UE_LOG(LogTemp, Log, TEXT("=================================="));
	for (const auto Person : Persons)
	{
		UE_LOG(LogTemp, Log, TEXT("이름: %s"), *Person->GetName());
	}
	UE_LOG(LogTemp, Log, TEXT("=================================="));

	for (const auto Person : Persons)
	{
		ILessonInterface* LessonInterface = Cast<ILessonInterface>(Person);
		if ( LessonInterface )
		{
			UE_LOG(LogTemp, Log, TEXT("%s님은 수업에 참여할 수 있습니다."), *Person->GetName());
			LessonInterface->DoLesson();
		}
		else
		{
			UE_LOG(LogTemp, Log, TEXT("%s님은 수업에 참여할 수 없습니다."), *Person->GetName());
		}
	}
	UE_LOG(LogTemp, Log, TEXT("=================================="));
}

Person을 타입 캐스팅해서 ILessonInterface를 얻는데 성공하는지, 안하는지를 구분

Cast<ClassName>( Object )

값이 널이면 ILessonInterface가 없는 거

 

실행 시 위처럼 나옴