템플릿 메소드 패턴(Template Method Pattern)은 행동(Behavioral) 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하면서도 알고리즘의 개별 단계는 서브클래스에서 구현하도록 하는 패턴입니다. 이 패턴을 사용하면 알고리즘의 큰 틀을 바꾸지 않으면서 서브클래스가 특정 단계를 재정의할 수 있습니다.
템플릿 메소드 패턴의 주요 개념
- 알고리즘 구조 정의:
- 템플릿 메소드 패턴에서는 상위 클래스가 알고리즘의 기본 구조를 정의합니다. 이 구조는 변경되지 않고, 서브클래스는 그 구조 내에서 특정 단계를 재정의할 수 있습니다.
- 추상 메서드와 후크 메서드:
- 서브클래스가 재정의해야 하는 메서드는 보통 추상 메서드로 선언됩니다. 또한, 후크 메서드(hook method)라고 불리는, 서브클래스에서 선택적으로 재정의할 수 있는 메서드도 포함될 수 있습니다.
- 재사용성 향상:
- 알고리즘의 구조를 상위 클래스에 정의하여, 여러 서브클래스에서 공통된 알고리즘을 재사용할 수 있습니다. 서브클래스는 알고리즘의 특정 단계만 수정하면 됩니다.
템플릿 메소드 패턴의 구조
- Abstract Class (추상 클래스):
- 알고리즘의 기본 구조를 정의하는 클래스입니다.
템플릿 메소드
는 이 클래스에서 정의되며, 전체 알고리즘의 흐름을 결정합니다. 이 클래스에는 서브클래스가 구현해야 하는 추상 메서드와 선택적으로 재정의할 수 있는 후크 메서드가 포함될 수 있습니다.
- Concrete Class (구체 클래스):
- 추상 클래스에서 정의된 템플릿 메소드의 각 단계를 구체적으로 구현하는 서브클래스입니다. 서브클래스는 추상 메서드를 오버라이드하고, 필요에 따라 후크 메서드를 재정의할 수 있습니다.
- 코드 재사용성:
- 알고리즘의 공통된 부분을 상위 클래스에 정의하여, 중복되는 코드 없이 다양한 서브클래스에서 재사용할 수 있습니다.
- 유연성:
- 알고리즘의 구조를 유지하면서도, 각 단계의 구현을 서브클래스에서 다양하게 변경할 수 있습니다.
- 유지보수성:
- 알고리즘의 흐름을 한 곳에서 관리할 수 있어 유지보수가 용이합니다. 새로운 기능 추가 시 전체 알고리즘을 수정할 필요 없이 특정 단계를 변경하기만 하면 됩니다.
- 구조의 경직성:
- 알고리즘의 구조가 상위 클래스에서 정의되므로, 큰 구조를 바꾸고자 할 때는 상위 클래스를 수정해야 합니다. 이는 상위 클래스가 너무 많은 책임을 가지게 되어, 유지보수가 어려워질 수 있습니다.
- 서브클래스 증가:
- 각 단계의 구현을 위해 많은 서브클래스를 만들어야 할 수 있어, 클래스의 수가 증가할 수 있습니다.
- 의존성 증가:
- 서브클래스가 상위 클래스에 강하게 의존하게 되어, 상위 클래스의 변화가 서브클래스에 큰 영향을 미칠 수 있습니다.
템플릿 메소드 패턴의 장점
템플릿 메소드 패턴의 단점
결론
템플릿 메소드 패턴은 알고리즘의 공통적인 구조를 유지하면서도 서브클래스에 유연성을 제공하고자 할 때 매우 유용한 패턴입니다. 이 패턴을 통해 코드의 재사용성을 높이고, 유지보수를 간편하게 할 수 있지만, 구조의 경직성이나 서브클래스의 증가와 같은 단점도 고려해야 합니다.
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