UE5

언리얼 컴포지션

뽀또치즈맛 2025. 3. 22. 22:44

언리얼 컴포지션이란?

 

언리얼 컴포지션은
객체 지향 설계의 핵심 개념 중 하나인
Composition (컴포지션)을 언리얼 엔진에서 구현하는 방법을 의미한다.

 

이는 단순한 상속(Inheritance, Is-A 관계)만으로는 해결하기 어려운 복잡한 객체 설계 문제를,

Has-A 관계를 통해 해결하는 기법이다.

 

주요 개념

  • Has-A 관계:
    상속이 “~이다”라는 관계라면, 컴포지션은 “~을 가진다”라는 관계이다.
    예를 들어,
    게임 캐릭터가 여러 개의 컴포넌트(무기, 방어구, 스킬 등)를 갖는 경우,
    이를 각각의 독립 객체로 구성해 관리할 수 있다.

  • 언리얼 엔진에서의 컴포지션 구현:
    언리얼 엔진에서는 UObject 기반의 오브젝트를 조합하여 복잡한 객체를 구성하는데,
    이를 위해 두 가지 주요 방법을 사용한다.
    • 필수적 포함:
      생성자에서 CreateDefaultSubobject() 함수를 이용해
      클래스 기본 객체(CDO)에 미리 서브 오브젝트를 생성해 포함시키는 방식이다.

      예를 들어, 캐릭터의 Mesh나 기본 컴포넌트는 항상 포함되어야 하므로 이 방법을 사용한다.

    • 선택적 포함:
      CDO에는 빈 포인터만 두고, 필요할 때 런타임에 NewObject()를 호출해 오브젝트를 생성하는 방식이다.
  • Subobject와 Outer:
    언리얼에서 컴포지션 관계를 맺을 때,
    자신이 소유한 오브젝트를 Subobject라 하고,
    반대로 자신을 소유하는 오브젝트를 Outer라 부른다.
    이 관계를 통해 오브젝트 간의 생명주기와 메모리 관리가 체계적으로 이루어진다.

  • 전방선언과 포인터 관리:
    컴포지션 관계를 설정할 때
    헤더 파일 간의 의존성을 줄이기 위해 전방 선언을 사용하며,
    언리얼 엔진 5부터는 원시 포인터 대신 TObjectPtr을 사용하여 관리하는 것이 권장된다.
  • UENUM과 UMETA:
    열거형 타입을 확장하여 메타 정보를 부여할 때,
    UENUM()과 UMETA() 매크로를 사용한다.
    이를 통해 디스플레이 이름 등 부가 정보를 코드 내에서 활용할 수 있다.
     

 

언리얼 컴포지션의 정의

 

  1. 객체 지향 설계에서 상속 대신 컴포지션(Has-A 관계)을 활용하여
    복잡한 객체를 유연하고 유지보수하기 쉽게 설계하는 방법이다.

  2. 언리얼 엔진에서는
    CreateDefaultSubobject()나 NewObject()를 통해 오브젝트를 조합하며,
    소유 관계(Outer/Subobject)와 전방 선언,
    그리고 TObjectPtr 등을 활용해 효율적인 메모리 관리와 의존성 감소를 실현한다.

  3. 또한, UENUM()과 UMETA()를 통해 열거형에 메타 데이터를 추가하여
    개발자가 보다 직관적으로 디버깅 및 데이터 관리를 할 수 있게 돕는다.

이러한 기법은 게임의 복잡한 객체들을 체계적으로 구성하고,
확장성과 유지보수성을 높이는 데 큰 도움이 된다.