개발 고수(가 되고 싶은) 블로그

엔진공부/언리얼 공부

[언리얼 공부] 인터페이스(Interface) 와 컴포지션(Composition)

개발고수(가되고싶음) 2024. 8. 21. 22:54

인터페이스 사용 이유

  • 어떤 객체가 반드시 구현해야할 행동을 지정하는데 활용
  • 다형성, 의존성 분리를 위해 사용한다. 

특징

  • 인터페이스 생성시 두 개의 클래스가 생성
  • U로 시작하는 타입클래스
  • I로 시작하는 인터페이스 클래스 - 실질 클래스 구현하는 곳

C++ 인터페이스 vs C# 인터페이스

  • c# 에서는 추상 타입으로만 선언이 가능하지만 C++ 인터페이스는 선언하지 않고 로직을 구현할 수 있다.
  • 다만 구현하였을때 장점도 있지만 복잡해 질 수 있으므로 구현을 할예정이라면 차라리 그냥 일반 클래스를 상속받는것이 더 좋아보인다(굉장히 주관적)

컴포지션

  • is A 말고 Has A 를 구현하는 방법
  • 거대한 클래스를 효과적으로 설계하는데 유용하게 사용 가능
  • 언리얼 엔진에서 컴포지션 구현방법
    • CDO (클래스 기본 객체) 에서 생성하는 방법.
      • 언리얼 오브젝트에 다른 언리얼 오브젝트를 조합할 때 다음의 선택지
        • 방법 1: CDO에 미리 언리얼 오브젝트를 생성해 조합한다. - 생성자에 포함 CreateDefaultSubobject - 필수적일 때
        • 방법 2: 빈 포인터만 넣고 런타임에서 언리얼 오브젝트를 생성해 조합한다. - NewObject - 필수적이지 않을 때
    • 언리얼 오브젝트를 생성할 때 컴포지션 정보를 구축할 수 있다.
      • 내가 소유한 오브젝트 - subObject
      • 나를 소유한 오브젝트 - Outer
  • 한켠 작은 팁 : 메타정보설정 

> 메타 정보를 이용하면 좀더 편하게 블루프린트에서 사용 가능하다. 

  • 메타정보 쓰기 예시
UENUM()
enum class ECardType: uint8
{
    Student = 1 UMETA(DisplayName = "For Student"), // <- DisplayName은 에디터에서 보여지는 이름
    Teacher = 2 UMETA(DisplayName = "For Teacher"),
    Staff = 3 UMETA(DisplayName = "For Staff"),
    Invalid = 4,
};

    const UEnum* cardEnumtype =  FindObject<UEnum>(nullptr, TEXT("/Script/UnrealComposition.ECardType"));
    if(cardEnumtype)
    {
        FString CardMetaData = cardEnumtype->GetDisplayNameTextByIndex(static_cast<int32>(cardType)).ToString();
        UE_LOG(LogTemp, Log, TEXT("Person : %s"), *CardMetaData) ;
    }

 

반응형