개요
프로그램 설계에서 디자인 패턴을 왜 사용하는 것이 좋을까? 그 이유를 알아보기 위해 프로그램 설계와는 다르지만 디자인 패턴의 필요성을 알기 위해 건물 설계 상황을 예시로 들어보자.
3명의 건축 관계자들이 어떻게 건물을 설계할 것인지 토의 중인데, 관계자 1이 이렇게 말한다. "이 책상은 나무를 곧게 자르고 좌 상단과 좌 하단을 5cm정도 잘라내고, 우 상단과 하단은 7cm만 잘라. 그리고 이와 똑같이 자른 나무를 2개 더 가져와 양 옆에 수직으로 연결하자. ..." 관계자 1은 어떻게 나무를 잘라서 어떻게 사용을 할 것인지 일장 연설을 하고있다.
이제 다른 우주에서 같은 건물의 설계 토의를 살펴보자. 이 우주의 관계자 1은 이렇게 말했다. "열장 이음 방법을 이용하여 사용해보자." 이 우주의 설계 토의는 관계자 1의 한마디로 간단하게 종료되었다.
자, 이제 생각해보자. 어떤 토의가 더 효과적이었을까? 처음 회의에서 관계자 2, 3이 관계자 1의 연설을 제대로 이해하지 못하였다면 설계 도중에 계속 어떤 방식을 이용해서 설계하는지 잘 이해하지 못하여 계속 질문할 것이다. 반대로, 두 번째 회의에서 관계자 1이 위 사진을 보여주며 열장 이음 방식으로 건물을 설계하자 하였고 나머지 관계자들은 열장 이음 방식만 알고 있다면 설계 방식을 바로 이해하였을 것이다.
건축 설계가 아닌 프로그램 설계에서도 유사한 상황이 발생한다. 어떻게 프로그램을 설명할지 줄줄 설명하는 것 보다는, 문제 해결 방식인 패턴을 알고 있다면 프로그래머들은 재사용이 용이하고, 더 견고한 코드를 사용해 좋은 프로그램을 설계할 수 있다. 추가적으로 뛰어난 유지 보수, 확장성 효과도 얻을 수 있다.
패턴 방식 맛보기
Adapter 패턴
클래스의 인터페이스를 클라이언트가 예상하는 형태로 변환하고자 할 때, Adapter는 호환되지 않는 인터페이스를 바꾸어 함께 협력하도록 만든다. 이 패턴을 이용하면 함께 사용할 수 없는 클래스를 함께 사용할 수 있다.
Composite 패턴
개별 객체와 객체의 묶음을 같은 방식으로 취급하고 싶을 때 사용
Observer 패턴
일대다 객체 관계에서 객체 하나의 상태 변화를 다른 연관 객체들에게 자동으로 통지 / 변경하고 싶을 때 사용
Iterator 패턴
객체 집합의 요소들을 순차적으로 접근하고 싶을 때 사용
Facade 패턴
여러 서브 시스템의 인터페이스로 통합된 인터페이스를 제공하려 할 때 사용
이외에도 위임 형식, 재귀적 형식의 패턴도 존재한다.
패턴 표현의 관점
위에서 패턴 몇 가지를 아주 얕게 알아보았다. 이제 패턴을 표현하는 2개의 관점을 알아보자.
정적인 측면의 패턴은 패턴을 이루는 클래스와 이들의 정적인 관계를 표현하고, 예시로 클래스 다이어그램이 있다.
동적인 측면에서는 기능이 어떤 순서로 호출되고 실행되는지를 나타내며, 순차 다이어그램이 이에 속한다.
그렇다면 디자인 패턴은 어떻게 표현해야 할까? 아래는 GoF의 설계 패턴 템플릿이다.
Pattern Name | 패턴 명 |
Intent | 설계 패턴의 역할 |
Also Known As | 패턴의 다른 이름 |
Motivation | 설계 문제, 이 문제를 참여자(클래스 / 객체)들이 어떻게 해결할 것인지 |
Applicability | 어떤 상황에서 패턴이 적용 가능한지 |
Structure | 패턴에 사용되는 클래스의 시각적 표현 ex) 클래스 다이어그램, 시퀀스 다이어그램 |
Participants | 패턴의 참여자 (클래스 / 객체) |
Collaborations | 참여자 사이의 상호 협력 |
Consequences | 패턴 적용 시 결과 |
Implementation | 패턴 구현 시 인지해야 할 것 + 특정 언어에 의존적인지 여부 |
Sample Code | 패턴 구현 예시 코드 |
Known Uses | 해당 패턴 적용 실제 예시 |
Related Patterns | 다른 패턴과 어떻게 연관되어 있는지 |
이렇게 간단하게 디자인 패턴에 입문해 보았다. 디자인 패턴은 수 많이 존재하고 기존 패턴보다 더 좋은 패턴이 등장하여 원래 패턴을 더 이상 사용하지 않을 수 있다. 따라서 어느 상황에 어떤 패턴을 사용하는 게 더 좋을 지 생각하여 유연하게 디자인 패턴을 적용해야 할 것이다.
'CS > 객체지향설계 & 패턴' 카테고리의 다른 글
[객체지향설계 & 패턴] 프로토타입 패턴 (0) | 2025.05.10 |
---|---|
[객체지향설계 & 패턴] 브리지 패턴 (0) | 2025.04.06 |
[객체지향설계 & 패턴] 퍼사드 패턴 (1) | 2025.04.06 |
[객체지향설계 & 패턴] 어댑터 패턴 (0) | 2025.04.06 |
[객체지향설계 & 패턴] Solid 설계 원리 (0) | 2025.03.18 |