Pv_log

4. 디자인 패턴 본문

Develop Study/Design Pattern

4. 디자인 패턴

Priv 2022. 7. 3. 23:08


 

 

1. 디자인 패턴이란?

SW를 설계할 때, 특정 맥락에서 자주 발생하는 고질적인 문제들을 해결하기 위한 가이드라인을 말한다.

과거부터 오랫동안 축적된 고질적인 문제들의 해결책들을 하나의 패턴 형태로 만들어 둔 것이다.

 

1.1) 디자인 패턴의 구조

디자인 패턴 구조는 콘텍스트(context), 문제(Problem), 해결(Solution)이라는 필수 구성 요소 3가지로 구성된다.

  • 콘텍스트: 문제가 발생하는 여러 상황을 기술한다. 즉, 패턴이 적용될 수 있는 상황을 의미한다. 경우에 따라 패턴이 유용하지 못한 상황을 나타내기도 한다.
  • 문제: 패턴이 적용되어 해결할 필요가 있는 여러 디자인 문제들을 기술한다. 이때 여러 제약 사항, 영향력도 문제 해결을 위해 고려해야 한다.
  • 해결: 문제를 해결하도록 설계를 구성하는 요소들과 그 요소들 사이의 관계, 책임, 협력 관계를 기술한다. 해결은 반드시 구체적인 방법이나 언어에 의존적이지 않으며, 다양한 상황에 적용할 수 있는 템플릿에 해당한다.

예를 들어, 부서의 프린터, 컴퓨터 등과 같은 여러 자원을 관리하는 프로그램을 만든다고 하면, 자원 관리를 위해 관리자 객체 1개 만을 생성하고 이를 통해 부서의 자원을 사용하도록 설계해야 한다.

'콘텍스트 - 문제 - 해결'로 이루어진 패턴으로 설명한다면 다음과 같다.

  • 콘텍스트: 클래스가 객체를 생성하는 과정을 제어해야 하는 상황.
  • 문제: 애플리케이션이 전역으로 접근하고 관리할 필요가 있는 데이터를 포함한다. 동시에 이러한 데이터는 시스템에서 유일하다. 어떤 방식으로 클래스에서 생성되는 객체의 수를 제어하고, 클래스의 인터페이스에 접근하는 것을 제어해야 하는가?
  • 해결: 클래스 생성자를 public으로 하지 않고, private 또는 protected로 선언하여 외부에서 생성자를 이용해 객체를 일단 생성할 수 없게 만들어야 한다.

위와 같이 발생할 수 있는 다양한 패턴들에 대해 이름을 부여하게 되면 하나의 디자인 패턴이 탄생한다.

실제로 위해서 살펴본 패턴의 경우에는 '싱글턴 패턴'에 해당한다.

 


 

2. GoF 디자인 패턴

GoF 디자인 패턴은 생성 패턴, 구조 패턴, 행위 패턴까지 크게 3가지로 분류된다.

  • 생성 패턴: 객체 생성에 관련된 패턴으로, 객체 생성, 조합을 캡슐화하여 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 최소화하는 유연성을 제공한다.
  • 구조 패턴: 클래스나 객체를 조합하여 더 큰 구조를 만드는 패턴이다. 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나, 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
  • 행위 패턴: 객체나 클래스 사이의 알고리즘, 책임 분배에 관련된 패턴이다. 한 객체가 혼자 수행할 수 없는 작업을 여러 객체로 어떻게 분배할 것인지를 결정하고 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

 


 

3. UML과 디자인 패턴

UML에서 디자인 패턴을 표현하는 도구로 컬레보레이션이 있다.

컬레보레이션을 사용해 디자인 패턴을 정확하게 표현하려면, 구조적/행위적인 면을 모두 표현해야 한다.

구조적인 면은 어떤 요소들이 주어진 목적을 달성하기 위해 협력하는지를 나타낸다.

행위적인 면은 협력을 위한 요소들의 상호작용을 나타낸다.

 

3.1) 컬레보레이션

객체는 역할이 아니므로, 한 객체가 여러 역할을 수행할 수 있다.

따라서 어떤 일을 수행할 때 객체는 각자 주어진 상황에서 주어진 역할에 따른 책임을 수행한다.

디자인 패턴 역시 목적을 달성하기 위한 역할들의 상호 협동 작업으로 간주할 수 있다.

UML에서는 객체들이 특정 상황에서 수행하는 역할의 상호작용을 컬레보레이션이라는 요소로 작성한다.

UML에서 컬레보레이션은 점선으로 된 타원 기호로 사용한다.

타원 내부에는 협력을 필요로 하는 역할, 그들 사이의 연결 관계를 표현한다.

