템플릿 메서드 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하고 그 알고리즘의 일부 단계를 서브클래스에서 구현하도록 하는 데 사용됩니다. 쉽게 말해, 알고리즘의 전체적인 골격(템플릿)은 상위 클래스에서 정의하고, 구체적인 구현은 서브클래스에 맡기는 방식입니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.
■ 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