ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴포지션(Composition)
    게임 개발/Unreal 2024. 1. 30. 00:42

    객체 지향 설계에서 상속이 가진 Is-A 관계만 의존해서는 설계와 유지보수가 어려움.

    예를 들어, '새' 클래스가 '동물' 클래스로부터 상속받고, 여러 새의 종류가 '새' 클래스로부터 상속받는 구조를 생각해 볼 수 있는데, 이렇게 계속 확장될수록 다음과 같은 문제가 발생할 수 있다.

     

    1. 강한 결합(Tight Coupling): 상위 클래스에서의 작은 변경 사항이 모든 하위 클래스에 영향을 미칠 수 있다.

    2. 낮은 재사용성: 특정 하위 클래스에서만 필요한 기능이 상위 클래스에 추가되면, 그 기능은 모든 하위 클래스에 불필요하게 상속된다.

    3. 난해한 코드: 계층이 깊어질수록 클래스 간의 관계를 이해하기 어려워 진다. 특히 다중 상속을 사용하는 경우, 어떤 기능이 어느 클래스에서 왔는지 추적하기 어려워질 수 있다.

    4. 유연성 부족: 새로운 종류의 동물이나 새를 추가할 때, 기존 클래스 구조에 맞춰야 하며, 때로는 기존 구조를 크게 변경해야 할 수도 있습니다.

     

    컴포지션은 객체 지향 설계에서 Has-A 관계를 구현하는 설계 방법

    컴포지션의 활용

    복합적인 기능을 거대한 클래스를 효과적으로 설계하는데 유용하게 사용할 수 있음.

     

    class Engine {
    public:
        void start() {
            cout << "엔진 시작!" << endl;
        }
    };
    
    class Radio {
    public:
        void play() {
            cout << "음악 재생!" << endl;
        }
    };
    
    class Car {
    public:
        Engine engine;
        Radio radio;
    
        void startCar() {
            engine.start();  // 'Engine' 기능 사용
            radio.play();    // 'Radio' 기능 사용
        }
    };
    
    int main() {
        Car myCar;
        myCar.startCar();  // 'Car'의 startCar 메소드를 호출하여 엔진을 시작하고 음악을 재생
        return 0;
    }

     

    언리얼 엔진에서의 컴포지션 구현 방법

    하나의 언리얼 오브젝트에는 항상 클래스 기본 오브젝트 CDO가 있다.

    언리얼 오브젝트간의 컴포지션은 어떻게 구현할 것인가?

    언리얼 오브젝트에 다른 언리얼 오브젝트를 조합할 때 다음의 선택지가 존재한다.

    • 방법 1: CDO에 미리 언리얼 오브젝트를 생성해 조합한다.
    • 방법 2: CDO에 빈 포인터만 넣고 런타임에서 언리얼 오브젝트를 생성해 조합한다.(선택적 포함)

    언리얼 오브젝트를 생성할 때 컴포지션 정보를 구축할 수 있다.

    • 내가 소유한 언리얼 오브젝트를 Subobject라고 한다.
    • 나를 소유한 언리얼 오브젝트를 Outer라고 한다.

     

    #이득우의 언리얼 프로그래밍 Part1 

    댓글

Designed by Tistory.