[python] 템플릿 메서드 디자인 패턴

템플릿 메서드 디자인 패턴은 객체지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 알고리즘의 구조를 정의하는 추상 클래스를 만들고, 그 안에 일부 메서드를 구현하고 나머지는 하위 클래스에서 구현하도록 하는 것입니다. 이렇게 함으로써 알고리즘의 일부분을 변경하고자 할 때 전체 알고리즘을 수정하지 않고도 하위 클래스에서 변경된 부분만 구현할 수 있습니다.

템플릿 메서드 디자인 패턴의 예시

다음은 템플릿 메서드 디자인 패턴을 사용한 예시 코드입니다. 이 예시는 커피를 만드는 과정을 보여줍니다.

from abc import ABC, abstractmethod

class Coffee(ABC):
    def prepare_coffee(self):
        self.boil_water()
        self.brew_coffee()
        self.pour_coffee()
        self.add_milk_and_sugar()
    
    def boil_water(self):
        print("물을 끓입니다.")
    
    @abstractmethod
    def brew_coffee(self):
        pass
    
    def pour_coffee(self):
        print("커피를 따릅니다.")
    
    @abstractmethod
    def add_milk_and_sugar(self):
        pass

class Americano(Coffee):
    def brew_coffee(self):
        print("아메리카노를 내립니다.")
    
    def add_milk_and_sugar(self):
        print("우유와 설탕을 추가합니다.")

class Latte(Coffee):
    def brew_coffee(self):
        print("라떼를 내립니다.")
    
    def add_milk_and_sugar(self):
        print("우유와 시럽을 추가합니다.")

americano = Americano()
americano.prepare_coffee()
print("---")
latte = Latte()
latte.prepare_coffee()

위 코드에서 Coffee 클래스는 추상 클래스이며 prepare_coffee 메서드를 템플릿 메서드로 정의하고 있습니다. prepare_coffee 메서드 안에서는 순서에 맞게 다른 메서드들을 호출하는데, 이들은 하위 클래스에서 구현되어야 하는 추상 메서드들입니다.

Americano 클래스와 Latte 클래스는 Coffee 클래스를 상속받아 필요한 메서드를 구현합니다. 각각의 하위 클래스는 brew_coffeeadd_milk_and_sugar 메서드를 오버라이딩하여 자신에게 맞는 커피를 만들어냅니다.

위 예시 코드를 실행해보면, 아메리카노와 라떼를 만드는 과정을 보실 수 있습니다.

템플릿 메서드 디자인 패턴의 장점

템플릿 메서드 디자인 패턴은 코드의 재사용성과 확장성을 높여줍니다. 알고리즘의 공통된 부분을 추상 클래스에서 구현함으로써, 하위 클래스마다 알고리즘을 다시 구현할 필요가 없습니다. 또한, 알고리즘이 변경되어도 추상 클래스를 수정하지 않고도 하위 클래스에서 변경된 부분만을 구현할 수 있습니다.

결론

템플릿 메서드 디자인 패턴은 알고리즘의 구조를 정의할 때 유용한 디자인 패턴입니다. 추상 클래스를 사용하여 알고리즘의 공통된 부분을 구현하고, 하위 클래스에서 필요한 부분만을 구현함으로써 코드의 재사용성과 확장성을 높일 수 있습니다.