[Design Pattern] GoF 디자인 패턴

Jayven·2024년 4월 22일
3

GoF 디자인패턴

목록 보기
1/1

안녕하세요 제이븐입니다 이번에는 디자인 패턴에 대해서 포스팅해보겠습니다!

디자인 패턴


디자인 패턴이란?

디자인 패턴은 객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 해결하기 위해 사용되는 패턴입니다.
5개의 생성 패턴, 7개의 구조 패턴, 11개의 행위 패턴 합쳐서 총 23개의 패턴으로 구성되어있습니다.


디자인 패턴의 역사

디자인 패턴은 1994년 GoF(Gang of Four)라고 불리는 Erich Gamma(에릭 감마), Richard Helm (리처드 헬름), Ralph Johnson (랄프 존슨), John Vlissides (존 블리시디스)이라는 4명에 의해 정리되었습니다.
이 넷은 디자인 패턴:재사용성을 지닌 객체지향 소프트웨어의 핵심 요소라는 책을 발간하였고, 디자인 패턴의 개념을 프로그래밍에 적용하였습니다.
이 책에서 다양한 객체 지향 디자인 관련 문제를 해결하는 23가지 패턴을 소개합니다


디자인 패턴을 학습해야 되는 이유

  • 일반적인 문제에 대해 시도되고 검증된 패턴들이 있고 객체 지향 디자인 원칙들을 사용해 많은 종류의 문제를 해결하는 방법을 배울 수 있습니다.
  • 팀원들이 효율적으로 의사소통하는데 사용할 수 있는 공통 언어를 제공합니다.
    • 팀원 간에 소통에서 서로 디자인패턴에 대해서 이해가 되어있다는 가정하에 '싱글턴 패턴으로 구현해주세요' 혹은 '싱글턴 패턴으로 구현되어있어요'라는 공통적인 언어로 소통이 가능합니다.
    • 또는 파일명이 OOOBuilder 이런식으로 되어있다면 "아 빌더패턴을 사용해서 구현 했구나"라고 빠르게 알아 볼 수 있습니다.

저는 개인적으로 공부를 시작하면서 와 닿았던 부분은 2번의 이유가 더 컸던 것 같습니다.


주의해야할 점

"망치를 든 사람에게 모든 문제가 못으로 보인다" 라는 말이 있습니다.

다자인 패턴을 익히고 패턴이 필요하지 않고 간단하게 해결되는 문제조차 패턴을 사용하려고 한다면 그건 오히려 독이 될 수도 있습니다.
언제나 상황에 맞게 적절히 적용하는게 중요하고 매몰되지 않았으면 좋겠습니다.


패턴의 종류


생성 패턴

기존 코드의 유연성과 재사용을 증가시키는 객체를 생성하는 다양한 방법을 제공합니다.

생성 패턴요약 설명
팩토리 메서드(Factory Method)객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
추상 팩토리(Abstract Factory)구체적인 클래스에 의존하지 않고 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
빌더(Builder)복잡한 객체들을 단계별로 생성할 수 있도록 하는 패턴
프로토타입(Prototype)클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 패턴
싱글턴(Singleton)클래스의 인스턴스가 하나만 존재하도록 보장하는 패턴

구조 패턴

구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명합니다.

구조 패턴요약 설명
어댑터(Adapter)호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 패턴
브릿지(Bridge)클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 패턴
복합체(Composite)객체들을 트리 구조로 구성한 후, 복합객체와 단일객체를 구분 없이 다루는 패턴
데코레이터(Decorator)객체들을 새로운 행동들을 포함한 특수 래퍼 객체들 내에 넣어서 위 행동들을 해당 객체들에 연결시키는 패턴
파사드(Facade)서브 시스템 집합에 대해 하나의 통합된 인터페이스를 제공하는 패턴
플라이웨이트(Flyweight)각 객체에 데이터를 유지하는 대신 여러 객체들의 상태의 공통 부분을 공유하여 RAM에 더 많은 객체를 포함하게 하는 패턴
프록시(Proxy)원본 객체를 대신하여 처리하게 함으로써 흐름을 제어하는 패턴

행동 패턴

객체 간의 효과적인 의사소통과 책임 할당을 처리합니다.

행동 패턴요약 설명
책임 연쇄(Chain of Responsibility)핸들러의 체인을 따라 요청을 전달하는 패턴. 각 핸들러는 요청을 받으면 처리할 것인지 다음 체인의 핸들러로 전달할지를 결정합니다.
커맨드(Command)요청을 객체 형태로 캡슐화하는 패턴
인터프리터(Interpreter)특정 언어를 구현하는 패턴
반복자(Iterator)객체의 기본 표현을 노출하지 않고 원소를 순서대로 순회할 수 있게하는 패턴
중재자(Mediator)객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 패턴. 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 통신하게 합니다.
메멘토(Memento)객체의 구현 세부 사항을 공개하지 않으면서 해당 객체의 이전 상태를 저장하고 복원할 수 있게 해주는 패턴.
옵저버(Observer)객체에 상태 변화를 관찰하고, 상태 변화에 따라 관찰하고 있는 객체들이 이를 알 수 있게 만드는 구독 매커니즘의 패턴
상태(State)객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 패턴
전략(Strategy)알고리즘들의 패밀리를 정의하고, 캡슐화 하여 객체를 상호 교환할 수 있게하는 패턴
템플릿 메서드(Template Method)상위 클래스에서 알고리즘의 골격을 정의하고 구체적인 처리는 서브클래스에 위임해서 처리하는 패턴
비지터(Visitor)알고리즘들이 작동하는 객체들로부터 분리할 수 있도록 하는 패턴

마무리


GoF 디자인패턴에 대해서 포스팅 했습니다. 23개나 되는 디자인 패턴을 언제 다 외우고 적용하나에 대한 고민을 처음에 많이 했습니다.

처음에 헤드퍼스트 디자인 패턴 책을 일고 부푼 마음에 디자인 패턴으로 고칠 문제가 어디있나 찾아다녔었는데 손에 망치가 쥐어지니 모든 것을 못으로 보려고 했던 것 같습니다

개인적으로는 디자인 패턴을 쭉 한번 익히고 언제 어떻게 쓰면 좋은지 정도만 알고 있다가 필요한 시점에 적절하게 찾아서 적용하는게 좋을 것 같다고 느꼈습니다

그리고 자주 쓰이는 패턴은 익숙해지고 많이 쓰다보면서 자연스럽게 외워지는 경우도 있는 것 같습니다.

질문과 피드백은 언제나 감사합니다 :)

profile
iOS 개발자

2개의 댓글

comment-user-thumbnail
2024년 4월 22일

rxswift를 처음 사용했을때도 모든걸 rx스럽게 사용하려고 했던게 생각나네요..ㅎㅎ
항상 좋은 글 잘 읽고 있습니다.

1개의 답글