Search

Chapter 4. 디자인 패턴

생성일
2025/05/29 11:55
태그

디자인 패턴의 이해

프로그래밍을 빠르게 익힐 수 있는 방법 중 이미 실력이 뛰어나다고 알려진 프로그래머가 작성한 코드를 읽는 것이 효과적이다. 그 프로그램에는 프로그래머가 수년간 고생하며 쌓아놓은 경험이 고스란히 녹아들어있기 때문이다.
다양한 모듈이나 기능을 가진 시스템을 개발할 때도 공통되는 설계 문제가 존재하며, 이를 해결하는 해결책의 공통점을 패턴이라 한다. 디자인 패턴은 경험 많은 소프트웨어 엔지니어들이 설계할 때 자주 발생하는 고질적인 문제의 해법들을 정형화해둔 예시이다.
디자인 패턴의 구조는 콘텍스트, 문제, 해결의 요소로 구성되어 있다.
콘텍스트 : 문제가 발생하는 여러 상황 혹은 패턴이 적용될 수 있는 상황
문제 : 여러 제약 사항과 영향력을 고려해, 패턴이 적용되어 해결될 필요가 있는 디자인 이슈
해결 : 문제를 해결하기 위한 설계의 구성 요소와 그 사이의 관계, 책임, 협력 관계
이러한 디자인 패턴의 구조를 통해, 디자인 패턴은 개발자들 간에 공통의 언어를 만들고 팀원 사이의 의사 소통을 원활하게 해주는 역할을 할 수 있다.
아키텍처 패턴, 디자인 패턴, 관용구 차이 아키텍처 패턴 : 시스템 구성하는 컴포넌트의 구성과 컴포넌트 사이의 협조 방법을 패턴화한 것 디자인 패턴 : 아키텍처 패턴에서 컴포넌트의 내부 구조를 대상으로한 클래스/객체의 구조와 협업 방법을 패턴화한 것 관용구 : 각 프로그램 언어 특유의 패턴, 프로그래밍에서 자주 사용하는 방법을 패턴화한 것

GoF 디자인 패턴

GoF(Gang of Four)는 소프트웨어 개발 영역에서 디자인 패턴을 구체화하고 체계화한 에리히 감마, 리차드 헬름, 랄프 존슨, 존 블리시디스 4명의 개발자들을 말한다. 이 4명의 개발자들이 3가지로 분류하고 정의한 23가지의 디자인 패턴을 GoF 디자인 패턴이라 한다.
생성 패턴
생성 패턴은 객체 생성에 관련된 패턴으로, 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 시스템에 영향이 없도록 유연한 설계를 제공한다.
생성 패턴 종류
구조 패턴
구조 패턴은 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다.
구조 패턴
행위 패턴
행위 패턴은 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴이다.
행위 패턴

UML과 디자인 패턴

UML 2.0에서 디자인 패턴을 표현하는 도구로 컬레보레이션이 있다. 디자인 패턴을 정확하게 표현하려면 컬레보레이션을 통해, 주어진 목적을 달성하기 위해 어떤 요소들이 협력하지는지구조적인 면협력을 위한 요소들의 상호작용을 나타내는 행위적인 면을 모두 표현해야한다.

컬레보레이션

혼자서 모든 일을 처리할 수는 없다. 현실에서도 그렇지만 객체지향 시스템에서도 마찬가지로, 주어진 목적을 달성하기 위해 여러 객체가 각자 맡은 역할에 따라 일을 수행하며 협력한다. 여기서 중요한 점은 객체와 역할 사이의 관계로, 객체는 역할이 아니므로 하나의 객체가 다양한 역할을 수행할 수 있다.
디자인 패턴 역시 목적을 달성하기 위한 역할들의 상호 협동 작업으로 볼 수 있는데, UML에서는 이러한 상화작용을 컬레보레이션이라는 요소로 작성한다.
컬레보레이션은 위와 같이 점선으로 된 타원 기호를 사용하고, 타원 내부에 협력하는 역할들을 커넥터로 연결하여 표현한다.
이처럼 컬레보레이션은 역할들의 상호작호 작용을 추상화한 것으로, 더 구체적인 상황에서의 컬레보레이션 적용을 표현하는 컬레보레이션 어커런스를 사용할 수도 있다.
컬레보레이션 어커런스는 위처럼 협력 과정에서 각 클래스가 어떤 역할을 담당하는지를 의존 관계를 통해 추가한 것이다. 담보 대출이라는 목적을 위해 대출자 역할을 하는 은행, 담보 역할을 하는 집, 대출인 역할을 하는 사람으로 표현하고 있다.

순차 다이어그램

순차 다이어그램은 객체들의 상호작용을 나타내는 다이어그램 중 하나로, 객체들 사이의 메시지 송신과 그들의 순서를 나타낸다.
객체를 가장 윗부분에 표현하고, 왼쪽에서 오른쪽으로 객체들을 나열한다. 객체 아래로 생명선이라는 점선을 뻗어 객체가 존재함을 보여준다. 객체가 연산을 실행하는 상태임을 보여주는 활성구간인 좁고 긴 사각형이 나올 수 있다.
객체 사시의 메세지를 화살표로 표시하고, 화살표의 머리를 채워 동기 메세지를 표현하고 채우지 않으면 비동기 메세지를 나타낸다. <<create>><<destroy>> 같이 스테레오 타입을 붙여, 객체의 생성과 소멸을 표현할 수 있다. 메세지를 표현할 때는 [시퀀스 번호] [가드]: 반환 값:=메시지 이름([인자 리스트]) 형태로 표현한다.
UML에는 모든 다이어그램에 프렘임을 제공하는데, 다이어그램을 둘러싼 박스를 표시하고 박스 안 좌측 상단에 다이어그램 타입과 이름을 넣을 수 있다.
이처럼 순차 다이어그램은 sd, 유즈케이스 다이어그램은 uc, 액티비티 다이어그램은 act으로 표현한다. 이러한 프레임을 통해 다양한 일을 할 수 있는데, 상호작용이 반복되는 경우 이를 분리해 작성 후 ref 키워드를 통해 다른 순차 다이어그램을 참조하는 식으로 간단하게 표현할 수 있다.
또한 이처럼 alt 키워드를 통한 프레임으로, 조건에 따라 수행되는 상호작용을 표현할수도 있다.
선택 연산자 alt 키워드 외에도, 반복적인 상호작용을 나타내는 loop 키워드도 있다.
다른 유용한 키워드들 opt : 특정 조건에서만 상호작용을 선택적으로 수행 par : 동시에 실행되는 상호작용을 수행 break : 특정 상호작용 그룹에서 빠져나갈 때 사용

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

순차 다이어그램은 객체 사이의 메시지 흐름과 순서를 알려주는 행위 측면에 중점을 두는 모델이고, 클래스 다이어그램은 시스템의 구조적인 측면에 중점을 두는 모델이다. 시스템을 모델링 할 때는 두 다이어그램이 정합을 이루어지게 해야한다.
위의 두 순차 다이어그램을 클래스 다이어그램으로 바꾼다고 하면,
이와 같이 바꿀 수 있을 것이다. 단순히 메시지를 처리하는 (a)는 의존 관계로 모델링할 수 있고, 클래스 Y에 m1 메시지 전송 후 m3 메세지를 전송하는 점을 고려할 때 장기적인 관계를 가지도록 (b)를 모델링할 수 있다.