템플릿 메서드(Template Method)

  템플릿은 틀이나 견본을 의미한다.

  템플릿메서드는 추상메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)을 정의해놓은 메서드다.

  즉, 구현별로 달라질 수 있는 행동(메서드)들은 구현 클래스에서 선언 후 호출하는 방식으로 사용한다.

  final로 선언하여 재정의(Override)할 수 없도록 한다.

 

  어떤 소스코드상의 알고리즘에서 특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용한

  패턴이다.

  

  이러한 템플릿 메서드를 이용한 템플릿메서드 패턴은 abstract 클래스에서 abstract 메서드를 이용해서

  전체 흐름을 정의하고 구체적인 각 메서드의 구현은 하위 클래스에 위임하는 것이다.

  하위 클래스마다 세부 구현 내용이 달라져도 로직의 흐름은 템플릿 메서드에 정의된 흐름대로 수행된다.

  

  final 이란?

 

final 키워드

final이란? final 변수는 값이 변경될 수 없는 상수이다. public static final double PI = 3.14; 이러한 형태로 변수를 final로 선언하며 오직 한번만 값을 할당할 수 있다. final키워드는 변수, 메서드, 클래스..

myyoun.tistory.com

  

 

예제코드

 

//Car class
public abstract class Car {

  public abstract void drive();
  public abstract void stop();
  
  public void startCar() {
    System.out.println("시동을 켭니다.");
  }
  
  public void turnOff() {
    System.out.println("시동을 끕니다.");
  }
  
  public void washCar() { }
  
  final public void run() {
    startCar();
    drive();
    stop();
    turnOff();
    washCar();
    /*
      구현된 메소드들 중에서는 하위클래스에서 재정의할 수 있지만
      시나리오가 틀이 되는 메소드들은 재정의하면 안되기 때문에
      final을 사용해서 재정의할 수 없도록 한다.
      
      즉, final로 선언한 run은 시나리오가 되는것이고
      순서가 변경되어서는 안되기때문에 재정의 할 수 없도록
      final로 선언해서 보호하는 것이다.
      만약 재정의하려고 한다면 override method is final 이라는 메세지를 볼 수 있다.
    */
  }
} //Car class End


//Sub class AICar
public class AICar extends Car {
  
  @Override
  public void drive() {
    System.out.println("자율 주행합니다.");
    System.out.println("자동차가 스스로 방향을 바꿉니다.");
  }
  
  @Override
  public void stop() {
    System.out.println("스스로 멈춥니다.");
  }
} //AICar class End


//Sub class ManualCar
public class ManualCar extends Car {
  
  @Override
  public void drive() {
    System.out.println("사람이 운전합니다.");
    System.out.println("사람이 핸들을 조작합니다.");
  }
  
  @Override
  public void stop() {
    System.out.println("브레이크를 밟아서 정지합니다.");
  }
  
  @Override
  public void washCar() {
    System.out.println("손세차");
  }
} //ManualCar class End


//Test Class
public class CarTest {
  
  public static void main(String[] args) {
    Car aiCar = new AICar();
    aiCar.run();
    System.out.println("=========================");
    Car manualCar = new ManualCar(0;
    manualCar.run();
  }
}//Test Class End

  결과값은

  시동을 켭니다.
  자율 주행합니다.
  자동차가 스스로 방향을 바꿉니다.
  스스로 멈춥니다.
  시동을 끕니다.
  ==================
  시동을 켭니다.
  사람이 운전합니다.
  사람이 핸들을 조작합니다.
  브레이크를 밟아서 정지합니다.
  시동을 끕니다.
  손세차

  이렇게 출력된다.

  

  Car 클래스의 경우 abstract으로 선언했는데 drive와 stop메서드를 abstract 이기 때문에 class에서도 써야 한다.

  drive와 stop메서드를 abstract으로 했다는 것은 하위클래스에서 이 두 메서드는 무조건 재정의를 하라는 것이다.

  그리고 재정의를 해도되지만 안해도 되는 메서드는 abstarct을 선언하지 말고 구현부(body)를 비워두면 된다.

  wash가 재정의를 해도되고 안해도 되는 일반 메서드다.

  그래서 결과값을 보면 wash는 재정의하지 않은 AICar에서는 출력되지 않고 재정의를 해준 ManualCar에서는

  출력되는 것을 확인할 수 있다.

 

  Car클래스의 run 메서드가 템플릿 메서드다.

  템플릿 메서드는 추상메서드나 구현된 메서드를 활용하여 시나리오를 정의해 놓은 메서드이며 fianl로 재정의 할 수

  없도록 한다고 했는데 run 메서드를 보면 그 조건을 만족하여 하위클래스에서 구현한 것을 받아와

  정의한 흐름대로 처리되는 것을 확인할 수 있다.

 

 

 

레퍼런스

 패스트캠퍼스 올인원 패키지 - 자바 객체지향프로그래밍

niceman.tistory.com/142

'JAVA' 카테고리의 다른 글

Object 클래스  (0) 2021.02.03
final 키워드  (0) 2021.02.02
싱글톤 패턴(Singleton Pattern)  (0) 2021.02.01
인터페이스(Interface)  (0) 2021.01.31
생성자(Constructor)  (0) 2021.01.30

+ Recent posts