프로그래밍 공부/IT 지식
디자인 패턴 (Design Pattern, GoF)
내 머리속 어딘가
2025. 4. 7. 16:59
반응형
📌디자인 패턴의 정의
- 소프트웨어 개발 과정에서 반복적으로 자주 발생하는 문제에 대한 해결방안을 기록한 것이다.
- 객체지향의 4대 특성(캡슐화, 상속, 추상화, 다형성)과 SOLID 설계원칙을 기반으로 구현되어 있다.
📌디자인 패턴의 장점
1. 재사용성
- 반복적인 문제에 대한 일반적인 해결책을 제공하므로, 이를 재사용하여 유사한 상황에서 코드를 더 쉽게 작성할 수 있다.
2. 가독성
- 일정한 구조로 정리하고 명확하게 작성하여, 개발자가 코드를 이해하고 유지보수하기 쉽게 만든다.
3. 유지보수성
- 코드를 쉽게 모듈화 할 수 있으며, 변경이 필요한 경우 해당 모듈만 수정하여 유지보수가 쉬워진다
4. 확장성
- 새로운 기능을 추가하거나 변경할 때, 디자인 패턴을 활용하여 기존 코드를 변경하지 않고도 새로운 기능을 동합하 수 있다.
5. 안정성과 신뢰성
- 수많은 사람들이 인정함 모범 사례로 검증된 솔루션을 제공한다.
💡
일반적으로 우리가 개발을 하면서만나는 문제가 지구상에서 유일한 문제일 확률은 거의 없다. 이미 수많은 사람들이 부딪힘 문제가 대부분이다. 이러한 문제들 중에서 자주 발생하는 문제에 대해서 전문가들이 해결책을 만들어서 정리해놓은 것이 "디자인 패턴" 인 것이다. 하지만 모든 문제에 디자인 패턴을 적용하려는 것은 바람직하지 않다. 디자인 패턴보다 중요한 것은 코드베이스의 간결성이다. 즉 디자인 패턴이 굳이 필요가 없을 것 같은 부분은 적용하지 않는 것이 좋다.
📌GoF(Gang of Four) 디자인 패턴
- 1995년 GoF(Gang of Four)라고 불리는 4명의 유명한 개발자들이 처음으로 디자인패턴을 구체화하였다.
- GoF 디자인 패턴은 소프트웨어 공학에서가장 많이 사용되는 디자인 패턴이다.
- GoF 디자인 패턴은 해결하려는 문제의 목적에 따라 생성, 구조, 행위 3가지로 분류된다.
📌생성 패턴 (Creational Pattern)
💡
: 객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어주는 패턴이다. 객체의 생성과 참조 과정을 캡슐화하여, 객체가 생성되거나 변경되어도 프로그램의 구조에 영향을 크게 받지 않도록 해 프로그램의 유연성을 더해준다.
Singleton | 싱글톤 패턴
- 하나의 클래스에 대해 하나의 인스턴스만 생성하며, 생성한 인스턴스는 전역에서 접근을 제공하는 패턴이다. 디자인 패턴에서가장 많이 알려진 패턴이다.
Factory Method | 팩토리 메서드 패턴
- 객체를 생성하기 위한 인터페이스를 정의한다. 어떤 클래스의 인스턴스를 생성할지는 서브클래스에서 결정하는 패턴이다.
Abstract Factory | 추상 팩토리 패턴
- 관련된 객체들의 집합을 생성하는 인터페이스를 제공하며, 구체적인 클래스는 서브클래스에서 결정하도록 하는 패턴이다. 팩토리 메서드 패턴과 가장 눈에 띄는 차이는 생성하려는 객체가 복수라는 점이다.
Builder | 빌더 패턴
- 복합 객체의 생성과정과 표현과정을 분리시켜, 동일한 생성과정에서 다양한 표현을 생성할 수 있는 패턴이다. "일정한 순서로 동작하는 과정을 만드는 것"이 생성 과정이고, 그 각각의 과정에 '어떤 값을 넣을지'를 결정하는 것이 표현 과정이다.
Prototype | 프로토타입 패턴, 원형 패턴
- 객체를 복제하여 새로운 객체를 생성하는 패턴으로, 하나의 객체를 템플릿으로 사용하는 패턴이다.
📌구조 패턴 (Structural Pattern)
💡
: 클래스나 객체들을 조합하여 더 큰 구조로 만들 수 있게 해주는 패턴이다.
Adapter | 어댑터 패턴, 적응자 패턴
- 인터페이스 호환성을 제공하지 않는 클래스를 사용하기 위해 래퍼(Wrapper)를 제공하는 패턴이다.
- 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아서 같이 쓸 수 없었던 클래스들을 함께 사용할 수 있게 도와준다.
** 래퍼(Wrapper) : 어떤 기존 클래스(Adaptee)를 변경하지 않고 그대로 사용하면서, 그 클래스의 기능을 다른 방식(원하는 인터페이스)에 맞게 감싸서 제공하는 클래스
Bridge | 브릿지 패턴
- 구현와 추상을 분리하여 각자 독립적으로 변형 및 확장 할 수 있도록 하는 패턴이다.
- 여기에서 “구현”은 실제로 작업을 구현하는 부분이라고 생각하면 되고, “추상”은 사용자가 원하는 동작을 추상적으로 표현하는 부분(인터페이스)라고 보면 된다. 이 둘을 연결해주는 구조를 Bridge(브릿지) 패턴이라고 한다.
Composite | 컴포지트 패턴
- 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한다. 컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다.
- 상위에 추상 클래스 혹은 인터페이스를 두고 이를 상속받는 개별 객체, 복합 객체를 만들어서 상위에서 정의된 메서드를 사용하는 방식이 있다.
Decorator | 데코레이터 패턴
- 객체에 동적으로 새로운 기능을 추가하여 객체를 확장할 수 있는 패턴이다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.
- 서브클래스를 활용하면 각각의 클래스를 만들어야 하지만, 데코레이터를 활용하면 각각의 조합을 만들면 되는 것이다.
Facade | 퍼사드 패턴
- 서브시스템을 더 쉽게 사용할 수 있도록 단순한 인터페이스를 제공하는 패턴이다.
- 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어준다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있다.
Flyweight | 플라이웨이트 패턴
- 인스턴스를 필요할 때마다 매번 새로 생성하는 것이 아니라, 가능하면 공유를 해서 사용함으로써 메모리를 절약하는 패턴이다.
- 플라이에이트 => 파리 무게 => 가볍다 => 용량이 => 메모리 절약 => 가능한 한 객체를 공유해서 사용함으로써.
Proxy | 프록시 패턴
- 특정 객체로부터의 접근을 제어하는 대리자(Proxy, 특정 객체를 대변하는 객체)을 제공한다. 대리자는 접근제어, 지연로딩, 리소스 절약 등의 동작을 추가적으로 수행할 수 있다.
📌행위 패턴 (Behavioral Pattern)
💡
: 클래스와 객체들이 상호작용하는 방법과 역할을 분담하는 방법을 다루는 패턴으로, 하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 결합도를 최소화할 수 있도록 도와주는 패턴이다.
Observer | 옵저버 패턴
- 객체 간의 일대다 종속관계를 정의하여, 한 객체의 상태가 변경되면 의존관계에 있는 모든 객체들이 통지받고 자동으로 갱신될 수 있게 만드는 패턴이다.
Strategy | 전략 패턴
- 동일 계열의 알고리즘들을 정의하고, 각각 캡슐화하며 이들을 상호교환 가능하도록 만드는 것이다. 알고리즘을 사용하는 사용자로부터 독립적으로 알고리즘이 변경될 수 있도록 하는 패턴이다.
Command | 커맨드 패턴
- 요청을 객체로 캡슐화한다. 요청을 매개변수화 하거나, 저장, 실행취소 등 다양한 처리가 가능하며, 큐에 저장하여 실행을 지연시키거나, 로그를 남기는 등의 확장이 쉽다.
State | 상태 패턴
- 객체의 상태를 캡슐화하고, 상태의 전환을 관리한다. 상태 패턴을 사용하면 객체의 내부 상태가 바뀜에 따라 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.
Chain of Responsibility | 책임 연쇄 패턴
- 요청을 처리할 수 있는 객체들을 체인처럼 연결해두고, 요청을 그 체인에 따라 전달하면서 적절한 객체가 처리하도록 행동하는 패턴이다. 요청을 보내는 클라이언트는 어떤 객체가 요청을 처리하는지 알 필요가 없다. 각 객체는 자신이 처리할 수 없으면 다음 객체에게 요청을 넘긴다.
Visitor | 방문자 패턴
- 객체 구조를 수정하지 않고도 새로운 동작을 추가할 수 있게 해주는 행동 패턴이다. 객체의 구조와 그 구조에서 수행될 작업을 분리해서 구현하는 것이다. 따라서 객체의 클래스를 변경하지 않고 새로운 연산을 재정의 하는 것도 가능하다.
Interpreter | 인터프리터 패턴
- 언어나 문법에 대한 해석기를 제공하여, 주어진 언어로 표현된 문제를 해결하는 패턴이다.
Memento | 메멘토 패턴
- 객체의 내부 상태를 저장하고 복원할 수있는 기능을 제공하는 패턴이다. 객체의 이전 상태를 객체로 생성해놓고 로깅하거나 나중에 이전 상태로 되돌릴 수 있게 하는 것이다.
Mediator | 중재자 패턴
- 객체 간의 복잡한 통신을 캡슐화하여, 중재자 객체를 통해 간접적으로 처리하게 함으로써, 객체간의 결합도를 낮추는 디자인 패턴이다.
Template Method | 템플릿 메서드 패턴
- 알고리즘의 골격을 정의하는 패턴이다. 템플릿 메서드를 사용하면 알고리즘 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있다.
Iterator | 이터레이터 패턴, 반복자 패턴
- 내부 표현부를 노출하지 않고 어떤 객체 집합의 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴이다.
📑참조 페이지 :
- https://seohee-ha.tistory.com/m/167
- https://oobwrite.com/entry/디자인-패턴Design-Pattern-총정리-23가지-디자인-패턴-정의-종류-장단점
- https://ittrue.tistory.com/m/550
- https://namu.wiki/w/디자인%20패턴
- https://powerdev.tistory.com/69
- https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823
반응형