자바 기초

자바 템플릿 메서드, final - Do it! 자바프로그래밍기초

preferrrr 2022. 7. 22. 14:51

템플릿 메서드는 추상클래스를 활용한 예이다.

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();
    }
}
public class AICar extends Car {
	@Override
    public void drive() {
    	System.out.println("자율 주행");
        System.out.println("자동차가 알아서 방향 전환");
    }
    
    @Override
    public void stop() {
    	System.out.println("스스로 멈춤");
    }
}
public class ManualCar extends Car {
	@Override
    public void drive() {
    	System.out.println("사람이 운전");
        System.out.println("사람이 핸들 조작");
    }
    
    @Override
    public void stop() {
    	System.out.println("브레이크로 정지");
   	}
}
public class CarTest {
	public static void main(String[] args) {
    	System.out.println("=== 자율 주행하는 자동차 ===");
        Car myCar = new AICar();
        myCar.run();
        
        System.out.println("=== 사람이 운전하는 자동차 ===");
        Car hisCar = new ManualCar();
        hisCar.run();
    }
}

먼저 추상 클래스 Car이 있고, Car 클래스를 상속받는 AICar와 ManualCar 클래스가 있다.

turnOn() 메서드와 stop() 메서드는 공통 부분으로 Car 클래스에서 구현하고,

drive() 메서드와 startCar() 메서드는 하위클래스인 AICar와 ManualCar에서 구현했다.

 

Car 클래스에서 run() 메서드가 '템플릿 메서드' final 예약어를 사용해서 선언했다.

위 코드의 run()은 차가 어떻게 달려야 하는지를 구현한 것이다. //작동 순서는 어느 차나 동일

이렇게 템플릿 메서드의 역할은 메서드 실행 순서와 시나리오를 정의하는 것이다.

그렇기 때문에 템플릿 메서드는 바뀔 수 없고, 하위 클래스에서 재정의하면 안된다. 그래서 예약어 또한 final이다.

템플릿 메서드는 로직 흐름이 이미 정해져 있는 프레임워크에서 사용하는 기본 구현 방법이다.

 

정리하자면, 템플릿 메서드는 로직 흐름을 정의하는 역할을 하고, 이 흐름은 하위 클래스가 공통으로 사용하기 때문에 코드를 변경해선 안되기 때문에 final로 선언한다.