[디자인 패턴] 4 템플릿 메서드 패턴(Template Method Pattern)

류재성's avatar
May 28, 2024
[디자인 패턴] 4 템플릿 메서드 패턴(Template Method Pattern)
 

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.퇴장하기(); } }
notion image
 
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.수업하기(); } }
 
notion image
 
이렇게 만들면 하나의 메서드를 호출하면 되기 때문에 실수할 확률이 적어진다.
 

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.수업하기(); } }
 
notion image
 
이렇게 만들면 SOLID 를 지키면서 템플렛 메서드 패턴을 구현할 수 있다.
Share article
RSSPowered by inblog