본문 바로가기
SW

GoF의 디자인 패턴(Design Patterns: Elements of Reusable Object-Oriented Software) - 1장 서론(1.5~1.6)

by 라꾸스떼(YR) 2020. 4. 3.
반응형

[1.5 카탈로그 조직화하기]

패턴을 분류하는 기준은 두 가지입니다. 첫 번째 분류 기준은 목적. 패턴은 생성, 구조, 행동 중의 한 가지 목적을 갖습니다. 생성 패턴은 객체의 생성 과정에 관여하는 것이고, 구조 패턴은 클래스나 객체의 합성에 관한 패턴들입니다. 행동 패턴은 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의합니다.

두 번째 분류 기준은 범위. 패턴을 주로 클래스에 적용하는지 아니면 객체에 적용하는지를 구분하는 것입니다. 클래스 패턴은 클래스와 서브클래스 간의 관련성을 다루는 패턴입니다. 관련성은 주로 상속이며, 컴파일 타임에 정적으로 결정됩니다. 객체 패턴은 객체 관련성을 다루는 패턴으로서, 런타임에 변경할 수 있으며 더 동적인 성격을 가집니다. 대부분의 패턴들은 어느 정도 상속을 이용합니다.

생성(Creational) “클래스” 패턴은 객체를 생성하는 책임의 일부를 서브클래스가 담당하도록 넘깁니다. 그러나 생성 “객체” 패턴은 이를 다른 깨체에게 위임합니다.

구조(Structural) “클래스” 패턴은 상속을 이용해서 클래스를 복합하고, 구조 “객체” 패턴은 깨체를 합성하는 방법을 정의합니다.

행동(Behavioral) “클래스” 패턴은 상속을 이용해서 알고리즘과 제어 흐름을 기술하고, 행동 “객체” 패턴은 하나의 작업을 수행하기 위해 객체 집합이 어떻게 협력하는지를 기술합니다.

패턴을 조직하는 또 다른 방법으로는, 일부 패턴은 함께 사용해야 할 때가 있거나 대안이 될 때도 있음.

또 다른 방법으로는 패턴 간의 참조 관계에 따라 관리하는 것. “디자인 패턴 관계도”는 패턴마다 기술한 “관련 패턴”의 참조 관계

 

[1.6 디자인 패턴을 이용하여 문제를 푸는 방법]

[적당한 객체 찾기]

객체지향 프로그램은 객체(Object)로 만듭니다. 객체는 데이터와 이 데이터에 연산을 가하는 프로시저(Procedure)를 함께 묶은 단위입니다. 프로시저를 일반적으로 메서드(Method) 또는 연산(Operation)이라고 합니다. 객체는 요청(Request) 또는 메시지(Message)를 사용자에게 받으면 연산을 수행합니다.

요청은 객체에 연산을 실행하게 하는 유일한 방법이고, 연산은 객체의 내부 데이터의 상태를 변경하는 유일한 방법입니다. 이러한 접근의 제약 사항으로 객체의 내부 상태는 캡슐화(Encapsulate)된다고 말합니다. 객체 외부에서는 객체의 내부 데이터에 직접 접근할 수 없고, 객체의 내부 데이터 표현 방법(데이터 타입 등)을 알 수 없습니다.

객체지향 설계의 가장 어려운 부분은 시스템을 구성할 객체의 분할을 결정하는 것입니다. 고려해야 할 요인에는 캡슐화, 크기 정하기, 종속성, 유연성, 성능, 진화, 재사용성 등이 있습니다. 이 문제에 대해 객체지향 설계 방법론들은 서로 다른 방법으로 접근합니다. 문제 기술서를 작성하고 명사와 동사를 추출해서 각각을 클래스와 연산으로 만드는 방법. 시스템의 협력 관계나 책임성을 중심으로 설계하는 방법, 실세계를 모델로 만들고 이를 분석해 설계로 전이하는 과정에서 객체로 바꾸는 방법.

객체지향 설계는 실세계와 대응 관계를 갖지 못할 때가 많습니다. 즉, 분석 모델의 객체는 실세계 객체들이지만, 설계 모델의 객체에는 배열, 리스트처럼 구현에 가까운 클래스들도 있습니다. 실세계를 그대로 반영하는 모델링만 강조하면 현재의 실세계는 반영할 수 있지만 미래의 실세계는 반영할 수 없습니다. 설계 단계 동안 만들어야 하는 새로운 추상화는 설계의 유연성을 증진하기 위한 중요한 노력 중 하나입니다.

디자인 패턴은 여러분이 덜 명확한 추상적 개념과 이것을 잡아낸 객체를 알아보는 데에 도움을 줍니다. 전략 패턴은 상호교환이 가능한 알고리즘군을 어떻게 구현할지를 설명합니다. 상태 패턴은 대상들의 각 상태를 객체로 표현합니다.

 

[객체의 크기 결정]

디자인 패턴에서 이 문제의 답을 얻을 수 있다. 퍼사드 패턴은 서브시스템을 어떻게 객체로 표현할 수 있는지 설명하고, 플라이급 패턴은 규모는 작지만 개수는 많은 객체를 다루는 방법을 설명한다. 추상팩토리 패턴과 빌더 패턴은 다른 객체를 생성하는 책임만 있는 객체를 만들어 낸다. 방문자 패턴과 명령 패턴은 요청을 자신이 처리하는 것이 아니라, 다른 객체나 객체 집합이 요청을 처리하여 구현하도록 책임지는 객체를 만들어 낸다.

반응형

댓글