본문 바로가기
SDM

SDM - Software Design Pattern 의 종류

by 지민재 2024. 4. 4.
반응형
SMALL

SDM - Software Design Pattern 의 종류

게시 2024/04/04
By Ji Min-Jae
11 분읽는 시간

Design Pattern

 

Design Pattern이란?

소프트웨어 디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 솔루션을 제공하는 패턴이다. 디자인 패턴은 자주 겪는 설계 문제와 그에 대한 해결 방법을 문서화하여 개발자들이 해당 문제에 직면했을 때 쉽게 적용할 수 있게 돕는다.

 

디자인 패턴의 역사

1970년대와 1980년대, 소프트웨어 설계 및 개발 방법론이 점차 발전하면서 다양한 설계 원칙과 기법들이 탄생하여 객체 지향 프로그래밍(OOP)의 기본 원칙들이 정립되기 시작했고, 이러한 원칙들이 후에 디자인 패턴의 발전에 중요한 기초를 제공했다. 그리고 990년대 초반, 소프트웨어 엔지니어링 분야의 전문가들인 ‘그랜드의 4인방(Gang of Four, GoF)’이라고 불리는 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides는 “Design Patterns: Elements of Reusable Object-Oriented Software”라는 책을 출판하였다. 여기서 다양한 객체 지향 디자인 관련한 문제를 해결하는 23가지 패턴이 소개되었으며, 이 패턴들의 개념을 프로그램에 접목시켰다. “Design Patterns” 책의 출판 이후, 디자인 패턴의 개념은 소프트웨어 개발 커뮤니티에서 빠르게 확산되며, 다양한 소프트웨어 개발 분야에서 디자인 패턴이 적극적으로 적용되기 시작했고, 이를 통해 코드의 재사용성, 유지보수성, 확장성 등이 향상되는 것으로 입증하였다.

 

소프트웨어 개발에서 여러 가지 장점

1. 코드 재사용(Reuse of Code)

  • 디자인 패턴은 특정한 문제 해결을 위한 일반적인 솔루션을 제공하기 때문에, 비슷한 문제나 요구사항에 대해 반복적으로 코드를 작성하는 것을 피할 수 있다. 이로 인해 개발 시간을 단축하고 코드의 일관성을 유지할 수 있다.

 

2. 설계의 일관성과 유연성(Consistency and Flexibility in Design)

  • 디자인 패턴은 코드 구조와 설계에 일관성을 제공하며, 변경에 대한 유연성을 확보할 수 있게 도와준다.
  • 패턴을 사용하면 미래의 요구사항 변화나 확장에 대응하기 쉬운 설계를 구성할 수 있다.

 

3. 문서화와 이해의 도움(Documentation and Understanding)

  • 디자인 패턴은 공통된 언어와 구조를 제공하여 팀원 간의 의사소통을 쉽게 만들어준다.
  • 새로 합류한 개발자나 팀원이 기존의 코드와 설계를 빠르게 이해하고 적응할 수 있게 도와준다.

 

4. 성능 최적화(Optimization of Performance)

  • 일부 디자인 패턴은 성능 최적화에 도움을 줄 수 있다. 예를 들어, 프록시(Proxy) 패턴은 객체의 접근을 제어하여 성능을 향상시킬 수 있다.

 

5. 결합도 감소(Decoupling)

  • 디자인 패턴은 시스템의 구성 요소들 사이의 결합도를 줄이는 데 도움을 준다. 이로 인해 각각의 구성 요소가 독립적으로 변경될 수 있으며, 시스템의 유지보수와 확장이 더 쉬워진디.

 

6. 품질 향상(Quality Improvement)

  • 디자인 패턴을 적용하면 코드의 품질과 가독성이 향상되며, 오류 발생 가능성이 줄어듭니다.
  • 일관된 설계와 구조를 통해 코드의 품질을 유지하고 개선할 수 있습니다.

 

GoF 디자인 패턴이란?

