이 포스트는 edwith의 iOS 프로그래밍 강의를 듣고 정리한 내용입니다.


프로그래밍 디자인 패턴

  • 프로그래밍을 하다보면 유사한 상황을 자주 만나게 된다.

    • 특정 상황에 사용되는 패턴을 정형화해 두면 이후 비슷한 상황을 마주했을 때 더욱 빠르고 유연하게 대처할 수 있다.

프로그래밍 디자인 패턴 발생 배경

  • 디자인 패턴이 객체지향 프로그래머에게 크게 영향을 미치게 된 계기는 “디자인 패턴 (Design Patterns)” 책이 출간되면서부터이다.

  • 이 책에서 GoF는 객체지향 설계를 위한 23개의 패턴을 기술하였다

    • GoF = Gang of Four의 약자, “디자인 패턴(Design Patterns)”의 저자들 Erich Gamma, Richard Helm, Ralph Johnson, Jone Vlisside 네사람을 칭함
  • 이를(디자인 패턴 책 - 23개의 패턴) 토대로 객체지향 분석/설계, 도메인 설계, 프로세스 조직/설계, 사용자 인터페이스 설계와 같은 다양한 분야에서 패턴과 언어에 대한 논문과 책들이 출간되고 객체지향 프로그래밍 개발에서 디자인 패턴이 폭넓게 사용되기 시작하였다.


프로그래밍 디자인 패턴이란?

  • 디자인 패턴의 저명한 인사들이 내린 정의이다. (GoF)

  • “특정한 상황에서 일반적 설계문제를 해결하기 위해 상호교류하는 수정 가능한 객체와 클래스들에 대한 설명이다”

  • “숙련된 객체지향 개발자 및 기타 소프트웨어 개발자는 소프트웨어 개발의 가이드라인이 되는 일반적인 원칙들과 관용적인 해결책들의 레퍼토리를 구축한다. 패턴은 이러한 원칙들과 관용적 해결책들이 문제와 해결책을 기술하는 구조적인 형태로 체계화되고 명명된 것이다”

  • 프로그래밍 디자인 패턴은 소프트웨어를 설계할 때 특정 상황에서 자주 사용하는 패턴을 정형화한 것이며, 좋은 소프트웨어 설계를 위한 개발자들의 경험적 산물이라고 할 수 있다.


프로그래밍 디자인 패턴의 특징

  • 1) 경험을 통하여 얻을 수 있다.

  • 2) 특정한 형식을 갖고 체계적으로 작성되는 것이 일반적이다.

  • 3) 패턴에는 각기 다른 추상화 수준이 존재하며 계속 진화한다.


프로그래밍 디자인 패턴의 장점

  • 의사소통에 도움을 준다

    • 디자인 패턴을 알고 있는 설계자들은 특정 문제에 대해 공통으로 알고 있는 패턴을 이용해 해결책에 대해 논의를 할 수 있기 때문에 더욱 원활하게 의사소통할 수 있다.
  • 검증된 지식인 패턴을 사용하면 높은 완성도의 디자인을 빠른 시간에 만들어 낼 수 있기 때문에 소프트웨어 개발 비용을 줄일 수 있어서 경제적이다.

  • 코드의 수준을 한 단계 높여 주고 적은 수의 클래스로 원하는 목적을 달성할 수 있는 환경이 제공된다.

  • 좋은 설계나 아키텍쳐가 패턴이라는 이름으로 명명되어 있어 개발자는 그 패턴의 이름만으로도 그 소프트웨어의 구조를 알 수 있다.

    • 이를 바탕으로 이전의 소프트웨어 개발에서 사용한 설계나 구조를 쉽게 이해할 수 있고, 새로운 소프트웨어로 빠르게 적용할 수 있어서 소프트웨어 재사용을 쉽게 해준다.

