라떼군 이야기


9 / 13강

템플릿 메서드: 절차는 고정하고 단계는 바꾸기

자료를 읽고 정리한 뒤 내보내는 순서는 늘 같습니다. 정리 규칙만 달라진다면 전체 절차를 매번 복사할 필요가 없습니다. 템플릿 메서드는 공통 절차를 상위 클래스에 두고 일부 단계를 하위 클래스가 구현하도록 합니다.

변하지 않는 순서를 한곳에 둡니다

class TextJob:
    def run(self, text):
        cleaned = text.strip()
        return self.transform(cleaned)
    def transform(self, text):
        raise NotImplementedError

class UppercaseJob(TextJob):
    def transform(self, text):
        return text.upper()

print(UppercaseJob().run("  latte  "))

출력은 LATTE입니다. run은 공백 제거, 변환, 반환 순서를 갖습니다. UppercaseJob은 transform만 정의합니다. 선택적으로 추가할 동작에는 기본 구현이 있는 훅을 둘 수도 있습니다.

공통 절차에 하위 클래스의 종류를 검사하는 조건문이 계속 늘어난다면 추상화가 맞지 않는지 살펴보세요. 상위 클래스가 바뀌면 여러 하위 클래스에 영향이 갈 수 있다는 점도 고려해야 합니다. Python에서는 run을 재정의하지 않기로 한 약속을 코드 리뷰나 별도 설계로 지켜야 합니다.

전략과 비교합니다

전략은 다른 객체나 함수에 작업을 맡기는 구성 방식입니다. 템플릿 메서드는 상속으로 일부 단계를 바꿉니다. 실행 중에 알고리즘을 자유롭게 바꾸고 싶다면 전략이 편리할 수 있고, 공통 순서를 중심으로 확장점을 제한하려면 템플릿 메서드가 어울릴 수 있습니다.

확인 문제

매번 다른 정리 함수를 넣어 실행하고 싶습니다. 꼭 하위 클래스를 계속 만들어야 할까요?

해설 보기

아닙니다. 함수를 전달하는 전략 방식이 더 간단할 수 있습니다. 공통 절차를 상속 계층으로 관리할 이유가 있는지 먼저 판단합니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.