기술 노트

[Study] 디자인 패턴(Design Pattern)

juble 2024. 9. 23. 22:08

 

1. 디자인 패턴

자주 사용하는 설계 형태를 정형화해서 이를 유형별로 설계 템플릿을 만들어둔 것으로, 소프트웨어 개발 중 나타나는 과제를 해결하기 위한 방법 중 한가지이다.

다시 말헤, 모듈 간의 관계 및 인터페이스를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제를 의미한다.

* 패턴 : 다양한 응용 소프트웨어 시스템들을 개발할 때 서로 간에 공통되는 설계 문제가 존재하는데, 각 해결책 사이에도 공통점이 있으며 이러한 유사점을 패턴이라고 한다.

- 개발자 간 원활한 의사소통, 소프트웨어 구조 파악 용이, 설계 변경에 대한 유연한 대처, 개발의 효율성, 유지보수성, 운용성 등 소프트웨어 품질 향상에 도움을 준다.

- 객체지향 프로그래밍 설계 시 유사한 상황에서 구조적인 문제를 해결할 수 있도록 방안을 제공해주며, GoF(Gang of Four) 분류가 가장 많이 사용된다.

 


2. 디자인 패턴을 사용할 때의 장점, 단점

 
장점
  • 개발자 간의 원활한 의사소통을 지원한다.
  • 소프트웨어 구조 파악이 쉽다.
  • 재사용을 통한 개발 시간을 단축할 수 있다.
  • 설계 변경 요청에 유연한 대처를 할 수 있다.
단점
  • 객체지향 설계/구현 위주로 사용된다.
  • 초기 투자 비용이 부담된다.

 


3. 디자인 패턴의 구성요소

[필수요소 4가지]

  • 패턴의 이름 : 패턴을 부를 때 사용하는 이름과 패턴의 유형
  • 문제 및 배경 : 패턴이 사용되는 분야 또는 배경, 해결하는 문제를 의미
  • 해법 : 패턴을 이루는 요소들, 관계, 협동 과정
  • 결과 : 패턴을 사용하면 얻게 되는 이점이나 영향

[추가 요소]

  • 알려진 사례 : 간단한 적용 사례
  • 샘플 코드 : 패턴이 적용된 원시 코드
  • 원리, 정당성, 근거

4. GoF(Gang of Four) 디자인 패턴

객체지향 설계 단계 중 재사용에 관한 유용한 설계를 디자인 패턴화 하였다.

 

[생성 패턴]

  • 객체를 생성하는 것과 관련된 패턴으로, 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하도록 만들어주어 유연성을 높일 수 있고 코드를 유지하기 쉬운 편이다.
  • 객체의 생성과 참조 과정을 추상화함으로써 시스템을 개발할 때 부담을 덜어준다.
  • 클래스나 객체의 생성과 참조과정을 정의하는 패턴
Factory
Method
  • 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식
  • 즉, 상위 클래스에서는 인스턴스를 만드는 방법만 결정하고, 구체적인 클래스 이름은 뒤로 미룬다.
  • 객체를 생성하는 인터페이스와 실제 객체를 생성하는 클래스 분리 가능
  • Virtual-Constructor(가상 생성자) 패턴이라도고 한다.
Singleton
  • '단독 개체', '독신자', '정확히 하나의 요소만 갖는 집합' 등의 의미
  • 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 한다.
  • 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
  • 불필요한 메모리 낭비를 최소화할 수 있음
Prototype
  • prototype을 먼저 생성하고 인스턴스를 복제하여 사용하는 구조
  • 일반적인 방법으로 객체 생성
  • 비용이 많이 소요되는 경우 주로 사용
  • 객체를 생성할 때 갖추어야 할 기본 형태가 있을 때 사용
Builder
  • 복잡한 인스턴스를 조립하여 만드는 구조
  • 복합 객체를 생성할 때 객체를 생성하는 방법(과정)과 객체를 구현(표현)하는 방법을 분리
      →  동일한 객체 생성에서도 서로 다른 결과를 만들어 낼 수 있음
  • 작게 분리된 인스턴스를 조립하듯 조합하여 객체를 생성
Abstract
Factory
  • 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
  • 관련된 서브 클래스를 그룹지어 한 번에 교체할 수 있음

 

[구조 패턴]

  • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • 복잡한 형태의 구조를 갖는 시스템을 개발하기 쉽게 만들어주는 패턴
  • 새로운 기능을 가진 복합 객체를 효과적으로 작성할 수 있다.
    • ex) 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴. 프로그램 내의 자료구조나 인터페이스 구조 등을 설계하는데 많이 활용
Composite
  • '합성의', '합성물', '혼합 양식'
  • 사용자가 단일 객체와 복합 객체 모두 동일하게(구분 없이) 다루도록 한 것
  • 일반적인 트리 구조, 디렉토리와 파일을 동일시해서 재귀적인 구조를 만들기 위한 설계 패턴
Adapter
  • 기존에 구현되어 있는 클래스에 기능 발생 시 기존 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할
  • 클래스 adapter 패턴 : 상속을 이용한 어댑터 패턴
  • 인스턴스 adapter 패턴 : 위임을 이용한 어댑터 패턴
