각진 세상에 둥근 춤을 추자

[Java] 템플릿 메서드 본문

Java

[Java] 템플릿 메서드

circle.j 2022. 9. 20. 23:08

'템플릿(templete)'이란 틀이 있는 메서드라고 볼 수 있다. 

추상 클래스를 활용한 예로 템플릿 메서드를 알아본다.

 

Car 클래스를 생성한다.

이 클래스는 drive(), stop() 이라는 추상 메서드와 startCar(), turnOff(), run()이라는 구현된 메서드를 가지고 있다. 

시동을 켜고 끄는 것은 차종에 관계없이 동일하기 때문에 미리 코드로 구현했다.

그에 반해 drive(), stop()은 차종에 따라 다른 방식으로 움직일 수 있기에 추상 메서드로 선언했다.

 

package ch09_2;

public abstract class Car {

	public abstract void drive();
	public abstract void stop();
	
	public void startCar() {
		System.out.println("시동을 켭니다");
	}
	
	public void turnOff() {
		System.out.println("시동을 끕니다");
	}
	
	// 템플릿 메서드
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
	
}

 

템플릿 메서드를 살펴보면 자동차가 달리는 방법을 순서대로 구현한 것을 알 수 있다.

시동을 켜고, 달리고, 브레이크로 멈춘 후 시동을 끈다.

Car 클래스를 상속 받은 모든 하위 클래스의 차들은 이 순서와 동일한 방식으로 진행된다.

 

Car 클래스로 상속받을 클래스를 2개 구현해 본다. 

 

Car 클래스를 상속받는 자율 주행 자동차(AICar) 클래스와 일반 자동차(ManualCar) 클래스가 있다.

이 클래스들은 추상 클래스 Car를 상속받았기 때문에 구현되지 않은 추상 메서드를 마저 구현해야 한다.

 

 

(1) AlCar 클래스 구현하기

package ch09_2;

public class AICar extends Car{

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

	@Override
	public void stop() {
		System.out.println("자동차가 스스로 멈춥니다.");
	}
	
}

 

(2) ManualCar 클래스 구현하기

package ch09_2;

public class ManualCar extends Car{

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

	@Override
	public void stop() {
		System.out.println("브레이크로 정지합니다.");
	}
	
}

 

(3) 테스트 프로그램을 생성해 두 자동차가 어떻게 움직이는지 확인한다.

package ch09_2;

public class CarTest {
	public static void main(String[] args) {
		
		System.out.println("--- 자율 주행하는 자동차 ---");
		Car myAI = new AICar();
		myAI.run();
		
		System.out.println("--- 사람이 운전하는 자동차 ---");
		ManualCar myManu = new ManualCar();
		myManu.run();
		
	}
}

위 코드를 살펴 보면 AICar와 ManualCar 작동 방식의 일부가 다른 것을 알 수 있다.

하지만 시동을 켜고, 달리고, 멈추고, 끄는 과정은 변하지 않는다. 

이런 메서드를 템플릿 메서드로 정의한다. 

템플릿 메서드는 실행 순서, 즉 시나리오를 정의한 메서드이므로 바뀔 수 없다. 

그래서 템플릿 메서드에는 final 예약어를 사용해 선언한다. 

final 예약어를 사용하면 이를 상속받은 하위 클래스가 해당 메서드를 재정의 할 수 없다.  

'Java' 카테고리의 다른 글

[Java] final 예약어  (0) 2022.09.21
[Java] 템플릿 메서드 - 게임 캐릭터레벨 기능 구현하기  (0) 2022.09.20
[Java] 추상 클래스  (0) 2022.09.20
[Java] 다운캐스팅과 instanceof  (0) 2022.09.20
[Java] 다형성 활용하기  (0) 2022.09.20