What is Design Pattern?

객체지향 소프트웨어를 ‘잘’ 설계한다는 것은 쉬운 일이 아닙니다.

게다가, 재사용할 수 있는 객체지향 소프트웨어를 만드는 것은 더 힘듭니다.

설계를 할 때에는 지금 당장 갖고 있는 문제를 해결할 수 있어야 하지만, 나중에 생길 수 있는 문제나 추가된 요구 사항들도 수용할 수 있도록 일반적이고 포괄적이어야 합니다.

이를 위해 설계할 때 고려사항으로 SOLID 원칙 등 객체지향적 소프트웨어 설계 방법론이 있고, 현업에서는 이에 따라 개발하기 위해 노력하고 있습니다.

개발의 경험이 쌓이다 보면 자신들이 전에 사용했던 코드와 유사한 기능을 구현해야 해서 이전의 코드를 들여다보는 경험을 종종 하게 됩니다. 그러다 전에 사용했던 해결책을 그대로 반복해서 사용하기도 하고, 변형해서 쓰기도 하고, 혹은 상황에 맞지 않다고 판단하여 다른 방향의 구현을 고민하기도 합니다.

디자인 패턴은 설계자로 하여금 재사용이 가능한 설계는 선택하고, 재사용을 방해하는 설계는 배제하도록 도와줍니다. 또한 패턴을 쓰면 이미 만든 시스템의 유지보수나 문서화도 개선할 수 있고, 클래스의 명세도 정확하게 할 수 있으며, 객체 간의 상호작용 또는 설계 의도까지 명확하게 정의할 수 있습니다.

간단하게 말해서 디자인 패턴은 설계자들이 “올바른” 설계를 “빨리” 만들 수 있도록 도와줍니다.

디자인 패턴(Design Pattern)이란?

디자인 패턴이란 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어나갈 것인가에 대한 일종의 솔루션 같은 것입니다. 디자인 패턴 계의 교과서로 불리는 [GoF의 디자인패턴]에서는 객체지향적 디자인 패턴의 카테고리를 “생성 패턴(Creational Pattern)”, “구조 패턴(Structural Pattern)”, “행동 패턴(Behavioral Pattern)” 3가지로 구분하고 있습니다.

생성(Creational) 패턴 구조(Structural) 패턴 행동(Behavioral) 패턴
Singleton Adapter Command
Abstract Factory Composite Interpreter
Factory Method Decorator Iterator
Builder Facade Mediator
Prototype Flyweight Memento
  Proxy Observer
    State
    Strategy
    Template Method

다음의 네 가지 요소를 포함

  1. 패턴 이름(Pattern Name)
    • 패턴의 이름은 해당 패턴의 솔루션을 담고 있는 경우가 많습니다. 따라서 설계에 대한 생각을 더욱 쉽게 할 수 있고, 개발자들 간의 의사소통이 원활해집니다.
  2. 문제(Problem)
    • 언제 패턴을 사용하는가를 서술하며 해결할 문제와 그 배경을 뜻합니다. 문제를 제시함으로써 패턴을 적용하는 것이 의미 있는 사례를 소개하겠습니다.
  3. 해법(Solution) 및 구현(Implementation)
    • 앞서 2번에서 다룬 문제(Problem)에 대하여 어떻게 해결할 수 있을 것인가에 대해 해결책을 제시하고, Java를 통해 예제 코드를 다루겠습니다.
  4. 결과(Consequence)
    • 디자인 패턴을 적용해서 얻는 결과와 장단점을 서술합니다.

디자인 패턴을 공부하는 방법

개발자 세계에는 수십 개가 넘는 디자인 패턴이 있습니다. 사실 어떤 문제에 어떤 패턴을 사용해야 할지 판단하는 것은 참 어려운 일입니다. 특히 디자인 패턴에 대해 빠삭하게 알고 있지 않은 개발자라면 더욱 어려울 것입니다.

그렇기 때문에 어떤 패턴부터 어떻게 공부를 해야 할지 고민이 될 수밖에 없습니다.

정답이라고는 할 수 없지만, 제가 추천하는 디자인 패턴 공부 방법은 아래와 같습니다.

원문링크

디자인 패턴(Design Pattern)이란?