각각의 디자인 패턴은 기존 환경 내에서 반복적으로 일어나는 문제들을 설명하고, 그 문제들에 대한 해법의 핵심을 설명하는 것이다. 이렇게 하면 똑같은 방법을 두 번 반복하지 않은 채 이 해법을 백만 번 이상 재사용 할 수 있다.
크리스토퍼 알렉산더 (Christopher Alexander, 1936.10.04 ~ 2022.03.17)
크리스토퍼 알렉산더는 오스트리아의 유명한 건축가로, 물론 위의 이야기는 건축에 관한 이야기겠지만, 이것은 객체지향 설계의 경우에도 해당되는 이야기다. 프로그램에서는 벽이나 골조등의 건축자재를 사용하는 대신 객체와 인터페이스를 사용하지만, 건축과 프로그래밍 모두 설계를 함에 있어 패턴을 어떤 상황의 문제에 대한 솔루션으로 본다는 공통점이 있다.
디자인 패턴의 네 가지 요소
1. 이름 (Name)
1~2개의 단어로 설계 문제와 해법을 서술한다. 패턴에 이름을 부여하는 것은 설계 어휘를 늘리는 일이며 높은 수준의 추상화된 설계를 할 수 있도록 해준다. 패턴의 이름을 정의해 두면 문서에서 이 이름을 사용하여 설계의 의되를 표현할 수 있게 된다. 또 이렇게 이름을 갖게 되면 설계에 대한 생각을 더욱 쉽게 할 수 있고 개발자들 간의 의사소통이 원활하게 된다. 때문에 좋은 이름을 생각해 내는 것이 패턴을 정의하는 데 있어서 가장 힘든 부분중의 하나이기도 하다.
** 이 내용은 개발자라면 특히 공감할 내용이라고 생각한다. 변수 또는 함수명을 가지고도 리뷰에서 많은 고민을 하기도 할만큼 Naming은 중요한 부분임은 확실하다.
2. 문제 (Problem)
언제 패턴을 사용하는가에 대한 내용이며 ,해결할 문제와 그 배경을 설명한다. 즉 "어떤 알고리즘을 객체로 만들까"와 같은 설계의 세밀한 문제를 설명할 수 있다. 때론 유연성 없는 설계가 될 징조를 보이는 클래스 구조나 객체의 구조 등이 문제가 될 수 있을 것이다. 문제를 제시함으로써 패턴을 적용하는 것이 의미 있는 경우들을 정의하기도 한다.
** 개발을 하다보면 중복 코드가 발생할 수 있고, 이는 불필요한 코드가 많아 진다는 점과 문제가 발생 시 중복되는 모든 곳을 수정해야 하는 경우 도 발생한다. 이런것도 문제가 되는 상황 중 하나일 수 있을 것이다.
3. 해법 (Solution)
패턴의 설계를 구성하는 요소들과 그 요소들 간의 관계를 정의한다. 그렇다고 해법이 어떤 구체적인 설계나 구현을 설명하지는 않는다. 왜냐하면 패턴은 다양한 경우에 적용할 수 있는 템플릿이지, 특정 구현을 의미하지는 않기 때문이다.
** 당연한 이야기 일 것이다. 패턴은 말 그대로 패턴일 뿐이다. 구현되어야 하는 사항은 각자의 상황마다 다르기때문에, 해법을 활용해 각자의 상황에 맞도록 적용하는 능력을 길러야 할 것이다.
4. 결과 (Consequences)
디자인 패턴을 적용해서 얻는 결과와 장단점을 말한다. 어떻게보면 설계의 과정에서 설계의 결과는 가장 중요한 부분이라고도 볼 수 있다. 프로그램의 실행 속도를 중요한 요소로 볼 것인지, 아니면 저장 공간의 호율성을 중요한 요소로 볼 것인지, 또는 다른 부분을 중요한 요소로 볼 것인지에 따라 다른 설계 방법을 택해야 한다.
패턴에 대한 시각은 어떤것이 패턴이고 어떤것이 아닌가를 분석하는 데 영향을 준다. 어떤 사람에게는 패턴인 것이 다른 사람에게는 의미 없는 코드 블럭일 수도 있다. 디자인 패턴이라는 것은 클래스로 코딩되는 연결 리스트와 해시 테이블에 관한 설계를 패턴화 하는 것이 아니다. 그렇다고 애플리케이션 전체나 서브 시스템을 지원하는 복잡한 설계에 대한 패턴도 아니다. 디자인 패턴이라 함은 "특정한 상황에서 설계 문제를 해결하기 위해 상호 교류하는 수정 가능한 객체와 클래스들"에 대한 설명이다.
디자인 패턴은 재사용 가능한 객체지향 설계를 만들기 위해 유용한 공통의 설계 구조로부터 중요 요소들을 식별하여 이들에게 적당한 이름을 주고 추상화 한 것이다. 디자인 패턴은 패턴에 참여하는 클래스와 그들의 인스턴스를 식별하여 역할과 관계를 정의하고 책임을 할당한다.
각 디자인 패턴은 특정 객체지향 설계 문제에 집중하고 있다. 언제 패턴을 적용할지, 다른 설계 제약을 고려하여 패턴을 적용할 수 있을지, 패턴을 사용했을 때의 결과가 어떻게 되는가를 항상 고려해야 한다.
정리
디자인 패턴이란 특정한 상황에서 설계 문제를 해결하기 위해 상호 교류하는 수정 가능한 객체와 클래스들에 대한 정의이며, 재사용 가능한 객체지향 설계를 만들기 위해 유용한 공통의 설계 구조로부터 중요 요소들을 식별하여 이들에게 적당한 이름을 주고 추상화 한 것이다.
GoF의 디자인 패턴 참고
'Development > 디자인패턴' 카테고리의 다른 글
디자인 패턴을 이용하는 방법 (2) (0) | 2022.04.18 |
---|---|
디자인 패턴을 이용하는 방법 (1) (0) | 2022.04.14 |
디자인패턴의 조직화, 관계도 (0) | 2022.04.13 |
디자인 패턴의 종류 (0) | 2022.04.13 |
디자인 패턴 - Introduction (4) | 2022.04.12 |