[CS] GoF 디자인 패턴

하비·2025년 1월 10일

CS

목록 보기
5/5

디자인 패턴에 대해 알아보도록 하겠습니다!
스프링 개발할 때, 그저 남들이 쓰길래, 유지보수가 좋길래 그냥 쓰던 정적 팩토리 메서드에 대해 찾아보다가 찾아보다가...
결국 디자인 패턴을 정리해보자! 하게 되었습니다

GoF 디자인 패턴 유래

(항상 찾아보면 그 단어가 왜 나왔는지 유래는 잘 안나오고, 설명 글들이 많은 것 같습니다...그래서 이번 기회에 한번 찾아보았습니다)

디자인 패턴을 찾아보면 GoF 디자인 패턴이 많이 나오는데, 이것이 객체지향 프로그래밍(OOP) 설계를 할 때 자주 사용되는 패턴이다. 디자인 패턴를 찾으면 GoF 패턴이 많이 나오는 이유가 바로 GoF 패턴이 "디자인 패턴"이라는 개념의 시작점이기 때문이다.

디자인 패턴은 1987년에 작성된 "Using Pattern Languages for Object-Oriented Programs"에서 제안되었다.
이후 1995년에 이른바 사인방(GoF: Gang of Four)이 쓴 23개의 디자인 패턴을 수록한 "Design Patterns: Elements of Reusable Object-Oriented Software(재이용 가능한 객체지향 소프트웨어의 요소 - 디자인 패턴)"라는 책에서 처음 구제적으로 제시되었다.
GoF 패턴은 객체지향 프로그래밍이 널리 사용되기 시작한 시점에 발표됐다.

GoF(Gang of Four): 네명의 컴퓨터 과학 연구자들(에릭 감마, 리차드 헬름, 랄프 존슨, 존 블리시디스)의 네명을 지칭한다.

Q. GoF말고 무슨 패턴이 있을까?
A.

출처: https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EB%94%94%EC%9E%90%EC%9D%B8_%ED%8C%A8%ED%84%B4

GoF 디자인 패턴

GoF는 앞서 말했듯 객체지향 프로그래밍(OOP) 설계를 할 때 자주 사용되는 패턴이다. 객체지향 설계 원칙(SOLID)를 기반으로 소프트웨어 유연성, 재사용성, 유지보수성을 향상시키는데 초점을 두었다.

GoF 디자인 패턴은 목적에 따라 크게 3가지로 나눈다.

  1. 생성 패턴
  • 객체 생성 방식을 다루는 패턴
  • ex) 싱글톤 패턴은 하나의 인스턴스만 생성되도록 보장한다. 왜냐면 자원 낭비를 줄이기 위해서이다.
  1. 구조 패턴
  • 객체 간의 관계를 다루는 패턴
  • ex) 어댑터 패턴은 서로 다른 인터페이스를 가진 객체를 연결한다. 왜냐면 호환성을 높이기 위해서다.
  1. 행위 패턴
  • 객체 간의 상호작용을 다루는 패턴
  • 옵저버 패턴은 객체의 상태 변화를 다른 객체에게 통지한다. 왜냐면 객체 간의 의존성을 줄이기 위해서다.
목적/범위클래스객체
생성 패턴팩토리 메소드(Factory Method)추상 팩토리(Abstract Factory), 빌더(Builder), 프로토타입(Prototype), 싱글톤(Singleton)
구조 패턴어댑터(Adapter)어댑터(Adapter), 브리지(Bridge), 컴포지트(Composite), 데코레이터(Decorator), 퍼사드(Facade), 플라이웨이트(Flyweight), 프록시(Proxy)
행위 패턴인터프리터(Interpreter), 템플릿 메소드(Template Method)책임 연쇄(Chain of Responsibility), 커맨드(Command), 반복자(Iterator), 중재자(Mediator), 메멘토(Memento), 옵저버(Observer), 상태(State), 전략(Strategy), 비지터(Visitor)

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

1. 생성 패턴

