본문 바로가기
디자인 패턴

[디자인 패턴] 2. 템플릿 메서드 패턴

글: Song hyun 2024. 4. 30.
728x90
반응형

[디자인 패턴] 2. 템플릿 메서드 패턴

 

1. 템플릿 메서드 패턴(Template Method Pattern) 이란?

추상 메서드, 혹은 구현된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 패턴이다.

로직을 단계별로 나눠야 하는 상황에서 주로 적용된다.

해당 로직들이 앞으로 수정될 가능성이 있다면, 더욱 효율적으로 사용할 수 있다.

-> 부모 클래스가 전체적인 알고리즘을 설정하고, 자식 클래스가 특정 단계들을 오버라이드하는 패턴!!
(이는 상속이라는 기술을 극대화하는 패턴이기도 하다!!)

 

*디자인 패턴에서 "템플릿(Template)"이란 변하지 않는 것을 의미한다.

 

*프레임 워크(Frame work): 이미 실행의 흐름이 적혀 있는 코드들. 프레임 워크들에 새로운 코드를 작성하거나, 삭제하는 것으로 새로운 프로그램을 만들 수 있다.

 


 

2. 템플릿 메서드 패턴 예제 들여다 보기

아래의 코드를 살펴보자.

 

Car 라는 상위 클래스와 AICar, ManualCar라는 하위 클래스가 있다. 

Car 클래스와 나머지 두 클래스는 상속 관계라고 할 수 있다.

 

하지만 AICar/ManualCar는 완전히 똑같은 개체는 아니다. 

즉, 클래스의 특정 메서드는 오버라이드(재정의)해야 할 필요가 있는 것이다.

 

우측 하단의 이미지를 보면 상수 메서드로 선언된 run이 보인다.

startCar/turnOff는 각기 다른 색을 띄고 있는데, 해당 부분만 스크립트가 다른 것을 볼 수 있다.(왼쪽 코드 사진)

Car에서, 자식 클래스들이 오버라이드 할 수 있도록 final을 붙이지 않았기 때문이다.

이와 같은 형태를 우리는 템플릿 메서드 패턴이라고 부른다.

 

package useful.ch04;

public abstract class Car {
	
	void startCar() {
		System.out.println("시동을 켭니다.");
	}
	abstract void drive();
	abstract void stop();
	void turnOff() {
		System.out.println("시동을 끕니다.");
	}
	
	// 템플릿 메서드 패턴의 핵심!
	// 메서드 앞에 final 키워드를 사용한다면, 하위 클래스에서 재정의 할 수 없다.
	final void run() {
		// 실행의 흐름 만들어 보기
		startCar();
		drive();
		stop();
		turnOff();
	}

}
package useful.ch04;

public class AICar extends Car {

	@Override
	void drive() {
		System.out.println("AI 자동차가 자율 주행을 합니다.");
		System.out.println("스스로 방향을 바꿉니다.");
		
	}

	@Override
	void stop() {
		System.out.println("AI 자동차가 자동으로 차를 멈춥니다.");
		System.out.println("위험을 감지해서 급하게 제동합니다.");
	}

}
package useful.ch04;

public class ManualCar extends Car{

	@Override
	void drive() {
		System.out.println("사람이 운전을 합니다.");
		
	}

	@Override
	void stop() {
		System.out.println("브레이크를 밟아서 정지를 합니다.");
		
	}

}
package useful.ch04;

public class CarMainTest {
	
	public static void main(String[] args) {
		
		Car aicar = new AICar(); // 다형성, 업캐스팅된 상태
		// 프로그램을 실행시키기 위해서 run() 메서드를 호출해야 한다-약속
		aicar.run();
		
		Car manualCar = new ManualCar();
		manualCar.run();
		
	} // end of main

} // end of class
728x90
반응형

'디자인 패턴' 카테고리의 다른 글

[디자인 패턴] 1. 싱글턴 패턴  (0) 2024.04.30