Menu
Coddy logo textTech

템플릿 메서드 패턴

Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 52번째.

템플릿 메서드 패턴은 알고리즘의 구조를 변경하지 않고 하위 클래스가 특정 단계를 재정의할 수 있도록, 알고리즘의 골격을 기본 클래스에서 정의합니다.

템플릿 메서드가 포함된 기본 클래스입니다:

class DataProcessor:
    def process(self):
        """알고리즘 구조를 정의하는 템플릿 메서드"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

템플릿 메서드 process()는 알고리즘 단계를 정의하며, process_data()는 서브클래스에서 구현하도록 남겨둡니다.

추상 메서드를 구현하는 구체 클래스를 생성합니다:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

각 구체 클래스는 필수 단계에 대해 자체적인 구현을 제공합니다.

템플릿 메서드를 사용하세요:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # 빈 줄

json_processor = JSONProcessor()
json_processor.process()

게임 템플릿을 사용한 또 다른 예제를 만들어 보겠습니다:

class Game:
    def play(self):
        """Template method for playing a game"""
        self.start_game()
        self.play_game()
        self.end_game()
    
    def start_game(self):
        print("Game started!")
    
    def play_game(self):
        raise NotImplementedError("Define the game rules")
    
    def end_game(self):
        print("Game ended!")

class Chess(Game):
    def play_game(self):
        print("Playing chess - thinking strategically...")

class Soccer(Game):
    def play_game(self):
        print("Playing soccer - running and kicking...")

chess = Chess()
chess.play()

출력:

Reading data...
Processing CSV data
Saving data...

Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!

핵심 포인트: 템플릿 메서드 패턴은 부모 클래스에서 공통 알고리즘 구조를 정의하면서 서브클래스가 특정 단계를 커스터마이징할 수 있도록 합니다. 부모 클래스는 전체적인 흐름을 제어하지만, 서브클래스는 구체적인 구현을 제공합니다. 이를 통해 개별 단계에서의 유연성을 허용하면서도 일관된 구조를 유지할 수 있습니다.

challenge icon

챌린지

중급

적절한 캡슐화와 메서드를 사용하여 template.pydriver.py를 구현하세요. 단계별 안내를 위해 TODO 주석을 따르세요.

직접 해보기

from template import Template

# 테스트 케이스 처리기
test_case = input()

if test_case == "basic_test":
    # TODO: 이름이 "Test Name"인 Template 객체 생성
    # TODO: 객체의 display_info() 메서드 호출
    pass
elif test_case == "validation_test":
    # TODO: 이름이 "Validation Test"인 Template 객체 생성
    # TODO: name 속성을 사용하여 "Name: {obj.name}" 형식으로 이름 출력
    pass
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