- 특정 기능을 구현할 것을 약속한 추상 형식을 의미.
- 객체(클래스)가 반드시 구현해야 할 기능을 지정하는데 사용.
- 다형성의 구현, 의존성이 분리된 설계에 유용하게 활용
- 잠재적으로 무관한 클래스 세트가 공통의 함수 세트를 구현할 수 있도록 하는데 쓰임.
그대로라면 유사성이 없었을 크고 복잡한 클래스들에 어떤 게임 함수 기능을 공유시키고자 하는 경우에 사용.
- 언리얼 C++ 인터페이스는 추상 타입으로 강제되지 않고, 내부에 기본 함수를 구현할 수 있음
- UINTERFACE클래스는 실제 인터페이스가 아니다. 언리얼 엔진의 리플렉션 시스템에 보이도록 하기 위해서만 존재하는 비어 있는 클래스임.
- 함수를 헤더 파일에 직접 작성가능
- 기본적으로 아무것도 하지 않는 함수이거나 사소한 동작을 하는 함수의 경우에 작성.
복잡한 함수는 소스파일에 작성하는게 컴파일 시간을 줄일 수 있다.
- 기본적으로 아무것도 하지 않는 함수이거나 사소한 동작을 하는 함수의 경우에 작성.
< 게임 개발에서의 인터페이스 >
- 여러 클래스들이 공통적으로 구현해야 할 기능을 정의하고 유연하게 확장할 때 많이 사용함
- 클래스들 간의 결합도를 낮추고 독립적으로 동작하도록 만들기 위해 활용
| 게임 개발에서 인터페이스의 용도 | |
| 공통 기능 정의 | - 여러 다른 클래스가 공통적으로 구현해야 할 함수가 있을 때 사용 - ex) 적, 플레이어, NPC 모두 데미지를 받을 수 있어야 하는 경우, IDamageable 인터페이스를 만들고 TakeDamage 함수를 정의 |
| 결합도 낮추기 | - 클래스 간 의존성을 줄이고, 유연하게 확장할 수 있게 함 - ex) 어떤 클래스든 IInteractable 인터페이스를 구현하면, 그 클래스가 플레이어든 오브젝트든 상관없이 상호작용이 가능하도록 설계 가능 |
| 다형성 활용 | - 특정 클래스의 형식에 얽매이지 않고 인터페이스 타입으로만 사용하여 여러 객체를 통합적으로 처리 가능 - ex) ICollectible 인터페이스를 구현한 아이템들은 종류에 상관없이 플레이어가 수집할 수 있음 |
| 게임 개발에서 자주 사용하는 사례 | |
| 데미지 처리 시스템 | - 모든 적과 플레이어, 오브젝트들이 데미지를 받는 기능이 필요하다면, IDamageable 인터페이스를 만들고 TakeDamage함수만 정의하면 됨 |
| 상호 작용 시스템 | - 문, 상자, NPC 등과 같은 오브젝트들이 플레이어와 상호작용할 수 있도록 IInteractable 인터페이스를 정의하고 각 클래스에서 자신만의 방식으로 상호작용 구현 가능 |
| AI 시스템 | - 다양한 적 AI 클래스들이 IMoveable 인터페이스를 구현하여 이동 기능을 공통으로 정의하고, 각 클래스는 자신만의 이동 로직을 추가 가능 |
< 인터페이스의 생성 >
- 인터페이스를 생성하면 두 가지 클래스가 항상 기본으로 생성이 됨
- 타입 전용 클래스(U로 시작) : 런타임에서 인터페이스 구현 여부를 파악하는 용도
(인터페이스 선언용 Wrapper 클래스) - 인터페이스 클래스(I로 시작) : 실질적인 설계 및 구현은 여기서 진행
- 타입 전용 클래스(U로 시작) : 런타임에서 인터페이스 구현 여부를 파악하는 용도