디자인 패턴의 분류

  • 새로운 소프트웨어를 개발할 때마다 대부분 개발자는 어떤 클래스를 만들고 어느 시점에 객체를 생성하고 소멸시킬지, 데이터를 어떻게 받아서 처리할지, 구조 설계를 어떻게 할지 고민한다

  • 디자인 패턴 분류는 위와 같이 소프트웨어 코드를 작성할 때 자주 반복되는 특정 상황에서 설계를 용이하게 하며 코드의 재사용이 용이하도록 패턴을 정리해 놓은것이다.


GoF의 패턴 분류 방법

  • GoF는 디자인 패턴을 목적과 범위로 분류했다.

목적

  • 패턴이 무엇을 하는지 정의하는 것으로 “생성”, “구조”, “행위”중의 한 가지 목적을 갖는다

생성(Creational Pattern)

  • 객체의 생성 과정에 관여하는 패턴

구조 (Structural Pattern)

  • 클래스나 객체의 구성을 통해 더 큰 구조로 만들 수 있게 해주는 것과 관련된 패턴

행위 (Behavioral Pattern)

  • 패턴을 주로 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴

범위

  • 패턴을 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴

클래스 패턴 (Class Pattern)

  • 클래스들과 하위 클래스 간의 관계를 다루는 패턴. 컴파일 시에 관계가 결정된다.

객체 패턴 (Object Pattern)

  • 객체간의 관계를 다루며 보통 구성을 통해 정의된다. 객체 패턴은 일반적으로 실행시간에 관계가 생성되기 때문에 더 동적이면서 유연하다.

디자인 패턴의 종류

  • 수많은 패턴 중 몇 가지 패턴의 종류를 간단하게 설명

싱글톤 패턴 (Singleton Pattern)

  • 목적 : 생성

  • 범위 : 객체

  • 객체의 생성에 관련된 패턴으로서 특정 클래스의 인스턴스가 오직 하나임을 보장하고 이 인스턴스에 접근할 방법을 제공한다.

옵저버 패턴 (Observer Pattern)

  • 목적 : 행위

  • 범위 : 객체

  • 객체의 상태변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 패턴

퍼사드 패턴 (Facade Pattern)

  • 목적 : 구조

  • 범위 : 객체

  • 건물의 정문에 있는 안내소처럼 개발자가 사용해야 하는 서브 시스템의 가장 앞쪽에 위치하면서 하위 시스템에 있는 객체들을 사용할 수 있도록 하는 역활을 한다. 시스템의 복잡성을 줄이기 위해 서브 시스템을 구조화하고 서브 시스템으로의 접근을 하나의 퍼사드 객체로 제공하는 패턴이다.

스트래티지 패턴 (Strategy Pattern)

  • 목적 : 행위

  • 범위 : 객체

  • 알고리즘을 담당하는 각각의 클래스들을 만들어 책임을 분산하기 위한 목적으로 만든 행위 패턴

팩토리 패턴 (Factory Pattern)

  • 목적 : 생성

  • 범위 : 클래스

  • 객체를 생성하기 위한 인터페이스를 정의하지만 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 하위 클래스에서 이루어 지도록 인스턴스 생성의 책임을 떠넘기는 패턴

어탭터 패턴 (Adapter Pattern)

  • 목적 : 구조

  • 범위 : 클래스, 객체

클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 동작하도록 해준다.


소프트웨어 디자인 패턴을 사용할 때 생각해 볼 점

  • 디자인 패턴은 모든 상황에서 만능은 아니다.

    • 예를 들어 싱글톤 패턴을 적재적소에 활용하면 유용하겠지만, 적절치 못한 상황에 사용하면 오히려 큰 독이 될 수도 있다.
  • 다양한 디자인 패턴을 아는 것도 중요하지만, 언제 어떻게 사용하는 것이 좋을지 고민하는 것도 중요한 문제이다.

  • 디자인 패턴은 그 종류도 다양해지고 있으며, 기존의 디자인 패턴을 변형하여 사용하는 경우도 많다.

  • 다양한 디자인 패턴을 익히고 자신의 코드에 적용해 보되, 깊은 공부와 많은 고민은 필수이다.

  • 디자인 패턴에 대하여 제대로 알지 못하고 사용하면 코드에 치명적 영향을 미칠 수 있음을 항상 명심해야 한다.