Programming
디자인 패턴(Design Pattern)
두잇츄우
2025. 4. 15. 00:56
소프트웨어 생명주기 모델 프로세스: 요구사항 분석 → 설계 → 구현 → 테스트→ 유지보수 반복
이중 설계를 올바르고 효과적으로 하기 위해 디자인 패턴을 적용하는 것이 매우 좋음
- 소프트웨어 설계 방법
- 반복되는 패턴처럼 자주 나타나는 클래스 간의 관계를 맺는 방법
올바른 관계를 맺어야 하는 이유
- 클래스는 최소한의 단위 기능을 가짐
- 큰 기능은 이러한 단위 기능을 갖는 클래스들 간의 관계를 통해 개발됨
- 꼭 필요한 것들 만으로 구성된 최적화된 소프트웨어 개발이 용이
- 문제 발생 시 최소한의 코드 수정으로 유지보수가 용이
- 기존 기능에 영향을 주지 않고 새로운 기능 추가가 용이
GoF의 디자인 패턴: 클래스 간의 관계를 효과적으로 설계할 수 있는 하나의 사례로 받아들이고 이해하기
- 가장 유용하며 대표적인 디자인 패턴
- 4명의 선배 개발자 (Gang of Four)가 체계적으로 정리해 놓은 설계 방법
- 총 23개 패턴으로 구성되며 생성 패턴(5개), 구조 패턴(7개), 행위 패턴(11개)으로 분류
디자인 패턴의 장점
- 재사용성 : 반복적인 문제에 대한 일반적인 해결책을 제공하므로, 이를 재사용하여 유사한 상황에서 코드를 더 쉽게 작성할 수 있다.
- 가독성 : 일정한 구조로 정리하고 명확하게 작성하여 개발자가 코드를 이해하고 유지보수하기 쉽게 만든다.
- 유지보수성 : 코드를 쉽게 모듈화 할 수 있으며, 변경이 필요한 경우 해당 모듈만 수정하여 유지보수가 쉬워진다.
- 확장성 : 새로운 기능을 추가하거나 변경할 때 디자인 패턴을 활용하여 기존 코드를 변경하지 않고도 새로운 기능을 통합할 수 있다.
- 안정성과 신뢰성 : 수많은 사람들이 인정한 모범 사례로 검증된 솔루션을 제공한다.
생성 패턴(Creational Pattern) 5(생 빌프로 팩앱싱)
- Builder(빌더 패턴) : 복잡한 객체의 생성 과정을 단순화하고, 객체를 단계적으로 생성하며 구성하는 패턴이다.
- Prototype(프로토타입 패턴): 객체를 복제하여 새로운 객체를 생성하는 패턴으로, 기존 객체를 템플릿으로 사용하는 패턴이다.
- Factory Method(팩토리 메서드 패턴) : 객체를 생성하기 위한 인터페이스를 정의하고, 서브클래스에서 어떤 클래스의 인스턴스를 생성할지 결정하는 패턴이다.
- Abstract Factory(앱스트랙/추상 팩토리 패턴) : 관련된 객체들의 집합을 생성하는 인터페이스를 제공하며, 구체적인 팩토리 클래스를 통해 객체 생성을 추상화하는 패턴이다.
- Singleton(싱글톤 패턴) : 하나의 클래스 인스턴스를 전역에서 접근 가능하게 하면서 해당 인스턴스가 한 번만 생성되도록 보장하는 패턴이다. 한 클래스에 한 객체만 존재
구조 패턴(Structural Pattern) 7(구 브데 퍼플 프록 컴어)
- Bridge(브릿지 패턴) : 추상화와 구현을 분리하여 두 가지를 독립적으로 확장할 수 있는 패턴이다.
- Decorator(데코레이터 패턴) : 객체에 동적으로 새로운 기능을 추가하여 객체를 확장할 수 있는 패턴이다.
- Facade(퍼사드 패턴) : 서브시스템을 더 쉽게 사용할 수 있도록 단순한 인터페이스를 제공하는 패턴이다.
- Flyweight(플라이웨이트 패턴) : 공유 가능한 객체를 통해 메모리 사용을 최적화하는 패턴이다.
- Proxy(프록시 패턴) : 다른 객체에 대한 대리자(Proxy)를 제공하여 접근 제어, 지연 로딩 등을 구현하는 패턴이다.
- Composite(컴포지트 패턴) : 개별 객체와 복합 객체를 동일하게 다루어, 트리 구조의 객체를 구성하는 패턴이다.
- Adapter(어댑터 패턴) : 인터페이스 호환성을 제공하지 않는 클래스를 사용하기 위해 래퍼(Wrapper)를 제공하는 패턴이다.
행위 패턴(Behavioral Pattern) 11(행 미인이 템옵 스테 비커스트 매체)
- Mediator(미디에이터/중재자 패턴) : 객체 간의 상호 작용을 캡슐화하여, 객체 간의 직접적인 통신을 방지하는 패턴이다.
- Interpreter(인터프리터 패턴) : 언어나 문법에 대한 해석기를 제공하여, 주어진 언어로 표현된 문제를 해결하는 패턴이다.
- Iterator(이터레이터 패턴) : 컬렉션 내의 요소들에 접근하는 방법을 표준화하여 컬렉션의 내부 구조를 노출하지 않고 독립적으로 접근할 수 있는 패턴이다.
- Template Method(템플릿 메서드 패턴) : 알고리즘의 구조를 정의하면서 하위 클래스에서 각 단계의 구현을 제공하는 디자인 패턴이다.
- Observer(옵저버 패턴) : 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에 연락이 가고 자동으로 내용이 갱신되는 방법으로 일대 다의 의존성을 가진다.
- State(스테이트/상태 패턴) : 객체의 상태를 캡슐화하고, 상태 전환을 관리한다.
- Visitor(방문자 패턴) : 객체 구조를 순회하면서 다양한 연산을 수행할 수 있게 한다.
- Command(커맨드 패턴) : 요청을 객체로 캡슐화하여 요청을 매개변수화 하고, 요청을 큐에 저장하거나 로깅하고 실행을 지연시킨다.
- Strategy(스트레티지/전략 패턴) : 알고리즘을 정의하고, 실행 중에 선택할 수 있게 한다.
- Memento(메멘토 패턴) : 객체의 내부 상태를 저장하고 복원할 수 있는 기능을 제공하는 패턴이다. Undo
- Chain of Responsibility(책임 연쇄 패턴) : 요청을 보내는 객체와 이를 처리하는 객체를 분리하여, 다양한 처리자 중 하나가 요청을 처리한다. 동적으로 연결되어 있는 경우에 따라 다르게 처리될 수 있도록 연결한 디자인 패턴