[Java 디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern)

신효경·2025년 10월 14일

오늘은 자바의 디자인패턴 그 세번째, 템플릿 메서드 패턴에 대해서 정리해보려고 한다. 난 전혀 몰랐는데 자바에 디자인패턴이 정말정말 많다. 어디서 들어본 것도 있고 생전 처음 들어보는 것도 있고.. 이렇게 공부해본 것도 두개나 있고 ㅎㅎ
그 중에서 오늘은 세번째.. 아주 귀여운 수준이다..^^ 중간 중간 새롭게 학습한 내용을 정리하면서 velog에 쓰지는 못하더라도 자바의 디자인 패턴은 부트캠프 기간동안 반드시 전부 다 보고 가리라~ 다짐해본다


📌템플릿 메서드 패턴이란?

알고리즘의 뼈대(순서)를 상위 클래스(추상 클래스)에 정의하고, 알고리즘의 구체적인 단계(구현)는 서브클래스가 재정의하도록 하는 디자인 패턴. 알고리즘의 골격은 바꾸지 않으면서 일부 단계만 재정의하여 동작을 맞춤화할 수 있음.

(대표적인 구조)이미지 출처 : https://yaboong.github.io/design-pattern/2018/09/27/template-method-pattern/


특징

  • 상속이라는 기술을 극대화
  • 알고리즘의 뼈대를 맞추는 것에 초점
  • 재사용성 증가
  • 중복 코드 제거
  • 알고리즘 제어의 중앙화

구성요소

1. AbstractClass (추상 클래스)

  1) templateMethod() (보통 final)

  • 알고리즘의 골격을 정의
  • 여러 단계(메서드)를 호출

  2) primitive operation

  • 서브클래스에서 반드시 구현해야 하는 abstract 메서드

  3) hook

  • 기본 구현을 제공하지만 서브클래스에서 필요시 오버라이드 가능한 선택적 메서드

2. ConcreteClass (구현 클래스)

  • primitive operation들을 구현하여 실제 동작을 제공.

3. Client

  • AbstractClass의 인스턴스(ConcreteClass)를 이용해 알고리즘을 실행

장점 / 단점

장점

  • 알고리즘의 전체 틀을 재사용 가능.
  • 코드 중복 감소 (공통 처리 상위에 위치).
  • 확장(새로운 서브클래스 추가)으로 행동 변화 가능.

단점

  • 상속에 의존하므로 유연성이 떨어질 수 있음(강한 결합).
  • 서브클래스가 알고리즘의 내부를 알아야 하므로 캡슐화가 일부 깨질 수 있음.
  • 상속 깊이가 증가하면 유지보수 어려움.

사용 예시

  • 일부 단계는 변하지만 전체 알고리즘 흐름은 고정일 때.
  • 여러 클래스에서 공통 알고리즘을 공유하고, 단계만 다르게 구현하고 싶을 때.
  • 상속 구조가 허용되고 설계상 확장(서브클래스 추가)이 예상될 때.

예시 코드 (pattern 사용❌)

  • 두 클래스의 뼈대가 유사하기 때문에 중복코드가 많이 발생하고 코드가 길어짐 (게임이 여러 개 생길 경우 더욱 중복이 많아짐)
  • 만약 게임 전체에 공통의 메서드를 추가하게 되면 모든 클래스를 수정해줘야 함

예시 코드 (pattern 사용⭕)

  • 유지보수가 쉽고 상위 클래스에서 일괄 제어 가능
  • 재사용성이 높아지고 단계별 오버라이드 가능

전략(Strategy) 패턴 vs 템플릿 메서드(Template Method) 패턴

1. 공통점

  • 알고리즘을 캡슐화해서 변경이 쉽도록 만드는 패턴
  • 변하는 부분과 변하지 않는 부분을 분리
  • 코드의 중복성을 줄이고 확장성을 높임

2. 차이점

📌전략 패턴

알고리즘을 인터페이스로 정의하고,
런타임에 전략 객체를 바꿔서 행동을 유연하게 교체할 수 있게 한다.

알고리즘 자체를 객체로 캡슐화하여, 런타임에 교체할 수 있게 한다.

📌템플릿 메서드 패턴

알고리즘의 전체 구조(순서)는 상위 클래스에서 정의하고,
일부 세부 단계는 하위 클래스에서 오버라이드로 구현한다

알고리즘의 골격은 고정하고, 단계별 세부 동작만 하위 클래스가 구현하도록 한다


🔹오늘의 나는 무엇을 잘했는지
오늘의 나는.. 중간에 포기하지 않고 꾸준하게 목표한 바를 위해서 달려나가고 있는 것 같다는 생각이 들었다. 가다보면 지치기도 하고 그냥 주저앉아서 쉬고 싶기도 하다. 언제까지 달려야 하는지도 모르겠고 고단할 때가 많다. 그래도 나는 매일 반발자국이라도 앞으로 나아가려고 하는 것 같아서 그 부분이 뿌듯했다.

🔹어떤 문제를 겪었고, 어떻게 해결할지
항상 문제가 되는게 설정부분이다. 보통은 설정이 완료된 상태에서 실습을 위주로 하니까 참 자주 안하게 되는 부분이기도 하다. 근데 이 설정이라는 것이 결국 모든 시작의 토대라서 오류가 나면 익숙하지 않으니까 찾기도 어렵고 오류의 원인도 파악하기 어렵고 무엇보다 낯서니까 너무 당황스럽다. 그렇게 오류를 고치다보면 수업은 그냥 훌쩍 지나가있고 내가 복습해야할 양은 늘어난다... 진짜 내가 싫어하는 가장 최악의 상태... 이것또한 결국 많은 에러를 만나보고 설정도 다양하게 많이 해보는 방법 뿐인 것 같다. 연습에는 장사가 없으니

🔹나만의 복습 방법
이미 학습해서 정리한 코드를 github에 다시 올릴 때 파일 하나하를 다시 보고 동작의 흐름별로 commit을 하다보면 그것 또한 복습에 도움이 되는 것 같다. 잊어버린 코드도 다시 보는 효과가 있고 commit을 작성할 때 코드에 대해서 한줄로 요약을 해야 하니까 내용 이해를 다시 한 번 하기 위해서 노력하게 되는 것 같다.

0개의 댓글