Programming

; develop a program

Back-End/Java

[Java] 템플릿 메서드(Template Method)

Clloud_ 2023. 2. 7. 12:06
반응형

템플릿 메서드는 추상 클래스를 활용한 예시 중 하나다.

'템플릿(template)'이란 사전 용어로 틀이나 견본을 뜻한다.

즉, 틀이 있는 메서드라는 의미이다.

 

이번 포스팅에서는 자바(Java)에서 템플릿 메서드(Template Method)에 대하여 공부를 해보고자 한다.

 


템플릿 메서드란

템플릿 메서드는 싱글톤 패턴과 같은 디자인패턴 중 하나로, 추상 클래스를 사용해 구현할 수 있다.

템플릿 메서드를 사용하면 실행의 순서는 정해놓고 구현은 상속받는 각 하위 클래스마다 다르게 할 수 있게된다.

 

템플릿 메서드의 안의 메소드중 하나 이상이 추상 메소드로 정의되며, 그 추상 메소드는 서브클래스에서 구현된다.

이렇게 하면 서브클래스에서 일부분을 구현할 수 있도록 하면서도 구조는 바꾸지 않아도 된다.

 

예제

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 클래스는 drive( )와 stop( ) 추상 메서드와 3개의 구현된 메서드 startCar( ), turnOff( ), run( )을 가지고 있다.
  • 12~17행에 구현된 run( )은 템플릿 메서드이다.
  • 만약 Car 클래스를 상속 받으면 어떤 자동차든 모두 이 순서대로 동일한 방식으로 달리는 것이다.

 

다음은 Car 클래스를 상속 받을 클래스 2개를 구현한 그림이다.

 

  • Car 클래스를 상속받는 두 클래스는 자율 자동차(AICar)와 일반 자동차(ManualCar)이다.
  • 추상 클래스 Car를 상속받았기 때문에 구현되지 않은 추상 메서드를 마저 구현해야 한다.
  • 즉 자동차 종류에 따라 구현 내용이 달라지는 부분은 추상 메서드로 만들고, 공통으로 사용하는 메서드는 추상 클래스에 구현하여 상속받아 사용한다.
추상 메서드 중 하나라도 구현하지 않는다면, 추상 메서드를 포함하고 있기 때문에 추상 클래스가 된다.

 

AICar 클래스 구현

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

    @Override
    public void stop() {
        System.out.println("스스로 멈춥니다");		
    }
}
  • AICar 클래스는 Car 클래스를 상속 받았고 drive( )와 stop( ) 추상 메서드를 구현했다.

 

ManualCar 클래스 구현

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

    @Override
    public void stop() {
        System.out.println("브레이크로 정지합니다");	
    }
}
  • ManualCar 클래스는 Car 클래스를 상속 받았고 drive( )와 stop( ) 추상 메서드를 구현했다.

 

테스트 프로그램 구현

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();
    }
}

 

출력 결과

=== 자율 주행하는 자동차 ===
시동을 켭니다
자율 주행합니다
자동차가 스스로 방향을 전환합니다
스스로 멈춥니다
시동을 끕니다
=== 사람이 운전하는 자동차 ===
시동을 켭니다
사람이 운전합니다
사람이 핸들을 조작합니다
브레이크로 정지합니다
시동을 끕니다

 


템플릿 메서드의 역할

  • 템플릿 메서드는 실행순서, 즉 시나리오를 정의한 메서드이므로 바뀔 수 없다.
  • 상위 클래스를 상속받은 하위 클래스에서 템플릿 메서드를 재정의하면 안된다는 것이다.
  • 그렇기 때문에 템플릿 메서드는 final 예약어를 사용해 선언한다.
    • 메서드 앞에 final을 사용하면 상속받은 하위 클래스가 메서드를 재정의할 수 없다.
  • 템플릿 메서드는 로직 흐름이 이미 정해져 있는 프레임워크에서 많이 사용하는 기본 구현 방법이다.

 

추상 클래스는 하위 클래스에서도 사용할 수 있는 코드를 구현한다.
그런데 일반 메서드는 하위 클래스에서 재정의할 수 있다.
추가 기능이 필요하다면 하위클래스에서 재정의해서 사용하면 되지만 템플릿 메서드는 로직 흐름을 정의하는 역할을 한다.
이 흐름은 모든 하위 클래스가 공통으로 사용하고 코드를 변경하면 안되기 때문에 final로 선언하는 것이다.

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 인터페이스(Interface)  (0) 2023.02.09
[Java] final 예약어  (0) 2023.02.08
[Java] 추상 클래스(abstract method)  (0) 2023.02.07
[Java] 다운 캐스팅과 instanceof  (0) 2023.02.06
[Java] 다형성(polymorphism)  (0) 2023.02.06