컬레보레이션은 역할들의 상호작용을 추상화한 것으로, 특별한 상황에 적용하면 많은 시스템 개발에 재사용이 가능하다.

컬레보레이션 어커런스는 더 구체적인 상황에서의 컬레보레이션 적용을 표현해준다.

즉, 컬레보레이션 어커런스는 컬레보레이션에 참여하는 응용 클래스에 의존하며, 의존 관계에 붙은 레이블은 응용 클래스가 컬레보레이션에 수행하는 역할을 나타낸다.

 

3.2) 순차 다이어그램

순차 다이어그램은 UML에서 객체들의 상호작용을 나타내는 다이어그램 중 하나다.

순차 다이어그램은 객체들 사이의 메시지 송신, 그들의 순서를 나타낸다.

객체는 가장 윗부분에 표현되고, 왼쪽에서 오른쪽으로 객체들을 나열한다.

객체 다이어그램에서 객체를 표현하는 표기와 동일하게 '객체 이름:클래스 이름' 형식으로 표기한다.

위의 그림 4-7에 표기되어 있는 점선은 생명선이라고 하며 해당 객체가 존재함을 나타낸다.

생명선을 따라서 좁고 긴 사각형이 나올 수 있는데, 이 사각형을 활성 구간이라고 한다.

이는 객체가 연산을 실행하는 상태임을 나타낸다.

객체 사이의 메시지는 화살표로 표시한다.

화살표 시작 부분은 메시지를 송신하는 객체를 나타내고, 화살표 끝 부분은 메시지의 수신 객체를 나타낸다.

순차 다이어그램에서 머리 부분이 채워지지 않고 열려 있는 화살표는 비동기 메시지로서, 메시지 실행 종료를 기다리지 않고 바로 다음 작업을 수행할 수 있다.

머리 부분이 채워진 화살표는 동기 메시지를 의미한다.

UML에는 모든 다이어그램에 다이어그램 경계, 타입, 이름을 포함한 레이블 장소를 제공하는 프레임이 존재한다.

프레임은 다이어그램을 에워싸는 박스로 표시하며, 박스 안 왼쪽 모서리에 다이어그램 타입과 이름을 넣을 수 있다.

프레임을 사용하면 다이어그램 외부에서 특정 다이어그램을 참조하는 것이 쉬워진다.

순차 다이어그램에서 다른 순차 다이어그램을 참조할 때는 ref 키워드를 사용해야 한다.

UML에는 객체 사이의 상호작용을 효과적으로 나타내는 여러 연산을 명시적으로 제공한다.

alt 키워드를 사용하면 상호작용 조건에 따라 선택적으로 수행할 수 있게 만들 수 있다.

또한 조건은 프레임의 윗부분에 명시적으로 표현한다.

반복적인 상호작용을 나타낼 때는 아래와 같이 loop 키워드를 사용한다.

 

3.3) 순차 다이어그램과 클래스 다이어그램의 관계

순차 다이어그램은 객체 사이의 메시지 흐름, 순서를 알려주는 행위 측면에 중점을 두는 모델이다.

그 반면에 클래스 다이어그램은 시스템의 구조적인 측면에 중점을 두는 모델이다.

이와 같은 의미적 차이는 있지만, 순차 다이어그램과 클래스 다이어그램은 서로 밀접한 관계가 있으며, 이들을 이용해 시스템을 모델링할 때는 서로 정합이 이루어져야 한다.

위의 그림 4-12에서 (a), (b) 모두 클래스 X의 인스턴스가 클래스 Y, 클래스 Z에 메시지를 보내는 점을 표현했다.

즉, 클래스 X는 클래스 Y와 클래스 Z에 연관 또는 의존 관계를 지니고 있다.

여기서 (b)를 보면 클래스 X가 클래스 Y에게 m1() 메시지와 함께 m3() 메시지도 전송했다.

즉, 클래스 X의 입장에서 보면 메시지를 송신받는 클래스 Y의 인스턴스를 기억할 필요가 있다.

(a)의 경우에는 m1, m2 메시지를 처리한 이후부터는 Y, Z 클래스가 더 이상 필요 없다고 판단할 수 있으므로, 의존 관계로 표현하며, (b)의 경우에는 연관 관계로 표현할 수 있다.

이를 그림으로 표현하면 다음과 같다.

 


 


수고하셨습니다!


'Develop Study > Design Pattern' 카테고리의 다른 글

6. 싱글턴 패턴  (0) 2022.07.03
5. 스트래티지 패턴  (0) 2022.07.03
3. SOLID 원칙  (0) 2022.07.03
2. 객체지향 원리  (0) 2022.07.03
1. 객체지향 모델링  (1) 2022.07.03
0 Comments