TIL/Unity

[Unity] 컴포지션 패턴 (컴포지트 패턴)

Sh_Blog 2023. 12. 11. 10:24

 

컴포지션 패턴이란?

단일객체와 복합객체를 동일하게 다룰 수 있게해주는 디자인 패턴

 

컴포지션 패턴의 구조는

 

Component - 컴포넌트

Leaf - 단일객체 (Component 상속)

Composite - 복합객체 (Component 상속)

 

이런 구조로 이루어져 있다. 

 

이 개념을 처음 봤을 때는 복합객체?  단일객체? 이게 무슨 소린지 한번에 감이

안잡힐 수 있다. 본인도 확실하게 개념을 잡고 싶어서 글을 찾아 보던 중 좋은 예시를

찾게됐는데 이를 토대로 설명하고자 한다.

 

우리는 전국의 모든 메뉴들이 사용할 수 있는 메뉴 컴포넌트를 제작한다고 가정하자.

그럼 메뉴판과 메뉴가 하는 기능이 각각 다를 것이다. 그럼 우선 메뉴와 메뉴판이 하는 기능을

메뉴 컴포넌트에 공통 기능으로 제작 후 메뉴와 메뉴판이 각각 메뉴컴포넌트를 상속받는다.

그럼 메뉴 라는 단일객체는 메뉴의 이름, 가격 등 메뉴 단일로 하는 기능들이 있을 것이고

메뉴판이라는 복합객체는 모든 메뉴판이 할 수 있는 복합적인 기능 즉, 메뉴 추가, 메뉴 삭제

이런 기능들이 포함될 것이다.

 

그래서 이 단일객체(메뉴) 와 복합객체(메뉴판)가 메뉴 컴포넌트를 상속받았기 때문에

메뉴 컴포넌트를 사용하는 빈 껍데기 오브젝트는 메뉴판의 기능을 독립적으로 모두 가질 수 있는 것이다.

 

컴포지션 패턴을 사용하는 이유?

이렇게 컴포지션 패턴을 사용하게 되면 메뉴라는 기능을 여러개 만들고 메뉴판 기능을 여러개 만들

필요 없이 단일객체(메뉴), 복합객체(메뉴판)을 하나의 구조로 처리한다.

그래서 빈 오브젝트에 메뉴 컴포넌트만 추가하면 기능을 사용할 수 있기 때문에 메뉴 컴포넌트는 독립적이라는

특징을 가지며 그만큼 기능의 추가와 삭제가 용이하여 재사용성이 높다.

 

하지만 원래부터 단순한 구조인데 컴포지션 패턴을 사용한다면 오히려 설계의 복잡성을 증가할 수 있고

복합객체나 단일객체가 동적으로 변하는 기능들이면 컴포지션 패턴을 사용하는데 어려움이 있다.