1995년 GoF라고 불리는 Erich Gamma, Richard Helm, Ralph Johnson, John Vissides 4명이 처음으로 디자인 패턴을 구체화 하였는데, GoF의 디자인 패턴은 소프트웨어 공학에서 가장 많이 사용되는 디자인 패턴

 

GoF 디자인 패턴 분류

생성패턴 5개, 구조 패턴 7개, 행위 패턴 11개, 총 23개의 패턴으로 구성

 

생성 패턴 (Creational Patterns)

객체의 생성과 관련된 패턴으로, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행하는 패턴

  • 싱글톤 (Singleton): 단 하나의 인스턴스만을 생성하도록 보장하며, 전역적으로 접근 가능한 방법을 제공합니다.
  • 팩토리 메서드 (Factory Method): 객체 생성을 서브 클래스에서 처리하도록 위임하여, 생성 코드와 사용 코드를 분리합니다.
  • 추상 팩토리 (Abstract Factory): 관련된 여러 객체의 집합을 생성하도록 인터페이스를 제공하며, 구체적인 클래스 선택을 미룹니다.
  • 빌더 (Builder): 복잡한 객체를 단계별로 생성하며, 다양한 생성 알고리즘을 캡슐화합니다.
  • 프로토타입 (Prototype): 객체를 복제하는 방식으로 새로운 객체를 생성합니다.

 

구조 패턴 (Structural Patterns)

클래스나 객체의 구성을 다루며, 클래스와 객체의 합성을 통해 새로운 기능을 제공 객체의 합성(조합)을 다루는 패턴

  • 어댑터 (Adapter): 호환되지 않는 인터페이스를 갖는 클래스들을 함께 동작할 수 있도록 변환합니다.
  • 브릿지 (Bridge): 구현부와 추상부를 분리하여 독립적으로 확장할 수 있게 합니다.
  • 컴퍼지트 (Composite): 개별 객체와 복합 객체를 동일하게 취급하며, 트리 구조로 객체를 구성합니다.
  • 데코레이터 (Decorator): 객체에 추가적인 책임을 동적으로 추가합니다.
  • 퍼사드 (Facade): 복잡한 서브 시스템을 단순화된 인터페이스로 제공합니다.
  • 플라이웨이트 (Flyweight): 객체의 공유를 통해 메모리 사용량을 줄입니다.
  • 프록시 (Proxy): 실제 객체에 대한 접근을 제어하거나 추가적인 기능을 제공합니다.

 

행동 패턴 (Behavioral Patterns)

객체나 클래스 사이의 알고리즘, 책임, 작업 분배에 관한 패턴

  • 책임 연쇄 (Chain of Responsibility): 요청을 처리할 수 있는 객체의 연쇄를 생성합니다.
  • 커맨드 (Command): 요청을 객체의 형태로 캡슐화하여, 나중에 실행하거나 취소할 수 있게 만듭니다.
  • 인터프리터 (Interpreter): 언어의 문법을 표현하는 클래스를 정의하며, 문장을 해석합니다.
  • 이터레이터 (Iterator): 컬렉션의 요소에 순차적으로 접근할 수 있는 방법을 제공합니다.
  • 중재자 (Mediator): 객체들 사이의 복잡한 통신을 중앙화하여, 객체 간의 결합도를 줄입니다.
  • 메멘토 (Memento): 객체의 상태를 저장하고 복원하는 메커니즘을 제공합니다.
  • 옵저버 (Observer): 객체의 상태 변화를 관찰하고, 이에 따라 다른 객체들에게 알림을 보냅니다.
  • 상태 (State): 객체의 내부 상태에 따라 동작이 변경되는 방식을 캡슐화합니다.
  • 전략 (Strategy): 알고리즘을 캡슐화하고, 런타임에 알고리즘을 변경할 수 있게 합니다.
  • 템플릿 메서드 (Template Method): 알고리즘의 구조를 정의하고, 구체적인 단계는 서브 클래스에서 구현합니다.
  • 방문자 (Visitor): 객체 구조를 돌아다니며, 각각의 요소에 대해 새로운 연산을 적용합니다.

댓글