본문 바로가기

Backend/Java

자바 템플릿 메소드 패턴 (Java Template Method Pattern)

자바 디자인 패턴에서 많이 언급되는 패턴 중 하나에요.

도대체 이게 뭔지 바로 구현해볼게요.

 

예제로 길을 찾는 기능을 구현하려고 해요.

출발지와 목적지를 입력하면 빠른 길, 가까운 길, 무료 길 등등 원하는 길을 알려줄거에요.

템플릿 클래스

어떤 길을 찾건 출발지와 목적지는 공통적으로 받아야되요.

공통적인 기능은 템플릿 클래스에 구현하고 빠른, 가까운, 무료와 같이 알고리즘이 다른 기능은 추상 메소드로 선언하여 각각 구현하도록 할거에요.

 

public abstract class Direction {

	// 출발, 도착 세팅
	final void setStartAndDest(String start, String end) {
		System.out.println("출발지 : " + start);
		System.out.println("도착지 : " + end);
	}
	
	// 경유지 세팅
	final void setPassThroughs(String... points) {
		for (String point : points) {
			System.out.println("* 경유지 : " + point);
		}
	}

	// 길 찾기
	abstract void getDirection();

}

구현 클래스

이제 각각의 다른 기능을 구현할거에요.

 

public class FastDirection extends Direction {

	@Override
	void getDirection() {
		System.out.println("빠른 길을 찾습니다.");
	}

}

 

public class FreeDirection extends Direction {

	@Override
	void getDirection() {
		System.out.println("무료 길을 찾습니다.");
	}

}

 

public class CloseDirection extends Direction {

	@Override
	void getDirection() {
		System.out.println("가까운 길을 찾습니다.");
	}

}

실행

무료 길을 찾을 때는 FreeDirection으로 객체를 만들어서 사용하구요.

 

public static void main(String[] args) {
	FreeDirection direction = new FreeDirection();
	direction.setStartAndDest("서울", "부산");
	direction.setPassThroughs("천안", "대전", "대구");
	direction.getDirection();
}

 

 

가까운 길을 찾을 때는 CloseDirection으로 객체를 만들어서 사용하면 되요.

 

public static void main(String[] args) {
	CloseDirection direction = new CloseDirection();
	direction.setStartAndDest("서울", "부산");
	direction.setPassThroughs("천안", "대전", "대구");
	direction.getDirection();
}

 

 

용어가 거창하게 템플릿 메소드 패턴이지, 그냥 추상 메소드 사용하는 거에요.

공통적인 부분은 템플릿에서 구현하고 각기 다르게 구현해야되는 기능은 하위 클래스에 구현하는 것이 핵심이구요.

동일한 패턴으로 소스를 적용할 수 있고, 클래스 교체만으로 기능을 변경할 수 있어요.

잘 알아두고 잘 적용하면 코드를 이쁘게 디자인 할 수 있을 것 같아요.

 

실제 자바 소스에서 많이 볼 수 있는 패턴이에요.

AbstractMap (템플릿) - HashMap,TreeMap 등등

AbstractList (템플릿) - ArrayList 등등

 

하지만, 실제 적용할 때는 잘못 쓰면 나만 보기 좋은 코드가 될 수도 있어요.

위의 예제 역시 템플릿 메소드 패턴이 최선은 아닐거에요.

구조에 맞게 잘 적용하는 것이 중요합니다.

 

확실한건 면접에 자주 나오고, 알아서 나쁠 건 없으니 익혀두면 좋은 것 같습니다.