반응형
템플릿 메서드는 추상 클래스를 활용한 예시 중 하나다.
'템플릿(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 |