1. 템플릿 메서드 패턴 이란?
템플릿 메서드 패턴(Template Method Pattern)은 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴이다.
package ex04.teacher;
public class JavaTeacher {
public void 입장하기(){
System.out.println("입장하기");
}
public void 출석부르기(){
System.out.println("출석부르기");
}
public void 강의하기(){
System.out.println("자바강의하기");
}
public void 퇴장하기(){
System.out.println("퇴장하기");
}
}
JavaTeacher 클래스를 만든다. 이 클래스에는 4가지 메서드를 가진다.
package ex04;
import ex04.teacher.JavaTeacher;
public class App {
public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();
jt.입장하기();
jt.출석부르기();
jt.강의하기();
jt.퇴장하기();
}
}

JavaTeacher 를 메모리에 띄운 후 쉽게 메서드를 불러올 수 있다. 하지만 이렇게 일일이 작성하면 실수를 하기 쉽다. 이때 템플릿 메서드 패턴을 활용한다.
2. 구현하기
package ex04.teacher;
public class JavaTeacher {
public void 수업하기(){
입장하기();
출석부르기();
강의하기();
퇴장하기();
}
private void 입장하기(){
System.out.println("입장하기");
}
private void 출석부르기(){
System.out.println("출석부르기");
}
private void 강의하기(){
System.out.println("자바강의하기");
}
private void 퇴장하기(){
System.out.println("퇴장하기");
}
}
기존의 메서드를 private 로 만들어 내부 클래스에서만 사용할 수 있게 만든다. 그리고 수업하기 메서드를 만들고 이 메서드에 필요한 메서드를 넣는다.
package ex04;
import ex04.teacher.JavaTeacher;
public class App {
public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();
jt.수업하기();
}
}

이렇게 만들면 하나의 메서드를 호출하면 되기 때문에 실수할 확률이 적어진다.
3. 새로운 클래스가 필요하다면?
package ex04.teacher;
public class PythonTeacher {
public void 수업하기(){
입장하기();
출석부르기();
강의하기();
퇴장하기();
}
private void 입장하기(){
System.out.println("입장하기");
}
private void 출석부르기(){
System.out.println("출석부르기");
}
private void 강의하기(){
System.out.println("파이썬 강의하기");
}
private void 퇴장하기(){
System.out.println("퇴장하기");
}
}
만약 PythonTeacher , HTMLTeacher 같은 다른 클래스가 만들어진다면 매번 새로운 클래스를 만들어서 호출해야 한다. 이렇게 되면 SOLID 의 OCP 는 지켰지만 , DIP 를 지키지 못했다. 이럴 때 추상 클래스인 Teacher 를 만들어서 해결해보자.
package ex04.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("퇴장하기");
}
}
추상 클래스 Teacher 에 메서드를 넣는다. 그리고 강의하기() 메서드 같이 구체적으로 구현이 어려운 것들은 추상 메서드로 만들어 자식 클래스에서 구현되도록 만든다.
package ex04.teacher;
public class JavaTeacher extends Teacher {
@Override
public void 강의하기() {
System.out.println("자바 강의하기");
}
}
package ex04.teacher;
public class PythonTeacher extends Teacher {
@Override
public void 강의하기() {
System.out.println("파이썬 강의하기");
}
}
추상 클래스 Teacher 를 상속 후 추상 메서드를 구현한다.
package ex04;
import ex04.teacher.HTMLTeacher;
import ex04.teacher.JavaTeacher;
import ex04.teacher.PythonTeacher;
import ex04.teacher.Teacher;
public class App {
public static void main(String[] args) {
Teacher jt = new JavaTeacher();
Teacher pt = new PythonTeacher();
Teacher ht = new HTMLTeacher();
jt.수업하기();
pt.수업하기();
ht.수업하기();
}
}

이렇게 만들면 SOLID 를 지키면서 템플렛 메서드 패턴을 구현할 수 있다.
Share article