게임 엔진/Unreal

[Unreal] 인터페이스

겜도리도리 2023. 12. 27. 03:01
반응형

앞서

이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다.

 

개요

인터페이스는 객체가 반드시 구현해야 하는 행동을 지정하는데 활용된다.

다형성을 구현하거나 디커플링을 하는데 유용하게 활용할 수 있다.

 

언리얼 C++ 인터페이스의 특징

인터페이스를 생성하면 두 개의 클래스가 생성된다.

U로 시작하는 타입 클래스와 I로 시작하는 인터페이스 클래스가 있다.

UInterface는 클래스 타입정보를 제공하고, IInterface는 실질적인 설계 및 구현을 담당한다.

Java나 C#에서 인터페이스는 추상 타입으로만 선언할 수 있지만, 언리얼에서는 인터페이스도 구현이 가능하다.

 

언리얼 C++ 인터페이스

인터페이스 C++ 클래스를 만들면 다음과 같은 2개의 클래스가 만들어져 있다.

 

 

1. UINTERFACE(MinimalAPI) 매크로가 지정된 클래스가 있다. 이 클래스는 타입 정보를 보관하기 위해 언리얼이 자동으로 생성한 클래스다. 딱히 무언가를 더 해줄 필요는 없다.

 

 

2. I인터페이스이름이라는 클래스가 있다. 여기에 인터페이스와 관련된 함수와 기능들을 구현할 수 있다. 순수 가상 함수로 선언하면 인터페이스를 상속받는 클래스는 이 순수 가상 함수를 무조건 구현해야 한다.

한편 C#, JAVA와 다르게 일반 가상 함수로 선언할 수도 있는데, 그때는 상속받는 클래스에서 구현해주지 않아도 무방하다. 이는 모던 객체 지향이 추구하는 바와는 거리가 멀지만, 언리얼 소스 코드에 실제로 이렇게 구현되어 있는 부분이 몇몇 있다고 한다.

 

 

사용할 때에는 인터페이스를 상속받은 뒤 가상 함수를 override 해준다.

 

 

그 후에 세부 내용을 구현해서 사용하면 된다. (비어있어도 상관은 없다)

 

인터페이스에서 원본 인터페이스의 함수 호출하기

앞에서 언급했던 것처럼, 언리얼 C++에서는 원본 인터페이스에 일반 가상 함수로 선언하면, 함수 구현을 할 수가 있다.

그럼 인터페이스를 상속받은 클래스에서 원본 인터페이스의 함수를 호출하려면 어떻게 해야 할까?

Super::로 호출하고 싶지만, 위의 예시에서 볼 수 있듯 UTeacher는 UPerson의 자식이기 때문에 Super로는 인터페이스에 접근할 수 없다.

따라서 이런 경우에는 아래와 같이 직접 호출해줘야 한다.

 

 

예시

 

UObject를 상속받는 Person과, 여기서 다시 상속받는 Student, Starff, Teacher가 있다고 하자.

수업에 참가할 수 있는 사람들은 Student와 Teacher 뿐이라고 할 때, 수업을 참가하는 함수 DoLesson()이라고 하면 Student와 Teacher에서만 구현해줘야 한다.

따라서 여기서는 인터페이스를 활용할 수 있다.

DoLesson() 함수를 포함한 인터페이스를 만들고, 호출하는 코드는 다음과 같다.

 

 

GameInstance에서 Student, Teacher, Staff 객체를 하나씩 만든 뒤 TArray에 넣어준다.

그리고 루프를 돌면서 이름을 출력한다.

구분선을 넣어준 뒤, 객체가 ILessonInterface를 상속받았다면 DoLessson() 함수를 호출한다.

ILessonInterface를 상속받지 않았다면 Cast에 실패하고 null이 반환된다.

 

Student와 Teacher에서 DoLesson() 함수는 다음과 같다.

 

 

로그를 확인해 보면 다음과 같다.

 

 

ILessonInterface를 상속받아 구현해 준 Student와 Teacher는 형변환이 성공해 각각의 DoLesson() 함수가 호출된 것을 볼 수 있다.

Staff는 ILessonInterface를 상속받지 않았으므로 형변환에 실패에 다른 Log를 띄워주는 걸 확인할 수 있다.

반응형

'게임 엔진 > Unreal' 카테고리의 다른 글

[Unreal] 델리게이트  (0) 2024.01.15
[Unreal] 언리얼 컴포지션과 UENUM  (0) 2024.01.12
[Unreal] 언리얼 리플렉션  (0) 2023.12.24
[Unreal] 언리얼 오브젝트  (0) 2023.12.22
[Unreal] 언리얼 C++ 코딩 표준  (0) 2023.12.19