디자인 패턴 소개
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 90번째.
디자인 패턴은 소프트웨어 설계에서 발생하는 일반적인 문제를 해결하기 위해 검증된 재사용 가능한 솔루션입니다. 그대로 복사해서 사용하는 코드는 아닙니다. 특정 문제를 우아하게 해결할 수 있도록 클래스와 객체를 구성하는 방법을 설명하는 템플릿 또는 설계도입니다.
이 개념은 1994년에 23가지 기본 패턴을 정리한 책을 출간한 “Gang of Four”(GoF)에 의해 널리 알려졌습니다. 이러한 패턴은 일반적으로 세 가지 범주로 나뉩니다:
| 범주 | 목적 | 예시 |
|---|---|---|
| 생성 | 객체 생성 메커니즘 | 싱글턴, 팩토리, 빌더 |
| 구조 | 클래스와 객체의 구성 | 어댑터, 데코레이터, 컴포지트 |
| 행동 | 객체 간 상호작용 및 책임 | 옵서버, 전략, 커맨드 |
왜 디자인 패턴을 배워야 할까요? 디자인 패턴은 개발자들 사이에서 공통된 어휘를 제공합니다. “여기서는 Factory를 사용하세요”라고 말하면 복잡한 아이디어를 즉시 전달할 수 있습니다. 또한 해결책을 처음부터 다시 만들지 않도록 도와주며, 코드를 더욱 유연하고 유지 관리하기 쉽게 만들어 줍니다.
C++에서 디자인 패턴은 이미 배운 OOP 기능인 상속, 다형성, 추상 클래스, 템플릿을 활용합니다. 다음 몇 개의 강의에서는 몇 가지 필수 패턴을 구현하고 각 패턴이 어떤 상황에 적합한 도구인지 알아봅니다.
챌린지
쉬움세 가지 디자인 패턴 범주에 대한 이해를 보여 주는 간단한 패턴 분류기를 만들어 봅시다. 패턴 이름을 입력받아 Creational, Structural, Behavioral 중 어느 범주에 속하는지 식별하고, 해당 범주의 목적을 간단히 설명하는 시스템을 만들 것입니다.
코드는 세 개의 파일로 구성합니다.
PatternCategory.h: 디자인 패턴 범주를 나타내는PatternCategory라는 추상 기본 클래스를 정의합니다. 다음을 포함해야 합니다.- 범주 이름을 문자열로 반환하는 순수 가상 메서드
getName() - 해당 범주의 패턴이 수행하는 작업을 설명하는 문자열을 반환하는 순수 가상 메서드
getPurpose() - 가상 소멸자
그런 다음
PatternCategory를 상속하는 파생 클래스 세 개를 만듭니다.CreationalCategory: 이름"Creational"과 목적"Object creation mechanisms"을 반환합니다.StructuralCategory: 이름"Structural"과 목적"Class and object composition"을 반환합니다.BehavioralCategory: 이름"Behavioral"과 목적"Object interaction and responsibility"를 반환합니다.
- 범주 이름을 문자열로 반환하는 순수 가상 메서드
PatternClassifier.h: 주어진 패턴이 어느 범주에 속하는지 식별할 수 있는PatternClassifier클래스를 만듭니다.분류기에는 패턴 이름(문자열)을 받아 적절한
PatternCategory의 포인터를 반환하는classify메서드가 있어야 합니다. 메모리 관리를 위해 스마트 포인터(std::unique_ptr)를 사용합니다.분류기는 다음 패턴을 인식해야 합니다.
- Creational:
Singleton,Factory,Builder - Structural:
Adapter,Decorator,Composite - Behavioral:
Observer,Strategy,Command
패턴 이름을 인식하지 못하면
nullptr를 반환합니다.- Creational:
main.cpp: 디자인 패턴 이름 하나를 입력받습니다.PatternClassifier를 만들고 이를 사용해 입력된 패턴을 분류합니다. 패턴이 인식되면 다음을 출력합니다.[PatternName] is a [CategoryName] pattern Purpose: [CategoryPurpose]패턴을 인식하지 못하면 다음을 출력합니다.
Unknown pattern: [PatternName]
예를 들어, 입력이 Singleton인 경우:
Singleton is a Creational pattern
Purpose: Object creation mechanisms입력이 Observer인 경우:
Observer is a Behavioral pattern
Purpose: Object interaction and responsibility입력이 Proxy인 경우:
Unknown pattern: Proxy이 과제는 이미 익힌 개념인 상속, 다형성, 스마트 포인터를 연습하면서 디자인 패턴의 세 가지 범주를 다시 확인하게 해 줍니다. 여러 파일로 구성된 구조는 실제 프로젝트에서 서로 관련된 클래스를 구성하는 방식을 반영합니다.
직접 해보기
#include <iostream>
#include <string>
#include "PatternClassifier.h"
int main() {
// 패턴 이름을 읽습니다
std::string patternName;
std::cin >> patternName;
// TODO: PatternClassifier 인스턴스를 생성합니다
// TODO: 분류기를 사용해 입력된 패턴을 분류합니다
// TODO: 패턴이 인식되면 출력합니다:
// "[PatternName] is a [CategoryName] pattern"
// "Purpose: [CategoryPurpose]"
// TODO: 패턴이 인식되지 않으면 (nullptr) 출력합니다:
// "Unknown pattern: [PatternName]"
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러