자바 템플릿 메소드
목차
템플릿 메소드(template method)는 프로그래밍 작성 시에 반복해서 활용할 수 있는 일종의 틀입니다. 객체지향 프로그램의 디자인 패턴의 하나로 프레임워크 등의 개발 시 유용합니다.
템플릿 메소드를 사용하면 여러개의 복잡한 함수를 하나의 기능에 통합할 수 있습니다.
예제를 통해 알아보겠습니다.
아래의 예제에서는 추상클래스에서 템플릿 메소드를 final 로 만들었습니다.
다형성을 사용하여 sub 클래스를 두개 만들어서 각각 용도에 맞게 오버라이딩 할 수 있는 구조입니다.
package com.kay; import java.util.ArrayList; public class Main { public static void main(String[] args) { // ArrayList 사용 ArrayList<myTemplate> tmpList = new ArrayList<myTemplate>(); // 각각 사용 myTemplate tmp1 = new implementedOne(); myTemplate tmp2 = new implementedTwo(); System.out.println("[---------- temp-1 -----------]"); tmp1.run(); System.out.println("[---------- temp-2 -----------]"); tmp2.run(); // ArrayList 사용 tmpList.add(tmp1); tmpList.add(tmp2); for(myTemplate mt : tmpList){ System.out.println("[---------- temp ArrayList -----------]"); mt.run(); } } } abstract class myTemplate{ public void initializing(){ System.out.println("Initializing..."); } public void start() { System.out.println("Template Start"); } public abstract void doSomething(); public void end() { System.out.println("Template End"); } final public void run(){ initializing(); start(); doSomething(); end(); } } class implementedOne extends myTemplate{ @Override public void doSomething() { System.out.println("*Do Something Implemented - One"); } } class implementedTwo extends myTemplate{ @Override public void doSomething() { System.out.println("*Do Something Implemented - Two"); } }
[---------- temp-1 -----------] Initializing... Template Start *Do Something Implemented - One Template End [---------- temp-2 -----------] Initializing... Template Start *Do Something Implemented - Two Template End [---------- temp ArrayList -----------] Initializing... Template Start *Do Something Implemented - One Template End [---------- temp ArrayList -----------] Initializing... Template Start *Do Something Implemented - Two Template End
myTemplate 을 구현한 sub 클래스 두개에서 doSomething 을 오버라이드 합니다. 이 외의 공통된 코드는 추상클래스에서 미리 구현해버립니다.
여기서 템플릿 메소드는 run 입니다. 이런 식으로 사용자는 추상 클래스를 extends 해서 자신이 필요한 doSomething 의 내용만 바꾸면 됩니다.
인스턴스를 생성하면서 myTemplate tmp1 = new implementedOne() 다형성을 활용하고 있습니다. ArrayList를 사용하면 2개의 sub 클래스도 묶어버릴 수 있습니다.
base 클래스만 같으면 다른 sub 클래스들을 하나의 ArrayList로 관리할 수 있습니다. 복잡한 프로그래밍도 인스턴스 관리가 쉬워집니다.
요약
자바 템플릿 메소드는 다양한 방법으로 사용될 수 있습니다.
템플릿 메소드를 실습해보면서 장단점을 파악해보세요.
외부참고문서
Design Patterns: Template Method in Java (refactoring.guru)