정처기 실기 시험을 위해 디자인 패턴의 종류와 특징을 정리해두려고 한다. (시험용 암기..ㅎㅎ)
생성 패턴
객체 생성과 관련한 패턴
1. Abstract Factory(추상 팩토리)
- 서로 관련된 객체들의 패밀리를 생성하기 위해 인터페이스를 제공한다.
- 구체적인 클래스를 명시하지 않고도 객체들을 생성할 수 있다.
- 클라이언트는 생성된 객체를 인터페이스를 통해 사용한다.
2. Builder(빌더)
- 복잡한 객체의 생성 과정을 여러 단계로 나누어 처리한다.
- 최종적으로 다양한 표현을 갖는 객체를 생성할 수 있도록 한다.
- 객체의 생성이 복잡할 때 사용되며, 코드의 유지보수성과 확장성을 향상시키는 데 유용하다.
3. Factory Method(팩토리 메서드)
- 객체 생성을 처리하는 인터페이스를 제공하고, 실제 객체의 생성은 서브클래스가 결정하도록 위임한다.
- 객체 생성에 대한 의존성을 줄이고, 확장성과 유연성을 향상시킬 수 있다.
- 객체를 생성하는 처리를 파생 클래스로 분리하여 처리하도록 캡슐화한다.
- Virtual-Contructor 패턴이라고도 한다.
4. Prototype(프로토타입)
- 기존 객체를 복제함으로써 새로운 객체를 생성한다.
- prototype을 먼저 생성하고 인스턴스를 복제하여 사용하는 구조이다.
5. Singleton(싱글톤)
- 객체의 인스턴스가 오직 하나만 생성되도록 보장한다.
- 전역적으로 접근 가능한 단일 인스턴스를 제공한다.
구조 패턴
객체를 조합해서 더 큰 구조를 만드는 패턴
1. Adapter(어댑터)
- 호환되지 않는 인터페이스를 가진 클래스들이 함께 작동할 수 있도록 한다.
- 클라이언트에서 요구하는 다른 인터페이스로 변환한다.
- 한 클래스의 인터페이스를 클라이언트에서 필요로 하는 인터페이스로 변환해준다.
- 두 인터페이스 간의 호환성 문제를 해결하여, 코드 변경없이 기존 클래스를 사용할 수 있다.
2. Bridge(브릿지)
- 추상화와 구현을 분리하여 두 계층이 독립적으로 변화할 수 있게 한다.
- 두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있다.
3. Composite(컴포지트)
- 객체를 트리 구조로 구성하여 개별 객체와 객체의 조합을 클라이언트에서 동일하게 처리할 수 있도록 한다.
4. Decorator(데코레이터)
- 객체에 동적으로 새로운 기능을 추가한다.
- 코드의 수정 없이 객체의 기능을 확장할 수 있는 방법을 제공한다.
- 상속을 사용하지 않고도 객체의 기능을 동적으로 확장할 수 있도록 해준다.
5. Facade(퍼사드)
- 복잡한 시스템을 단순화한다.
- 클라이언트는 단일 인터페이스만 사용하고 내부 구현은 숨긴다.
- 서브시스템 사이의 의사소통 및 종속성을 최소화하기 위하여 단순화된 하나의 인터페이스를 제공한다.
6. Flyweight(플라이웨이트)
- 객체를 공유하여 메모리를 절약한다.
- 객체 생성 시간이 오래 걸리는 경우, 또는 객체가 많이 생성될 가능성이 있는 경우에 사용된다.
7. Proxy(프록시)
- 다른 객체에 대한 접근 제어/중개하는 디자인 패턴이다.
- 특정 객체의 대리자나 대변인 역할을 하는 프록시 객체를 제공한다.
행위 패턴
알고리즘이나 책임 분배에 관련된 패턴
1. Chain of Responsibility(책임 연쇄)
- 요청을 처리하는 객체들을 체인 형태로 연결하여 요청을 순서대로 전달한다.
- 각 객체는 요청을 처리할 수 있는지 판단하고, 처리할 수 없으면 다음 객체에 전달한다.
2. Command(커맨드)
- 요청을 객체로 캡슐화하여 요청자와 처리자를 분리한다.
- 명령, 요청자, 클라이언트, 수신자로 구분된다.
3. Interpreter(인터프리터)
- 문법 규칙을 기반으로 문장을 해석한다.
- 프로그래밍 언어의 문법을 해석하는 데 사용된다.
4. Iterator(반복자)
- 컬렉션의 요소들을 순차적으로 접근하고 처리할 수 있도록 한다.
- 집합 객체의 요소들에 대해 순서대로 접근하는 방법을 제공한다.
- 배열, 배열리스트, 해시 테이블과 같은 객체를 처리하는 데 사용하는 패턴이다.
- 서로 다른 집합 객체 구조에 대해 동일한 방법으로 순회할 수 있다.
5. Mediator(중재자)
- 여러 객체 간의 상호 작용을 중앙 집중식으로 관리한다.
- 객체 간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성한다.
- 여러 객체들이 서로 메시지를 주고받는 상호 작용을 특정 객체 안에 캡슐화하여 서로의 존재를 모르는 상태에서도 메시지를 주고받으며 협력할 수 있도록 한다.
6. Memento(메멘토)
- 객체의 이전 상태를 저장하고 복원할 수 있도록 한다.
7. Observer(옵저버)
- 객체의 상태 변화를 관찰하고 싶은 다른 객체들에게 자동으로 알린다.
- 일대다의 객체 의존 관계를 정의하며, 한 객체의 상태가 변화되었을 때, 의존 관계에 있는 다른 객체들에게 자동적으로 변화를 통지한다.
8. State(상태)
- 객체의 내부 상태에 따라 객체의 동작을 변경한다.
- 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴이다.
9. Strategy(전략)
- 알고리즘을 객체로 캡슐화하고, 알고리즘을 선택하고 실행하는 방법을 제공한다.
- GPS 신호를 수신하는 경우와 수신하지 못하는 경우에 따라 차량의 위치를 구하는 다른 알고리즘을 선택하고자 할 때 가장 적합하다.
10. Template Method(템플릿 메서드)
- 알고리즘의 핵심적인 골격은 그대로 유지하면서, 일부 단계는 하위 클래스에서 구체적으로 구현한다.
11. Visitor(방문자)
- 객체 구조를 변경하지 않고 객체에 새로운 연산을 추가한다.
출처
흥달쌤 디자인패턴 강의
'Study > Computer Science' 카테고리의 다른 글
[Database] 조인(JOIN) 종류 (0) | 2024.08.20 |
---|---|
[운영체제] 프로세스 스케줄링 (0) | 2024.07.26 |
[자료구조] 시간 복잡도, 공간 복잡도 (0) | 2024.07.18 |
[네트워크] 서브넷 계산 (0) | 2024.07.12 |
[소프트웨어 공학] 모듈 구현 - 결합도와 응집도 (0) | 2024.07.01 |