반응형

디자인패턴의 종류

https://i5i5.tistory.com/537

 

[CS] GoF 디자인패턴의 종류. (Design Pattern)

 이번 글은, GoF 디자인패턴의 종류들에 대해서 알아보겠습니다. 디자인패턴은 소프트웨어를 설계할 때, 역사적으로 발생했던 공통된 문제들에 대해서, 표준적인 해결 방법을 제안들을 모아놓

i5i5.tistory.com

 

 

 안녕하세요. 오늘은 디자인패턴 중 Composite 패턴에 대해서 알아보겠습니다.

 

개요

 Composite패턴이란, 쉬운 말로, 오브젝트의 자식으로, 오브젝트의 그룹이 들어가야 컴포지트 패턴이다. 

이게 무슨 말이냐면, "나는 자식인데, 나는 이 부모 유형의 리스트를 가지고 있는 형식이다."

 

 특정 a 객체의 배열을 가진 리스트를 생각해보자. 이 리스트를 가진 b 객체는 사실, a 객체의 자식이 될 이유가 없다. 왜냐하면, 둘 간의 아무런 연관이 없기 때문이다.

 

 하지만, 생각해보자. (b의 클래스가 B라고 가정) "이 a 객체 리스트를 가진 b 객체"의 리스트 또한, b 객체가 가져야한다면?.. (헷갈릴 수 있지만, 한번 더 읽어보길 바란다. 즉 "그룹이 그룹을 가질 수 있는가?" 에 대한 질문이다.)

 

예를 들어, 트리 구조를 생각해보자. 

 이 트리구조는, 자기 자신이 리스트이면서, 노드이다. (중요) 또한, 자기 자신은, 자기 자신의 리스트를 가질 수 있다. 

 

 즉, 아래와 같은 경우에, 컴포지트패턴을 활용해야한다.

 "나는 부모 데이터의 리스트를 가질 수 있음과 동시에, 부모의 특징을 가져야만 해, 그래야, 내 리스트도 내가 가질 수 있으니."  

 위의 말을 요약하면,

 (1) 나는 부모의 데이터 리스트를 가져야 한다.

 (2) 나는 부모의 속성을 가지고 있으며, "나"의 리스트 또한 가질 수 있다.

 

(왼, 기존) (우: 만약 저렇게 트리가 변경될 수 있다.)

 

 트리 구조 같은 경우, 노드는 부모의 특성을 다 가짐과 동시에, 리스트를 가지고 있다.

 위의 그림처럼, 저렇게 노란색 노드가 자유 자재로 움직일 수 있는 이유는, 노드 자체가 부모 속성이면서, 부모의 리스트를 갖고 있기 때문이다.

구조 (클래스 다이어그램)

 이 패턴은 컴포넌트와 컴포지트라는 클래스의 관계가 중요하다. 우선, 컴포지트의 부모는 컴포넌트이다. (아래의 그림 참고) 그리고 나서, 컴포넌트의 배열을 컴포지트가 또 다시 가지고 있는 형태이다.

 

 개요 부분을 이해했다면, 아래의 구조는 쉽게 이해했을거라고 생각한다. (화살표의 관계는 "클래스 다이어그림 화살표"를 검색해서 이해하길 바란다.)

 

실제 사례

 

사례 1. Java의 Collection 클래스

 

 위를 보면, MyObject을 담고있는, MyCollection 자체도, MyObject을 extends하는 것을 볼 수 있다.

 

 

사례 2. 그래픽 도형 그룹

 *중요 그래픽 도형에서, 도형 그룹은 도형 이면서, 또다른 도형 그룹을 가질 수 있다.

문제

1. 컴포지트 패턴은 실제 (1)__ 와 (2)__ 구조에 쓰인다.        답: (1) 트리구조, (2) 폴더구조

2. 컴포지트 패턴은 자기 자신의 부모를 리스트로 갖는다. (O,X)    답: O

 

출처/인용자료

위키백과 https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4

반응형