Bridge
  • 기능 클래스 계층과 구현 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 각자 독깁적으로 변형할 수 있도록 해주는 패턴
Decorator
  • 객체 간의 결합을 통해 능동적으로 기능들을 확장할 수 있는 패턴
  • 임의의 객체에 부가적인 기능을 추가하기 위해 다른 객체들을 덧붙이는 방식으로 구현
Facade
  • '건물의 압쪽 정면(전면)'
  • 복잡한 서브 클래스들을 피해 더 상위에 인터페이스를 구성함으로써 서브 클래스들의 기능을 간편하게 사용할 수 있는 패턴, 단순한 창구 역할
  • 서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체가 필요함
  • 클래스 간 의존 관계가 줄어들고 복잡성이 낮아지는 효과
Flyweight
  • 인스턴스가 필요할 때마다 매번 생성하는 것이 아니고 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴
  • 다수의 유사 객체를 생성하거나 조작할 때 유용하게 사용
Proxy
  • '대리인'이라는 뜻으로, 뭔가를 대신해서 처리하는 것
  • 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할을 수행하는 패턴
  • 네트워크 연결, 메모리의 대용량 객체로의 접근 등에 주로 이용

 

[행위 패턴]

  • 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의한다.
  • 메세지 교환과 관련된 것으로, 객체 간의 행위나 알고리즘 등과 관련된 패턴을 말한다.
Chain of Responsibility
(책임 연쇄)
  • 요청을 처리할 수 있는 객체가 둘 이상 존재하여 한 객체가 처리하지 못하면 다음 객체로 넘어가는 형태의 패턴
  • 요청을 처리할 수 있는 각 객체들이 고리(chain)로 묶여 있어 요청이 해결될 때까지 고리를 따라 책임이 넘어감
Iterator
(반복자)
  • 자료 구조와 같이 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴
  • 내부 표현 방법의 노출 없이 순차적인 접근이 가능함
Command
(명령)
  • 요청을 객체의 형태로 캡슐화하여 재이용하거나 취소할 수 있도록 요청에 필요한 정보를 저장하거나 로그에 남기는 패턴
  • 요청에 사용되는 각종 명령어들을 추상 클래스와 구체 클래스로 분리하여 단순화함
Interpreter
(해석자)
  • 언어의 문법 표현을 정의하는 패턴
  • SQL 이나 통신 프로토콜과 같은 것을 개발할 때 문법 규칙을 클래스화한 구조
Memento
(기록)
  • 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴
  • Ctrl+Z와 같은 되돌리기 기능을 개발할 때 주로 이용
Observer
(감시자)
  • 한 객체의 상태가 변화하면 객체에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하는 패턴
  • 일대다의 의존성을 정의
  • 주로 분산된 시스템 간에 이벤트를 생성·발생(publish)하고, 이를 수신(subscibe)해야 할 때 이용
State
(상태)
  • 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용하는 패턴
  • 객체 상태를 캡슐화하여 클래스화(state 인터페이스)함으로써 이를 참조하는 방식으로 처리함
  • 변경 시 원시 코드의 수정을 최소화 할 수 있고, 유지보수를 쉽게 할 수 있음
Strategy
(전략)
  • 동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴
  • 클라이언트는 독립적으로 원하는 알고리즘을 선택하여 사용할 수 있으며, 클라이언트에 영향 없이 알고리즘의 변경이 가능함
  • 즉, 클라이언트에게 알고리즘이 사용하는 데이터나 그 구조를 숨겨주는 역할을 한다.
Visitor
(방문자)
  • 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도의 클래스로 구성하는 패턴
  • 분리된 처리 기능은 각 클래스를 방문(visit)하여 수행함
  • 객체의 구조는 변경하지 않으면서 기능만 따로 추가하거나 확장할 때 많이 사용
Template Method
  • 상위 클래스에서 골격을 정의하고, 하위 클래스에서 세부 처리를 구체화하는 구조의 패턴
  • 유사한 서브 클래스를 묶어 공통된 내용을 상위 클래스에서 정의함으로써 코드의 양을 줄이고 유지보수를 용이하게 해줌
Mediator
(중재자)
  • 수많은 객체들 간의 복잡한 상호작용(interface)을 캡슐화 하여 객체로 정의하는 패턴
  • 객체 간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성하게 해줌
  • 객체 사이의 의존성을 줄여 결합도를 감소시킬 수 있음

 


5. 디자인 패턴 vs 아키텍처 패턴

  • 아키텍처 패턴이 상위 설계에 이용된다.
  • 아키텍처 패턴 : 시스템 전체 구조를 설계하기 위한 참조 모델
  • 디자인 패턴 : 서브 시스템 내 컴포넌트와 그들 간의 관계를 구성하기 위한 참조모델

https://blog.naver.com/ju_ble/223444300291

네이버 블로그에  2024. 5. 12. 17:18 작성했던 글을 티스토리에 보기 편하게 옮김 !

 

[Study] 디자인 패턴(Design Pattern)

1. 디자인 패턴 자주 사용하는 설계 형태를 정형화해서 이를 유형별로 설계 템플릿을 만들어둔 것으로, 소...

blog.naver.com

 

728x90
반응형