C++와 Unreal Engine으로 3D 게임 개발

C++와 Unreal Engine으로 3D 게임 개발 3-1

jh009 2026. 6. 18. 19:08

3-1. 인터페이스 기반 아이템 클래스 설계하기

1. 인터페이스 이해하기

 

인터페이스

클래스 (또는 오브젝트)가 반드시 구현해야 할 함수 목록만을 미리 정의해 두고,

실제 함수의 동작(구현 내용)은 해당 클래스를 상속받거나 구현하는 쪽에서 자유롭게 작성할 수 있도록 하는 일종의 계약서


상속 (Inheritance)과의 차이점

 

상속

  • 부모 클래스의 모든 속성과 기능을 자식 클래스가 물려받는 구조
  • 부모 클래스에 구현된 로직을 자식 클래스가 그대로 사용 가능
  • 필요하다면 자식 클래스에서 재정의 (오버라이딩)할 수도 있음

인터페이스

  • 인터페이스는 “이 함수를 반드시 만들어야 한다”라는 함수 원형 (함수 시그니처)만을 정의
  • 실제 함수가 어떻게 동작할지는 각 자식 (또는 구현 클래스)에서 자유롭게 작성

상속은 부모의 실제 구현을 가져다 씀

인터페이스는 함수의 틀만 빌려 쓰고, 그 안에 담길 코드는 직접 만들어야 함


인터페이스를 사용하면 좋은 점

 

결합도 (Coupling) 감소

  • 클래스 간 구체적인 구현 내용을 공유X, 필요한 함수 목록만 약속하므로 클래스 간 의존도가 낮아짐
  • 다른 클래스 내부가 어떻게 돌아가는지 몰라도, “이 함수를 이렇게 호출하면 된다” 정도만 알면 됨

확장성 (Extensibility) 향상

  • 새로운 아이템 클래스를 만들 때, 이미 정의된 인터페이스를 구현하기만 하면 기존 시스템에 쉽게 편입할 수 있음

다형성 (Polymorphism) 극대화

  • 인터페이스 포인터 배열로 관리하면, 아이템 종류가 무엇이든 같은 함수를 호출하여 다룰 수 있음

예시: TArray<iiteminterface*> Items;</iiteminterface*>


2. 인터페이스 정의 및 아이템 부모 클래스 구현하기

ItemInterface 인터페이스 정의하기

C++ Class → Unreal Interface → 이름 설정 (ItemInterface) 

 

ItemInterface라는 인터페이스 정의

아이템의 공통 부모 클래스인 ABaseItem(Actor 상속)을 만들어 적용

IItemInterface.h

 

UINTERFACE(MinimalAPI)

언리얼 엔진의 리플렉션 시스템 (Reflection)을 위해 사용하는 매크로

위처럼 선언하면 블루프린트나 다른 모듈에서도 해당 인터페이스를 인식하고 사용가능

 

MinimalAPI

현재 모듈 내에서만 접근이 가능하도록 제한을 한다는 의미

 

class UItemInterface : public UInterface

실제 객체(클래스) 관리를 위한 언리얼 측 클래스, C++의 IItemInterface와 구분해 사용

 

class SPARTAPROJECT_API IItemInterface

직접 구현해서 사용할 인터페이스 함수들을 정의

0; 으로 끝나는 순수 가상 함수 형태이므로, 반드시 이를 구현(Override) 해야함


아이템 부모 클래스 구현하기

BaseItem.h / BaseItem.cpp

ABaseItem

모든 아이템에 공통적으로 적용될 기능을 담는 부모 클래스

인터페이스의 함수들을 빈 함수로 구현해두어, 필요한 아이템 (자식 클래스)에서 Override 하여 실제 로직을 작성하게끔 함

 

DestroyItem()

아이템을 제거하는 함수

단순히 Destroy()로 끝낼 수도 있고, 사운드나 파티클 이펙트 등을 추가하여 연출을 강화할 수도 있음

 

ItemType

에디터에서 Coin, Mine, Potion 같은 식으로 입력하여, 각 아이템의 타입을 구분

GetItemType()를 통해 간단히 아이템 종류를 확인


3. 코인 아이템 클래스 구현하기

작은 코인 (10점), 큰 코인 (50점), 지뢰 (5초 후 폭발), 힐링(체력 회복) 등 게임에서 사용할 아이템 구현

모든 아이템은 BaseItem 를 상속 C++ Class → BaseItem

이미 정의해 둔 인터페이스 함수를 각각 다르게 재정의(오버라이드)

 

코인 아이템 공통 부모 CoinItem

C++ Class → BaseItem → 이름설정 CoinItem

CoinItem.h
CoinItem.cpp

 

PointValue는 UPROPERTY로 선언 → 에디터에서 값을 수정하거나 블루프린트로 접근 가능

CoinItem 자체는 직접 사용하기보다는 구체적인 아이템 (BigCoin, SmallCoin)의 부모 클래스로 활용됨

 

CoinItem, BaseItem 에서 아이템 타입을 지정하지 않는 이유

CoinItem, BaseItem 은 부모 클래스이면서 상속을 목적으로 설계된 추상 클래스이기 때문임

  • 실수 방지
  • 기능을 확장하기 쉬움
  • 각 클래스의 역할을 명확히 나누기 위함

빅 코인 아이템 BigCoinItem

C++ Class → CoinItem 선택 → 이름설정 BigCoinItem

ACoinItem을 상속, 점수를 50점으로 설정, ItemType에 BigCoin 라벨 달기

BigCoinItem.h
BigCoinItem.cpp

 

virtual void ActivateItem(AActor* Activator) override;

코인 아이템이 사용되었을 때의 동작을 재정의하는 함수


스몰 코인 아이템 SmallCoinItem

ACoinItem을 상속, 점수를 10점으로 설정, ItemType에 SmallCoin 라벨 달기

SmallCoinItem.h
SmallCoinItem.cpp

 

BigCoin 과 SmallCoin 의 차이는 점수(PointValue)와 구분용 문자열(ItemType)

ActivateItem()을 통해 아이템 사용 로직을 재정의함으로써 각자 다른 동작 (또는 같은 동작)을 하도록 설정 가능함


3.  지뢰 및 힐링 아이템 클래스 구현하기

지뢰 아이템 MineItem

MineItem은 설치된 후, 일정 시간이 지나면 폭발하여 주변에 피해를 줌

폭발 범위와 폭발 데미지 등은 변수로 관리

MineItem.h
MineItem.cpp


힐링 아이템 HealingItem

플레이어의 체력을 회복시키는 아이템

HealAmount만큼 체력을 회복하고, 아이템을 소멸

HealingItem.h
HealingItem.cpp

 

MineItem, HealingItem 처럼 전혀 다른 동작을 하는 아이템들도 같은 함수 이름 (ActivateItem)으로 제어 가능

 

인터페이스 기반 설계로 한 번에 여러 종류의 아이템을 다형성으로 처리 → 새로운 아이템을 추가하는 작업이 훨씬 쉬움