객체 생성 방식을 다루는 패턴이다.

  • 팩토리 메소드(Factory Method): 객체 생성을 서브클래스로 위임하여 캡슐화함
  • 추상 팩토리(Abstract Factory): 구체적인 클래스를 지정하지 않고 인터페이스를 통해 서로 연관되는 객체들을 그룹으로 표현함
  • 빌더(Builder): 복합 객체의 생성과 표현을 분리하여 동일한 생성 절차에서도 다른 표현 결과를 만들어낼 수 있음
  • 프로토타입(Prototype): 원본 객체를 복사함으로써 객체를 생성함
  • 싱글톤(Singleton): 어떤 클래스의 인스턴스는 하나임을 보장하고 어디서든 참조할 수 있도록 함

2. 구조 패턴

클래스나 객체들을 조합해 더 큰 구조로 만들 수 있게 해주는 패턴이다. 구조 클래스 패턴은 상속을 통해 클래스가 인터페이스를 합성하고, 구조 객체 패턴은 객체를 합성하는 방법을 정의한다.

  • 어댑터(Adapter): 클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 이용할 수 있도록 함
  • 브리지(Bridge): 구현부에서 추상층을 분리하여 각자 독립적으로 확장할 수 있게 함
  • 컴포지트(Composite): 객체들의 관계를 트리 구조로 구성하여 복합 객체와 단일 객체를 구분없이 다룸
  • 데코레이터(Decorator): 주어진 상황 및 용도에 따라 어떤 객체에 다른 객체를 덧붙이는 방식
  • 퍼사드(Facade): 서브 시스템에 있는 인터페이스 집합에 대해 하나의 통합된 인터페이스(Wrapper) 제공
  • 플라이웨이트(Flyweight): 크기가 작은 여러 개의 객체를 매번 생성하지 않고 가능한 한 공유할 수 있도록 하여 메모리를 절약함
  • 프록시(Proxy): 접근이 어려운 객체로의 접근을 제어하기 위해 객체의 Surrogate나 Placeholder를 제공

3. 행위 패턴

클래스나 객체들이 서로 상호작용하는 방법이나 어떤 태스크, 어떤 알고리즘을 어떤 객체에 할당하는 것이 좋을지를 정의하는 패턴이다. 즉, 객체나 클래스의 교류 방법에 대해 정의하는 것이다.

  • 인터프리터(Interpreter): 특정 언어의 문법 표현을 정의함
  • 템플릿 메소드(Template Method): 상위 클래스는 알고리즘의 골격만을 작성하고 구체적인 처리는 서브 클래스로 위임함
  • 책임 연쇄(Chain of Responsibility): 요청을 받는 객체를 연쇄적으로 묶어 요청을 처리하는 객체를 만날 때까지 객체 Chain을 따라 요청을 전달함
  • 커맨드(Command): 요청을 객체의 형태로 캡슐화하여 재사용하거나 취소할 수 있도록 저장함
  • 반복자(Iterator): 내부를 노출하지 않고 접근이 잦은 어떤 객체의 원소를 순차적으로 접근할 수 있는 동일한 인터페이스 제공
  • 중재자(Mediator): 한 집합에 속해있는 객체드르이 상호작용을 캡슐화하여 새로운 객체로 정의
  • 메멘토(Memento): 객체가 특정 상태로 다시 되돌아올 수 있도록 내부 상태를 실체화
  • 옵저버(Observer): 객체 상태가 변할 때 관련 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 함
  • 상태(State): 객체의 상태에 따라 동일한 동작을 다르게 처리해야할 때 사용
  • 전략(Strategy): 동일 계열의 알고리즘군을 정의하고 캡슐화하여 상호교환이 가능하도록 함
  • 비지터(Visitor): 객체의 원소에 대해 수행할 연산을 분리하여 별도의 클래스로 구성함
profile
멋진 개발자가 될테야

2개의 댓글

comment-user-thumbnail
2025년 1월 10일

정처기 공부하면서 디자인 패턴 종류 외웠던 기억이 나네요
이 중에서 중요도가 높다고 생각되는 디자인 패턴들을 위주로 추가 공부해봐도 좋을 것 같습니다
그리고 뭔가 예시 소스코드가 간단하게라도 들어가면 좋을 것 같네요!
잘 읽었습니다~

1개의 답글