< 받는 데미지를 처리하는 기능의 예시 >
- 인터페이스를 사용하지 않고 일반 클래스를 사용하여 ADamageableBase를 구현하게 되면, 이 기능이 필요한 모든 클래스에서 이 클래스를 상속받아야 함 (그런데 C++은 다중 상속을 권장하지 않음)
- 인터페이스를 통해 IDamageable을 구현하면, 이 기능이 필요한 클래스들에서 다른 클래스를 이미 상속받고 있더라도 이 인터페이스를 상속받는데에 문제 없음
- 인터페이스를 상속받는 것은 일반적인 클래스를 상속받는 것과는 개념적으로 조금 다름
- 일반 클래스 상속
- 부모 클래스의 구현된 동작과 데이터를 상속받아 사용하는 것
- 그러므로 부모 클래스에서 구현되어 있는 함수들을 그대로 사용하거나 필요하다면 override할 수 있음
- 인터페이스 상속
- 동작(함수)의 약속만 정의하고, 실제 구현은 전혀 포함하지 않음
- 인터페이스를 상속받는 것은 "이 클래스는 상속받은 인터페이스(IDamageable)의 함수를 반드시 구현하겠다" 라는 의미로써, 구현의 책임은 인터페이스를 상속받은 클래스로 넘어감
- 즉, 언리얼 엔진에서 인터페이스를 상속받는 것은 "이 클래스는 상속받은 인터페이스를 반드시 구현할 것임" 이라는 의미이다
- 그러므로 만약에 class AEnemyCharacter : public ACharacter, public IDamageable 을 해석한다면, "EnemyCharacter 클래스는 ACharacter과 IDamageable을 상속받았다" 가 아니라, "ACharacter을 상속받고, IDamageable 인터페이스를 구현할 것임" 이라고 표현하는 것이 더 적합함
- 인터페이스는 코드 설계에서 다중 상속처럼 보이나, 실제로 구현된 코드는 상속하지 않는다
- 인터페이스를 상속받는 것은 일반적인 클래스를 상속받는 것과는 개념적으로 조금 다름
< BlueprintNativeEvent >
- 어떤 클래스든 간에 "이벤트성 함수" 를 선언할 때 사용할 수 있는 UFUNCTION 속성이다
- 인터페이스 함수에는 거의 항상 필요하므로 오해할 수 있으나, 인터페이스 전용 파라미터는 아님
- 블루프린트에서도 override 해서 구현 가능한 함수를 만들고 싶을 때 사용
- 함수 내용이 바뀔 수 있고 = 객체마다 다르게 작동해야 하는 경우
(ex. 몬스터나 아이템마다 같은 함수여도 다르게 작동할 수 있음) - 블루프린트에서도 구현 가능해야 하며
(디자이너가 블루프린트에서 수정해야 할 수도 있는 것들) - UI나 연출에 가까운, 클래스별로 개별 처리가 필요한 것들이고
(ex. 보스 등장 연출, 퀘스트 수락 시 연출) - 기본 구현은 C++에 둘 수도 있는
- 이런 구조의 함수를 만들고 싶을 때 사용하는 파라미터
- 함수 내용이 바뀔 수 있고 = 객체마다 다르게 작동해야 하는 경우
- 예시)
- 캐릭터의 죽음 : 이벤트성 함수로 선언할 필요 없음
- 시스템적으로 모든 캐릭터가 공통 처리할 로직이 존재
- 블루프린트에서 굳이 디자이너가 죽음 로직을 다르게 넣는 경우도 없음
- C++에서만 계층적으로 구현하면 되는 기능
- 캐릭터의 데미지 피격 : 이벤트성 함수로 선언해야 함
- 모든 객체가 데미지를 받는 방식이 다름
- 보스는 무적 구간이 있을 수도 있고, 플레이어는 실드가 있을 수도 있고, 상자는 한 대 맞으면 바로 파괴될 수도 있음
- 보스는 무적 구간이 있을 수도 있고, 플레이어는 실드가 있을 수도 있고, 상자는 한 대 맞으면 바로 파괴될 수도 있음
- 디자이너가 BP에서 커스터마이징 할 가능성이 있음
- 모든 객체가 데미지를 받는 방식이 다름
- 캐릭터의 죽음 : 이벤트성 함수로 선언할 필요 없음

- 블루프린트에서 아예 보이지 않는 함수 (전통적인 C++ 인터페이스 방식)
- 100% C++에서만 작동하는 구조
- 블루프린트에서 함수를 사용하지 않을거라면 이 방식으로 가상함수로 선언한 후에, 이 인터페이스를 상속받은 클래스에서 _Implementation 없이 그냥 일반적인 함수 이름을 그대로 override해도 됨


- 블루프린트에서 override 할 수 있는 함수 : UFUNCTION(BlueprintNativeEvent)
- 내부적으로 2가지 함수로 나뉨
- 함수이름();
- 함수이름_Implementation();
- 실제 구현부는 반드시 _Implementation() 함수에 작성해야 함
- BlueprintNative 라고 선언한 이상, 언리얼 엔진은 "이 함수는 Native 구현이 _Implementation() 안에 있을 거다" 라고 확실히 못박아 둔 상태임
- 그래서 C++만 쓰든, 블루프린트에서도 쓰든 그거랑 상관없이 BlueprintNativeEvent로 선언한 이상 무조건 구현은 _Implementation() 함수에 작성해야 함
- 내부적으로 2가지 함수로 나뉨
| UFUNCTION(BlueprintNativeEvent) TestFunc(); | |
| TestFunc(); | TestFunc_Implementation(); |
| - BlueprintNativeEvent 로 등록된 함수는 여기에 코드를 넣어도 절대로 이 함수를 호출하지 않고 그냥 무시함 - 즉, 이 함수는 작동하지 않는다고 보면 됨 |
- BlueprintNativeEvent 로 등록된 함수는 _Implementation 함수만 찾아가서 호출함 - 실제로 호출되는 함수 |

'UE5 Coding : 게임 제작 기초 > Class' 카테고리의 다른 글
| BeginOverlap 바인딩 함수 (0) | 2025.08.20 |
|---|---|
| 클래스 상속 (0) | 2025.08.18 |
| GameInstance 와 Singleton (2) | 2025.08.18 |