-
컴포지션(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
'게임 개발 > Unreal' 카테고리의 다른 글
언리얼 컨테이너 라이브러리 I - Array (0) 2024.01.31 언리얼 C++ 설계 III - 델리게이트 (1) 2024.01.30 언리얼 C++ 설계 I - 인터페이스 (0) 2024.01.29 언리얼 오브젝트 리플렉션 시스템 I (1) 2024.01.27 언리얼 C++ 기본타입과 문자열 (1) 2024.01.25