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

Template Method
홍윤's avatar
Aug 14, 2024
(디자인 패턴)템플릿 메소드 패턴(Template Method Pattern)
 
💡
템플릿 메소드 패턴(Template Method Pattern)은 행동(Behavioral) 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하면서도 알고리즘의 개별 단계는 서브클래스에서 구현하도록 하는 패턴입니다. 이 패턴을 사용하면 알고리즘의 큰 틀을 바꾸지 않으면서 서브클래스가 특정 단계를 재정의할 수 있습니다.
 

템플릿 메소드 패턴의 주요 개념

  1. 알고리즘 구조 정의:
      • 템플릿 메소드 패턴에서는 상위 클래스가 알고리즘의 기본 구조를 정의합니다. 이 구조는 변경되지 않고, 서브클래스는 그 구조 내에서 특정 단계를 재정의할 수 있습니다.
  1. 추상 메서드와 후크 메서드:
      • 서브클래스가 재정의해야 하는 메서드는 보통 추상 메서드로 선언됩니다. 또한, 후크 메서드(hook method)라고 불리는, 서브클래스에서 선택적으로 재정의할 수 있는 메서드도 포함될 수 있습니다.
  1. 재사용성 향상:
      • 알고리즘의 구조를 상위 클래스에 정의하여, 여러 서브클래스에서 공통된 알고리즘을 재사용할 수 있습니다. 서브클래스는 알고리즘의 특정 단계만 수정하면 됩니다.
       

템플릿 메소드 패턴의 구조

  1. Abstract Class (추상 클래스):
      • 알고리즘의 기본 구조를 정의하는 클래스입니다. 템플릿 메소드는 이 클래스에서 정의되며, 전체 알고리즘의 흐름을 결정합니다. 이 클래스에는 서브클래스가 구현해야 하는 추상 메서드와 선택적으로 재정의할 수 있는 후크 메서드가 포함될 수 있습니다.
  1. Concrete Class (구체 클래스):
      • 추상 클래스에서 정의된 템플릿 메소드의 각 단계를 구체적으로 구현하는 서브클래스입니다. 서브클래스는 추상 메서드를 오버라이드하고, 필요에 따라 후크 메서드를 재정의할 수 있습니다.
       

      템플릿 메소드 패턴의 장점

       
    1. 코드 재사용성:
        • 알고리즘의 공통된 부분을 상위 클래스에 정의하여, 중복되는 코드 없이 다양한 서브클래스에서 재사용할 수 있습니다.
    2. 유연성:
        • 알고리즘의 구조를 유지하면서도, 각 단계의 구현을 서브클래스에서 다양하게 변경할 수 있습니다.
    3. 유지보수성:
        • 알고리즘의 흐름을 한 곳에서 관리할 수 있어 유지보수가 용이합니다. 새로운 기능 추가 시 전체 알고리즘을 수정할 필요 없이 특정 단계를 변경하기만 하면 됩니다.
         

      템플릿 메소드 패턴의 단점

    4. 구조의 경직성:
        • 알고리즘의 구조가 상위 클래스에서 정의되므로, 큰 구조를 바꾸고자 할 때는 상위 클래스를 수정해야 합니다. 이는 상위 클래스가 너무 많은 책임을 가지게 되어, 유지보수가 어려워질 수 있습니다.
    5. 서브클래스 증가:
        • 각 단계의 구현을 위해 많은 서브클래스를 만들어야 할 수 있어, 클래스의 수가 증가할 수 있습니다.
    6. 의존성 증가:
        • 서브클래스가 상위 클래스에 강하게 의존하게 되어, 상위 클래스의 변화가 서브클래스에 큰 영향을 미칠 수 있습니다.
         

      결론

      템플릿 메소드 패턴은 알고리즘의 공통적인 구조를 유지하면서도 서브클래스에 유연성을 제공하고자 할 때 매우 유용한 패턴입니다. 이 패턴을 통해 코드의 재사용성을 높이고, 유지보수를 간편하게 할 수 있지만, 구조의 경직성이나 서브클래스의 증가와 같은 단점도 고려해야 합니다.
 

1. 템플릿 메소드 패턴 연습 예제 및 해설

App
package ex05; import ex05.teacher.HTMLTeacher; import ex05.teacher.JavaTeacher; import ex05.teacher.PythonTeacher; /** * 템플릿: 반복적인 작업을 간편하게 하기 위해 미리 정의된 틀이나 형식 */ public class App { public static void main(String[] args) { JavaTeacher jt = new JavaTeacher(); jt.수업하기(); PythonTeacher pt = new PythonTeacher(); pt.수업하기(); HTMLTeacher htt = new HTMLTeacher(); htt.수업하기(); } }
  • ‘JavaTeacher’, ‘PythonTeacher’, ‘HTMLTeacher’ 클래스는 각각의 교사 역활은 구현한다.
  • ‘수업하기()’ 메소드는 교사의 수업을 실행하는 메소드로, 템플릿 메서드 패턴의 일환으로 상위 클래스에서 공통 구조를 정희하고 하위 클래스에서 세부구현을 담당한다.
  • ‘App’ 클래스는 프로그램의 진입점으로, 다양한 교사 객체를 생성하고 그들의 ‘수업하기()’ 메소드를 호출하여 수업을 진행한다.

Teacher
package ex05.teacher; //템플릿 public abstract class Teacher { public void 수업하기(){ 입장하기(); 출석부르기(); 강의하기(); 퇴장하기(); } public void 입장하기(){ System.out.println("입장하기"); } public void 출석부르기(){ System.out.println("출석부르기"); } public abstract void 강의하기(); public void 퇴장하기(){ System.out.println("퇴장하기"); } }
  • 템플릿 메소드(’수업하기()’) 는 알고리즘의 고정된 구조를 정의하고, 단계들을 순차적으로 호출합니다.
  • 기본 메소드들 (’입장하기()’, ‘출석부르기()’, ‘퇴장하기()’)는 공통된 단계들을 상위 클래스 에서 구현 하여 재사용 할 수 있다.
  • 추상 메소드(’강의하기()’)는 하위 클래스에서 구체적인 구현을 제공해야 하는 부분이다.

JavaTeacher
package ex05.teacher; public class JavaTeacher extends Teacher { public void 강의하기(){ System.out.println("자바강의하기"); } }
  • ‘JavaTeacher’ 클래는 ‘Teacher’ 클래스를 상속받아 수업의 전체 구조를 재사용한다.
  • ‘강의하기()’ 메소드를 구현하여 자바 강의의 내용을 정의한다.
  • 템플릿 메소드인 ‘ 수업하기()’ 에 따라 수업을 진행한다.

PythonTeacher
package ex05.teacher; public class PythonTeacher extends Teacher{ public void 강의하기(){ System.out.println("파이썬강의하기"); } }
  • ‘PythonTeacher’ 클래는 ‘Teacher’ 클래스를 상속받아 수업의 전체 구조를 재사용한다.
  • ‘강의하기()’ 메소드를 구현하여 자바 강의의 내용을 정의한다.
  • 템플릿 메소드인 ‘ 수업하기()’ 에 따라 수업을 진행한다.

HTMLTeacher
package ex05.teacher; public class HTMLTeacher extends Teacher { public void 강의하기(){ System.out.println("HTML강의하기"); } }
  • ‘HTMLTeacher’ 클래는 ‘Teacher’ 클래스를 상속받아 수업의 전체 구조를 재사용한다.
  • ‘강의하기()’ 메소드를 구현하여 자바 강의의 내용을 정의한다.
  • 템플릿 메소드인 ‘ 수업하기()’ 에 따라 수업을 진행한다.
Share article

Uni