본문 바로가기

CS BASIC/정보시스템 일반

[CS BASIC] 디자인 패턴과 GoF(Gang of Four)

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

  • 각 모듈의 세분화된 역할이나 모듈들 간의 인터페이스와 같은 코드를 작성하는 수준의 세부적인 구현 방안을 설계할 때 참조할 수 있는 전형적인 해결 방식
  • 자주 사용하는 설계 형태를 정형화하여 유형별로 설계 템플릿을 만들어 두고 소프트웨어 개발 중 나타나는 과제를 해결하기 위한 방법 중 한 가지다.
  • 다양한 응용 소프트웨어 시스템들을 개발할 때 서로 간에 공통되는 설계 문제가 존재하는 데, 각 해결책 사이에도 공통점이 있으며 이러한 유사점을 패턴이라 한다.
  • 개발자 간 원활한 의사소통, 소프트웨어 구조 파악 용이, 설계 변경에 대한 유연한 대처, 개발의 효율성, 유지보수성, 운용성 등 소프트웨어 품질 향상에 도움을 준다.
  • 객체 지향 프로그래밍 설계 시 유사한 상황에서 구조적인 문제를 해결할 수 있도록 방안을 제공한다.

 

디자인 패턴을 이용한 소프트웨어 재사용의 이점

  • 소프트웨어 코드의 품질을 향상시킬 수 있다.
  • 개발자들 사이의 의사소통을 원활하게 할 수 있다.
  • 소프트웨어의 품질과 생산성을 향상시킬 수 있다.
  • 시스템 개발 시 공통 언어 사용 (의사소통 원활)
  • 코드의 품질 향상
  • 향후 변화에 대한 대비 가능
  • 유지보수 용이

 

 GoF(Gang of Four) 디자인 패턴

  • GoF(Gang of Four) 패턴: 에리히 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)가 같이 고안한 디자인 패턴

 

💡 왜 GoF라고 부르나요?

→ GoF(Gang of Four) 디자인 패턴은 4명의 저자가 C++를 사용하여 대규모 엔터프라이즈 시스템을 프로그래밍 한 경험을 통해 일반적인 패턴이 나타나는 것을 발견했고 그 중 대표적인 23개의 패턴을 정리해 책을 쓰면서 사람들에게 알려지게 됨.

 

https://velog.io/@waoderboy/Gof-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4

 

Gof 디자인 패턴

디자인 패턴이란 무엇일까?

velog.io

 

GoF 디자인 패턴의 분류

구분 종류
생성 패턴 Abstract Factory, Builder, Factory Method, Prototype, Singleton
구조 패턴 Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
행위 패턴 Chain of Responsibility, Command, Interpreter, Iterator, Mediator,
Memento, Observer, State, Strategty, Template Method, Visitor

 

 

생성 패턴

  • 객체를 생성하는 것과 관련된 패턴이다.
  • 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하도록 만들어주어 유연성을 높일 수 있고 코드를 유지하기가 쉬운 편이다.
  • 객체의 생성과 참조 과정을 추상화함으로써 시스템을 개발할 때 부담을 덜어준다.

 

① 추상 팩토리 패턴(Abstract Factory Pattern) : 동일한 주제의 다른 팩토리를 묶어 준다.

② 빌더 패턴(Builder Pattern) : 생성(construction)과 표기(representation)를 분리해 복잡한 객체를 생성.

③ 팩토리 메서드 패턴 (Factory Method Pattern) : 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성 하도록 하는 방식

④ 프로토타입 패턴 (Prototype Pattern) : 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제함.

⑤ 싱글턴 패턴 (Singleton Pattern) : 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하도록 하는 디자인 유형

 

구조 패턴

  • 클래스나 객체를 조합해 더 큰 구조를 만들어 내는 디자인 패턴
  • 복잡한 형태의 구조를 갖는 시스템을 개발하기 쉽게 만들어주는 패턴
  • 새로운 기능을 가진 복합 객체를 효과적으로 작성 가능

 

① 어댑터 패턴(Adapter Pattern) : 래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해줌.

② 브릿지 패턴(Bridge Pattern) : 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 구성.

③ 컴포지트 패턴 (Composite Pattern) : 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 함.

④ 데코레이터 패턴(Decorator Pattern) : 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴

⑤ 퍼사드 패턴 (Facade Pattern) : 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체를 기반으로 디자인을 하는 패턴

⑥ 플라이웨이트 패턴 (Flyweight Pattern) : 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴

⑦ 프록시 패턴(Proxy Pattern) : 일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것과도 인터페이스의 역할을 수행할 수 있다. 프록시 패턴의 잘 알려진 예로는 참조 횟수 스마트 포인터 객체이다.

 

 

행위 패턴

  • 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의
  • 메시지 교환과 관련된 것으로, 객체 간의 행위나 알고리즘 등과 관련된 패턴을 말함

 

① 역할 사슬 패턴 (Chain of Responsibility Pattern) : 여러 개의 객체 중에서 어떤 것이 요구를 처리할 수 있는지를 사전에 알 수 없을 때 사용, 어떤 프로세스가 일어났을때 그 프로세스를 처리할 책임을 적당한 대상한테 넘김.

② 커맨드 패턴 (Command pattern) : 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴

③ 인터프리터 패턴 (Interpreter Pattern) : 문법 규칙을 클래스화 한 구조로, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴

④ 반복자 패턴 (Iterator Pattern) : 객체 지향 프로그래밍에서 반복자를 사용하여 컨테이너를 가로지르며 컨테이너의 요소들에 접근하는 디자인 패턴

⑤ 중재자 패턴 (Mediator Pattern) : 모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴이다. 즉, M:N의 관계에서 M:1의 관계로 바꾸는 것.

⑥ 메멘토 패턴 (Memento Pattern) : 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 소프트웨어 디자인 패턴

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

⑧ 스테이트(상태)패턴 (State Pattern) : 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용하는 디자인 패턴

⑨ 전략(정책) 패턴 (Strategy Pattern) : 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴

⑩ 템플릿 메소드 패턴 (Template Method Pattern) : 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴

⑪ 비지터 패턴(Visitor Pattern) : 알고리즘을 객체 구조에서 분리시키는 디자인 패턴이다. 이렇게 분리를 하면 구조를 수정하지 않고도 실질적으로 새로운 동작을 기존의 객체 구조에 추가할 수 있게 된다. 개방-폐쇄 원칙을 적용하는 방법의 하나