[자바와 객체 지향 그리고 스프링] 06. 템플릿 메서드 패턴

코린이서현이·2024년 1월 12일
0

📌 탬플릿 메서드 패턴

하위 클래스가 공통적으로 구현하는 메서드의 순서를 상위클래스에서 템플릿 메서드로 제공하는 패턴이다.
알고리즘을 상위 클래스에서 정의하는 패턴이다.

탬플릿 메서드의 구성 요소

탬플릿 메서드

탬플릿 메서드는 공통로직을 수행하고, 필요한 메서드를 호출한다.
기능의 뼈대와 조건을 구현하교 구격화한다.

상위클래스와 하위 클래스

  • 상위클래스는 템플릿 메서드를 정의한다.
  • 상위클래스는 추상메서드를 가지기 때문에 추상클래스가 된다.
  • 하위 클래스는 상위클래스에서 정의한 메서드의 구현만 맡아서 한다. 또한 계약을 변경할 수 없다.
  • 상위클래스에서 기술을 많이 하면 하위클래스의 자유도가 줄어든다.
  • 하위 클래스에서 재정의를 많이 하면 복잡도가 증가하고, 코드의 중복이 생길 수 있다.

추상메서드와 Hook메서드

추상메서드 : 탬플릿 메서드에서 호출한다. 하위 클래스가 반드시 오버라이딩한다.
Hook 메서드 : 템플릿 메서드에서 호출한다. 하위 클래스는 선택적으로 오버라이딩할 수 있다.

탬플릿 메서드 코드

상위클래스

추상클래스이며, 추상메서드와 HOOK메서드를 가지고 있다.

package OOP06.templateMethodPattern;

abstract public class HandHygiene {
  void washingHands (){
    step1();
    step2();
    System.out.println("손 문지르기");

  }

  void step1(){
    System.out.println("물 묻히기");
  }
  abstract void step2();
}

하위메서드

상위클래스의 추상 메서드는 필수로, HOOK메서드는 선택적으로 구현한다.

package OOP06.templateMethodPattern;

public class HandHygien_Sanitizer extends HandHygiene{
//HOOK메서드도 오버라이딩해줌 
  @Override
  void step1() {
    System.out.println("물없이");
  }

  @Override
  void step2() {
    System.out.println("소독제 사용");
  }
}
package OOP06.templateMethodPattern;

public class HandHygien_Soap extends HandHygiene{
  @Override
  void step2() {
    System.out.println("비누 사용");
  }
}

실행코드

상위클래스참조변수를 가지고, 오버라이딩된 하위메서드의 출력을 보여준다.

package OOP06.templateMethodPattern;

public class Driver {
  public static void main(String[] args) {
    HandHygiene sanitizer = new HandHygien_Sanitizer();
    HandHygiene soap = new HandHygien_Soap();

    sanitizer.washingHands();
    soap.washingHands();
  }

}

실행화면

물없이
소독제 사용
손 문지르기


물 묻히기
비누 사용
손 문지르기

탬플릿 메서드의 특징

  • 중복을 줄이고, 코드의 재사용성을 확보할 수 있다.
  • 핵심 알고리즘의 관리가 쉽습니다.
  • 추상 메서드 재정의를 통한 서브 클래스 확장에 유리합니다.
  • 상위 클래스의 메서드만 보더라도 전체 동작을 이해하기 쉽습니다.
  • ⚠️ 상위 클래스에서 선언된 메서드를 하위 클래스에 구현할 때 그 메서드가 어느 타이밍에 호출되는지 이해하고 있어야 합니다. 상위 클래스의 코드를 볼 수 없으면 구현이 어려울 수 있습니다.

🤔 결국에는...

핵심알고리즘이 존재할 때, 탬플릿 메서드 패턴을 사용하면 상위클래스만으로도 동작을 이해하기 쉽게 만들어주는구나!

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글