본문 바로가기
-----ETC-----/C++ 고급 프로그래밍과 응용 프로젝트 시리즈

[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 14: 디자인 패턴 심화 - 템플릿 메소드 패턴 (Template Method Pattern)

by cogito21_cpp 2024. 8. 1.
반응형

템플릿 메소드 패턴 (Template Method Pattern)

템플릿 메소드 패턴은 상위 클래스에서 알고리즘의 골격을 정의하고, 하위 클래스에서 그 알고리즘의 일부 단계를 구체적으로 구현하도록 하는 패턴입니다. 이를 통해 알고리즘의 구조는 변경하지 않고, 세부 단계를 변경할 수 있습니다.

 

템플릿 메소드 패턴의 특징

  1. 알고리즘의 골격 정의: 알고리즘의 기본 구조를 상위 클래스에서 정의합니다.
  2. 단계의 구체적 구현: 알고리즘의 세부 단계를 하위 클래스에서 구현합니다.
  3. 코드 재사용: 중복 코드를 상위 클래스에 모아서 코드 재사용성을 높입니다.

템플릿 메소드 패턴의 구조

  1. AbstractClass (추상 클래스): 알고리즘의 골격을 정의하고, 구체적 단계를 하위 클래스에서 구현하도록 합니다.
  2. ConcreteClass (구체적 클래스): 알고리즘의 구체적 단계를 구현합니다.

템플릿 메소드 패턴 UML 다이어그램

+------------------+
|  AbstractClass   |
+------------------+
| +templateMethod()|
| +primitiveOp1()  |
| +primitiveOp2()  |
+------------------+
       /\
       ||
+------------------+
|  ConcreteClass   |
+------------------+
| +primitiveOp1()  |
| +primitiveOp2()  |
+------------------+

템플릿 메소드 패턴 구현 예제

다음 예제는 템플릿 메소드 패턴을 사용하여 다양한 요리 과정을 구현합니다.

 

AbstractClass 정의

#include <iostream>

// 추상 클래스
class Cooking {
public:
    // 템플릿 메소드
    void cook() {
        prepareIngredients();
        cookDish();
        serveDish();
    }

    virtual ~Cooking() = default;

protected:
    virtual void prepareIngredients() = 0;
    virtual void cookDish() = 0;

    void serveDish() {
        std::cout << "Serving the dish." << std::endl;
    }
};

 

ConcreteClass 정의

// 구체적 클래스: 파스타 요리
class PastaCooking : public Cooking {
protected:
    void prepareIngredients() override {
        std::cout << "Preparing pasta ingredients." << std::endl;
    }

    void cookDish() override {
        std::cout << "Cooking pasta." << std::endl;
    }
};

// 구체적 클래스: 스테이크 요리
class SteakCooking : public Cooking {
protected:
    void prepareIngredients() override {
        std::cout << "Preparing steak ingredients." << std::endl;
    }

    void cookDish() override {
        std::cout << "Cooking steak." << std::endl;
    }
};

 

템플릿 메소드 패턴 사용 예제

int main() {
    PastaCooking pasta;
    SteakCooking steak;

    std::cout << "Pasta Cooking:" << std::endl;
    pasta.cook();

    std::cout << "\nSteak Cooking:" << std::endl;
    steak.cook();

    return 0;
}

 

이 예제에서 Cooking 클래스는 요리의 기본 과정을 정의하고, PastaCookingSteakCooking 클래스는 각각 파스타와 스테이크 요리의 구체적 단계를 구현합니다.


템플릿 메소드 패턴의 응용

템플릿 메소드 패턴은 다양한 응용 분야에서 사용할 수 있습니다. 몇 가지 예를 들어보겠습니다.

  1. 파일 처리: 파일을 읽고 쓰는 기본 과정을 정의하고, 구체적 파일 형식에 따라 처리 방법을 변경합니다.
  2. 게임 개발: 게임의 기본 루프를 정의하고, 구체적 게임의 단계를 하위 클래스에서 구현합니다.
  3. 데이터베이스 접근: 데이터베이스 연결, 쿼리 실행, 결과 처리의 기본 과정을 정의하고, 구체적 데이터베이스에 따라 처리 방법을 변경합니다.

실습 문제

문제 1: 템플릿 메소드 패턴을 사용하여 데이터 처리 과정 구현

템플릿 메소드 패턴을 사용하여 데이터 처리 과정을 구현하세요. 데이터 처리 과정은 데이터 읽기, 데이터 처리, 결과 저장의 세 단계를 포함합니다.

 

해설:

AbstractClass 정의

#include <iostream>

// 추상 클래스
class DataProcessor {
public:
    // 템플릿 메소드
    void process() {
        readData();
        processData();
        saveResult();
    }

    virtual ~DataProcessor() = default;

protected:
    virtual void readData() = 0;
    virtual void processData() = 0;

    void saveResult() {
        std::cout << "Saving the result." << std::endl;
    }
};

 

ConcreteClass 정의

// 구체적 클래스: CSV 데이터 처리
class CSVDataProcessor : public DataProcessor {
protected:
    void readData() override {
        std::cout << "Reading CSV data." << std::endl;
    }

    void processData() override {
        std::cout << "Processing CSV data." << std::endl;
    }
};

// 구체적 클래스: JSON 데이터 처리
class JSONDataProcessor : public DataProcessor {
protected:
    void readData() override {
        std::cout << "Reading JSON data." << std::endl;
    }

    void processData() override {
        std::cout << "Processing JSON data." << std::endl;
    }
};

 

템플릿 메소드 패턴 사용 예제

int main() {
    CSVDataProcessor csvProcessor;
    JSONDataProcessor jsonProcessor;

    std::cout << "CSV Data Processing:" << std::endl;
    csvProcessor.process();

    std::cout << "\nJSON Data Processing:" << std::endl;
    jsonProcessor.process();

    return 0;
}

 

이 예제에서 DataProcessor 클래스는 데이터 처리의 기본 과정을 정의하고, CSVDataProcessorJSONDataProcessor 클래스는 각각 CSV와 JSON 데이터의 구체적 단계를 구현합니다.

 

이제 14일차의 학습을 마쳤습니다. 템플릿 메소드 패턴의 다양한 구현 방법과 활용 사례에 대해 상세히 학습하고 실습 문제를 풀어보았습니다.

 

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일부터는 "실전 프로젝트"를 시작하겠습니다. 내일은 "프로젝트 소개 및 설계"에 대해 학습하겠습니다.

반응형