이란?
- 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 일반적인 솔루션
사용 이유
- 문제 해결의 일관성 - 검증된 솔루션을 제공, 반복적인 문제를 일관되게 해결
- 코드 가독성 및 유지보수성 - 디자인 패턴 적용시 코드 구조가 명확해 짐
- 재사용성 - 여러 프로젝트에서 재사용 가능
- 확장성 - 소프트웨어 설계가 변화에 유연하게 대응
- 공통 언어 - 의사소통을 더 명확하고 간결하게 만듬
한계
- 복잡성 증가 - 잘못하면 불필요한 복잡성을 초래할 수 있음
- 학습 곡선 - 이해하고 활용하려면 경험과 학습이 필요
- 과잉 설계 - 간단한 문제에 과도하게 적용하면 비효율
- 언어 특화 기능 대체 - 일부 언어에서는 디자인 패턴이 필요없거나 자동화됨
유형 3가지
| 행동 | 객체 간의 상호작용을 최적화 | 옵저버, 상태, 전략 |
| 생성 | 객체 생성 방식을 효율적으로 관리 | 싱글톤, 팩토리 메서드, 빌더 |
| 구조 | 클래스 및 객체의 관계를 구성 | 어댑터, 데코레이터, 컴포지트 |
2025.03.14-------------------------------------------------------------------
전략 패턴
- 행동을 동적으로 변경할 수 있도록 하는 패턴
- if-else 또는 switch문으로 처리하던 로직을 행동 객체로 분리함으로써 코드 가독성과 유지보수성을 높일 수 있음
장점
- 유연성 : 기존 코드에 영향이 적고 새로운 클래스만 추가하면 됨
- 결함도 감소
- 런타임 교체
단점
- 행동마다 별도의 클래스를 만들어야 됨
- 생성자에서 어떤 행동을 사용할 것인지 결정하는 과정 필요
상태 패턴
- 객체의 상태에 따라 행동이 변하는 패턴
장점
- if-else나 switch문 없이 상태별로 클래스를 캡슐화하므로 코드 가독성이 향상
- 새로운 상태를 추가할 때 기존 코드를 거의 수정하지 않음
- 응집도가 높아지고 유지보수성이 향상
단점
- 상태가 많아질수록 클래스 파일 수 증가
- 상태 전환 로직들의 전체 흐름을 파악하고 관리 필요
템플릿 메서드
- 기본 알고리즘의 틀을 정의하고 세부적인 동작은 하위 클래스에서 구현하는 패턴
장점
- 공통 로직을 부모 클래스에 모아 중복 코드를 제거할 수 있음
- 전체 흐름은 바꾸지 않으며 일부 단계만 오버라이드하여 변형을 쉽게 만듬
- 유지보수 용이
단점
- 상속 관계로 인한 클래스 의존성 증가
- 단계가 많아질수록 복잡성 증가
- 리스코프 치환 원칙 위반 위험
2025.03.26-------------------------------------------------------------------
반복자
- 리스트, 배열 등에 저장된 요소들을 순차적으로 접근할 수 있도록 객체를 제공
- 내부 구조를 노출하지 않고도 그 안의 요소에 접근할 수 있도록 하는데 목적
장점
- 배열, 리스트, 트리 등 다양한 자료구조를 동일한 방식으로 처리할 수 있음
- 내부 구조에 의존하지 않음
- 반복자를 추가하거나 수정하기 쉬움
단점
- 불필요한 반복자 클래스를 추가하면 코드가 복잡해질 수 있음
- 추가적인 메모리 오버헤드가 발생할 수 있음
* STL에서 벡터, 맵, 리스트 등 에서 사용
빌더
- 생성 과정과 표현 방식을 분리하여 동일한 생성 절차에서 서로 다른 객체를 생성할 수 있도록한 패턴
장점
- 객체를 생성하는 절차를 단계별로 분리할 수 있음
- 코드의 유연성과 재사용성 증가
- 생성 로직과 객체 생성 책임을 나누어 담당
단점
- 간단한 생성에는 코드가 복잡해질 수 있음
- Builder, Director 등 여러 클래스가 추가로 필요
* 복잡한 UI 위젯을 생성할 때 사용, 무기,스킬, 옷 등 을 빌더로 생성
2025.03.28-------------------------------------------------------------------
팩토리
- 객체 생성 로직을 별도의 팩토리 클래스로 분리하여 객체를 효율적으로 생성할 수 있도록 하는 패턴
장점
- 객체 생성이 팩토리에 위임되므로 클라이언트 코드가 간단해짐
- 객체를 추가할 때 코드 수정 없이 팩토리를 확장하여 기능 추가
- 런타임에 객체의 생성 방식을 변경할 수 있음
단점
- 팩토리 메서드나 추상 팩토리를 사용하면 클래스와 인터페이스 계층이 복잡해 질 수 있음
- 팩토리에서 로직을 관리하는 만큼 코드가 장황해 질 수 있음
* 객체 롤링, AI 컨트롤러, 나이아가라 이펙트 생성 등에서 자주 사
어댑터
- 서로 호환되지 않는 인터페이스를 가진 객체들이 함께 동작할 수 있도록 중간 역할을 하는 패턴
장점
- 기존 코드를 수정하지 않고도 새로운 인터페이스와 함께 사용할 수 있음
- 어댑터의 코드를 재활용할 수 있음
- 여러 어댑터 객체를 동적으로 교체할 수 있음
단점
- 추가적인 어댑터 클래스를 설계해야 하므로 코드 구조가 더 복잡해질 수 있음
- 클래스 어댑터는 다중 상속을 사용해야 하므로 제한된 언어는 객체 어댑터 방식을 사용
* 오래된 코드와의 린터페이스 차이를 해결 / 외부 라이브러리를 사용
프록시
- 대리 객체를 사용하여 다른 객체에 대한 접근을 제어하거나 기능을 추가하는 패턴
- 원본 객체롸 같은 인터페이스를 구현하여 클라이언트가 프록시를 통해 원본 객체에 접근
유형
- 가상 프록시
- 원격 프록시
- 보호 프록시
- 스마트 프록시
장점
- 실제 객체 생성을 지연하여 메모리,CPU 사용량을 절감할 수 있음
- 사용자나 상황에 따라 객체 접근을 제한하거나 권한을 부여할 수 있음
- 객체 호출시 추가적인 부가 작업을 수행할 수 있음
단점
- 프록시 객체가 중간 역할을 하므로 응답 시간이 지연될 수 있음
- 클래스 계츨이 더 복잡해질 수 있음
* 무거운 GUI 요소(대용량 이미지, 영상) 로딩 시 가상 프록시 사용, 데이터베이스 연결
'C++' 카테고리의 다른 글
| GAS 첫 공부(쳇 GPT) - 1 (0) | 2025.05.16 |
|---|---|
| 클린코드 (0) | 2025.03.27 |
| Overlap 매개변수 (0) | 2025.02.12 |
| STL 반복자(연산) (0) | 2025.01.27 |
| 포인터와 참조 / 스마트 포인터 (0) | 2025.01.20 |