5. 템플릿 메서드 패턴(Template Method Pattern)

서주홍's avatar
Aug 14, 2024
5. 템플릿 메서드 패턴(Template Method Pattern)
 
💡
템플릿 메서드 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하고 그 알고리즘의 일부 단계를 서브클래스에서 구현하도록 하는 데 사용됩니다. 쉽게 말해, 알고리즘의 전체적인 골격(템플릿)은 상위 클래스에서 정의하고, 구체적인 구현은 서브클래스에 맡기는 방식입니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.
 

■ 1. 템플릿 메서드 패턴의 구조

  • 추상 클래스
    • 알고리즘의 골격을 정의합니다.
    • 이 클래스는 템플릿 메서드를 포함하며,
    • 이 메서드는 전체 알고리즘의 흐름을 정의하고,
    • 일부 단계는 추상 메서드로 남겨 서브클래스에서 구현하게 합니다.
    •  
  • 구체 클래스(서브클래스)
    • 추상 클래스에서 정의된 추상 메서드를 구체적으로 구현합니다.
    • 이 클래스들은 템플릿 메서드를 호출하여 동일한 알고리즘 흐름을 따르면서도,
    • 각 클래스마다 서로 다른 동작을 수행할 수 있습니다.
 
 

■ 2. 예제 코드

 

■ 1. 버전(v1)

package ex05_template_method_pattern.v1; public class JavaTeacher { public void 입장하기() { System.out.println("입장하기"); } public void 출석부르기() { System.out.println("출석부르기"); } public void 자바강의하기() { System.out.println("자바 강의하기"); } public void 퇴장하기() { System.out.println("퇴장하기"); } }
  • v1 버전
    • JavaTeacher, PythonTeacher와 같은 클래스들이 각각의 메서드를 개별적으로 구현하고 있습니다.
    • 여기서는 동일한 흐름을 따르는 메서드(입장하기, 출석부르기, 퇴장하기)가 각 클래스에서 반복적으로 정의되고 있습니다.
    • 이로 인해 코드의 중복이 발생하며, 유지보수와 확장성 측면에서 불리합니다.

■ 2. 버전(v2)

package ex05_template_method_pattern.v2.teacher; public class JavaTeacher { public void 수업하기() { 입장하기(); 출석부르기(); 강의하기(); 퇴장하기(); } public void 입장하기() { System.out.println("입장하기"); } public void 출석부르기() { System.out.println("출석부르기"); } public void 강의하기() { System.out.println("자바 강의하기"); } public void 퇴장하기() { System.out.println("퇴장하기"); } }
  • v2 버전
    • 수업하기 메서드가 추가되어 수업의 전체적인 흐름을 관리하게 되었습니다.
    • 그러나 여전히 JavaTeacher, PythonTeacher 등의 클래스가 각각 개별적으로 구현되고 있어, 코드의 중복이 여전합니다.

■ 3. 버전(v3)

💡
템플릿 메서드 패턴 적용
package ex05_template_method_pattern.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("퇴장하기"); } }
  • v3 버전
  • Teacher라는 추상 클래스가 도입되어,
  • 모든 교사 클래스들이 공통으로 사용하는 메서드(입장하기, 출석부르기, 퇴장하기)를 상위 클래스에서 정의하고,
  • 변하는 부분(강의하기)만을 추상 메서드로 정의하여 서브클래스에서 구현하도록 했습니다.
  • 이로 인해 코드 중복이 크게 줄어들고,
  • 새로운 교사 클래스를 추가할 때도 상위 클래스의 구조를 그대로 활용할 수 있어 확장성이 좋아졌습니다.
 

■ 4. 최종 사용 예제

package ex05_template_method_pattern; import ex05_template_method_pattern.teacher.HtmlTeacher; import ex05_template_method_pattern.teacher.JavaTeacher; import ex05_template_method_pattern.teacher.PythonTeacher; import ex05_template_method_pattern.teacher.SpringTeacher; public class App { public static void main(String[] args) { JavaTeacher jt = new JavaTeacher(); jt.수업하기(); PythonTeacher pt = new PythonTeacher(); pt.수업하기(); HtmlTeacher ht = new HtmlTeacher(); ht.수업하기(); SpringTeacher st = new SpringTeacher(); st.수업하기(); } }
  • 최종적으로, App 클래스에서 각 교사 클래스를 인스턴스화하고,
  • 수업하기 메서드를 호출하여 동일한 수업 절차를 따르면서도 각 교사 클래스마다 서로 다른 강의 내용을 제공하게 되었습니다.
  • 이는 템플릿 메서드 패턴을 통해 얻어진 결과로,
  • 코드의 재사용성, 유지보수성, 확장성이 모두 개선되었습니다.
Share article

maestrojava