Menu
Coddy logo textTech

디자인 패턴 소개

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 90번째.

Design patterns는 소프트웨어 design에서 발생하는 일반적인 문제에 대한 검증되고 재사용 가능한 해결책입니다. 이는 직접 복사해서 사용하는 코드가 아니라, 특정 문제를 우아하게 해결하기 위해 class와 object를 구조화하는 방법을 설명하는 템플릿 또는 청사진입니다.

이 개념은 "Gang of Four"(GoF)가 23개의 기본 pattern을 분류한 1994년 저서에서 대중화되었습니다. 이러한 patterns는 일반적으로 세 가지 범주로 그룹화됩니다.

범주 목적 예시
Creational Object creation mechanisms Singleton, Factory, Builder
Structural Class 및 object composition Adapter, Decorator, Composite
Behavioral Object interaction 및 responsibility Observer, Strategy, Command

왜 design 패턴을 배워야 할까요? design 패턴은 개발자들 사이에서 공통 어휘를 제공합니다. “여기에 Factory를 사용하세요”라고 말하는 것만으로도 복잡한 개념을 즉시 전달할 수 있습니다. 또한 해결책을 매번 새로 만들 필요가 없도록 도와주며, 코드를 더 유연하고 유지 관리하기 쉽게 만들어 줍니다.

C++에서 design pattern은 여러분이 이미 배운 OOP 기능인 상속, 다형성, 추상 클래스, 템플릿을 활용합니다. 다음 lesson들에서는 몇 가지 필수적인 pattern을 Implement하고, 각각이 언제 적절한 도구인지 이해하게 됩니다.

challenge icon

챌린지

쉬움

세 가지 design pattern category에 대한 이해를 보여 주는 간단한 pattern classifier를 만들어 보겠습니다. pattern name을 입력받아 해당 pattern이 Creational, Structural 또는 Behavioral 중 어느 category에 속하는지 식별하고, 해당 category의 목적에 대한 간단한 설명도 제공하는 system을 만들게 됩니다.

code를 세 개의 file에 나누어 구성합니다:

  • PatternCategory.h: design pattern category를 나타내는 PatternCategory라는 추상 base class를 정의합니다. 다음을 포함해야 합니다:
    • category name을 string으로 반환하는 순수 가상 getName() method
    • 이 category의 pattern들이 수행하는 작업에 대한 설명을 반환하는 순수 가상 getPurpose() method
    • 가상 destructor

    그런 다음 PatternCategory를 상속하는 세 개의 파생 class를 만듭니다:

    • CreationalCategory: name으로 "Creational"을, purpose로 "Object creation mechanisms"을 반환합니다
    • StructuralCategory: name으로 "Structural"을, purpose로 "Class and object composition"을 반환합니다
    • BehavioralCategory: name으로 "Behavioral"을, purpose로 "Object interaction and responsibility"을 반환합니다
  • PatternClassifier.h: 주어진 pattern이 어느 category에 속하는지 식별할 수 있는 PatternClassifier class를 만듭니다.

    classifier에는 pattern name(string)을 인수로 받고 적절한 PatternCategory에 대한 pointer를 반환하는 classify method가 있어야 합니다. memory 관리를 위해 smart pointer(std::unique_ptr)를 사용합니다.

    classifier는 다음 pattern들을 인식해야 합니다:

    • Creational: Singleton, Factory, Builder
    • Structural: Adapter, Decorator, Composite
    • Behavioral: Observer, Strategy, Command

    pattern name을 인식하지 못하면 nullptr를 반환합니다.

  • main.cpp: 하나의 input, 즉 design pattern의 name을 읽습니다.

    PatternClassifier를 만들고 이를 사용하여 input pattern을 분류합니다. pattern이 인식되면 다음을 출력합니다:

    [PatternName] is a [CategoryName] pattern
    Purpose: [CategoryPurpose]

    pattern이 인식되지 않으면 다음을 출력합니다:

    Unknown pattern: [PatternName]

예를 들어 input이 Singleton인 경우:

Singleton is a Creational pattern
Purpose: Object creation mechanisms

input이 Observer인 경우:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

input이 Proxy인 경우:

Unknown pattern: Proxy

이 challenge는 inheritance, polymorphism, smart pointer를 연습하면서 design pattern의 세 가지 category를 다시 익히도록 합니다. 이 모든 개념은 이미 숙달한 내용입니다. 여러 file로 구성된 구조는 실제 project에서 서로 관련된 class들을 구성하는 방식을 반영합니다.

직접 해보기

#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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러