OOP Design Pattern Series - 여는 글
Photo by David Pisnoy on Unsplash
  • 디자인 패턴을 소개합니다.
  • 객체지향을 소개합니다.
  • 본 시리즈를 소개합니다.

1. 디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 개발에서의 문제 해결 방법론이다.
  • 디자인 패턴은 소프트웨어 설계 및 개발 과정에서 공통적으로 발생하는 문제에 대한 일반적인 해결책을 제시한다.

디자인 패턴은 모든 문제에 대한 해결을 제공하는 것이 아니다. 공통적으로 발생하는 일반적인 문제들에 대한 해결책을 제시한다. 이는 일반적인 해결책이라는 용어를 사용하는 이유이다.

1.1 디자인 패턴의 역사

  • 일반적으로 디자인 패턴의 역사를 얘기하면, 1994년에 출간된 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides의 저서 Design Patterns: Elements of Reusable Object-Oriented Software가 언급된다.
  • GoF는 23가지의 객체 지향 디자인 관련 문제를 해결하는 패턴을 소개했다.
  • 이 후 수많은 다른 객체 지향 패턴이 소개되었으며, 다른 프로그래밍 패러다임에서도 디자인 패턴이 소개되었다.

4명의 저자들은 GoF(Gang of Four)라고 불리곤 한다.

1.2 디자인 패턴의 장점

  • 언급된 GoF의 디자인 패턴 책에서는 디자인 패턴의 장점으로 6가지를 언급한다.
  1. 재사용성
    • 발생한 문제를 해결하기 위한 검증된 솔루션을 제공한다.
    • 개발자는 솔루션 개발에 더 적은 시간과 노력을 투자한다.
  2. 가독성
    • 디자인 패턴은 일관된 구조를 보인다.
    • 이는 코드를 이해하기 쉽고, 유지보수에 용이하도록 만든다.
  3. 유연성
    • 디자인 패턴을 적용하면, 코드를 쉽게 수정하거나 변경할 수 있다.
  4. 확장성
    • 작은 규모에서 큰 규모의 시스템까지 다양한 시스템 환경에서도 잘 동작한다.
  5. 표준화
    • 일관된 개발 방법론을 통해, 여러 개발자들이 협업하면서 코드의 일관성을 유지한다.
  6. 문제 해결
    • 검증된 솔루션을 통해 코드에서 발생할 수 있는 문제를 미리 방지한다.
    • 이는 안정성과 신뢰성을 높인다.
  • 이러한 장점들은 결국 디자인 패턴이 코드를 효율적을 만들며, 유지보수성을 높일 수 있다는 것을 보인다.

1.3 다른 개념과의 비교

  • 간혹 디자인 패턴은 라이브러리, 프레임워크 개념과 비교되기도 하며, 알고리즘과 혼동되기도 한다.
  • 아래는 각 개념과 디자인 패턴에 대한 비교 설명이다.

디자인 패턴과 라이브러리

  • 라이브러리는 미리 작성된 코드의 집합으로, 이를 개발자가 자신의 코드에 포함시켜 사용한다.
  • 이를 통해 코드 재사용성과 개발 속도 향상에 이점을 얻을 수 있다.
  • 반면, 디자인 패턴은 문제 해결 방법론이며, 코드가 아니다.
  • (위에서 언급했듯이) 개발 도중 발생한 문제의 해결책을 얻는데 도움을 준다.

디자인 패턴과 프레임워크

  • 프레임워크는 소프트웨어 개발을 위한 뼈대를 제공한다.
  • 프레임워크는 소프트웨어 개발에 필요한 구조, 규칙, 기능을 미리 정의하여 개발자가 소프트웨어를 빠르고 효율적으로 개발할 수 있도록 돕는다.
  • 따라서 프레임워크는 소프트웨어 개발에서 마주칠 수 있는 다양한 문제에 대한 솔루션을 포함하고 있다는 점에서 디자인 패턴과 유사하다.
  • 그러나, 디자인 패턴은 방법론을 제공하는 반면, 프레임워크는 구체적인 기능과 구조를 제공한다.
  • 따라서, 개발자는 프레임워크가 제공하는 구조에 맞추어 코드를 작성해야 한다. 반대로 개발자는 디자인 패턴을 자신의 코드에 적용하여 사용한다.
  • 또한 프레임워크는 특정 언어, 환경에서 사용되지만 디자인 패턴은 이에 구애받지 않는다.

디자인 패턴과 알고리즘

  • 알고리즘은 어떤 목표를 달성하기 위해 입력값을 받아 출력값을 만들어내는 계산 과정을 기술한 것이다.
  • 즉, 단계적인 절차를 제공한다는 점에서 차이가 있다.
  • 그러나 특정 문제를 해결한다는 점에서 유사성이 있다.

많은 책, 자료에서 알고리즘을 요리 순서에 비유한다. 예를 들면, 김치볶음밥을 만든 순서는 알고리즘이다. 나는 디자인 패턴을 다음 질문과 답변을 통해 비유한다. “Q. 김치볶음밥에서 신 맛이 너무 강해요. 어떻게 하면좋을까요? A. 일반적으로 김치볶음밥에서 신 맛이 난다면 조리 과정에서 단 맛을 첨가하여 해결할 수 있습니다.”

1.4 디자인 패턴을 꼭 배워야할까?

  • 디자인 패턴을 별도로 공부하지 않아도 개발자로서 업무를 수행하는 데 문제가 없다고 생각한다.
  • 정확하게는, 우리가 접하는 다양한 언어, 프레임워크, 도구에는 디자인 패턴 개념이 이미 녹아들어 있다.
  • 따라서 우리는 이미 수 많은 디자인 패턴을 경험하고 공부하고 있다고 볼 수 있다.
  • 그러나, 디자인 패턴을 별도로 공부한다면 다음과 같은 이점이 있다.
    1. 아직 접하지 않은 다양한 문제들에 대한 해결책을 배운다.
    2. 개발자 그룹 내에서 공통적으로 사용할 수 있는 용어를 배운다.
    3. 모호한 경험이 아닌 정립된 체계로서 디자인 패턴을 사용할 수 있다.

2. 객체지향 프로그래밍이란?

  • 객체지향 프로그래밍은 컴퓨터 프로그램의 패러다임 중 하나로, 현실 세계의 객체를 모델링하여 소프트웨어를 개발하는 방법이다.
  • 객체는 현실 세계의 사물이나 개념을 의미하며 데이터와 해당 데이터를 처리하는 메소드로 구성된다.
  • 객체지향 프로그래밍에서는 이러한 객체를 생성하고, 객체들이 상호작용하며 프로그램이 동작한다.

프로그래밍 패러다임은 프로그래밍을 수행하는 방법으로, 문제를 해결하기 위한 기본 개념들을 제공한다. 일반적으로 절차지향, 객체지향, 함수형등이 있다.

3. 해당 시리즈를 통해 전달할 내용

  • 본 시리즈는 다음을 목적으로 한다.
    1. 객체지향 프로그래밍의 기초와 객체 간의 관계 소개
    2. 객체지향 디자인 원칙들과 SOLID 소개
    3. GoF가 소개한 디자인 패턴 소개
    4. 각 사례에 맞는 파이썬 코드 소개