[디자인 패턴] 5. Template Method 패턴

김주희's avatar
Jul 23, 2025
[디자인 패턴] 5. Template Method 패턴
💡
핵심 : 공통적인 기능을 추상화 시키는 것
 
패턴은 항상 바로 적용하는 것이 아니다. 바로 적용 가능하다면 보통 이미 내용을 전부 다 알고 적용해본 경험이 있어서 가능한 것이므로 경험조차 없는데 시작부터 바로 패턴을 적용하려고 하는 것은 옳지 않다. 즉 항상 시작은 노가다다..
 
여러 과목의 선생님들을 예시로 템플릿 메서드 패턴을 이해해보자
 

예시 - 선생님들

1. JavaTeacher : 입장하기, 출석부르기, 강의하기, 퇴장하기

우선 선생님은 입장하기, 출석부르기, 강의하기, 퇴장하기 라는 책임을 가진다. 여기서 SRP를 위배하는 것이 아니냐! 라고 할 수 있지만 SRP는 위배까지는 아니고 지키기 위해 노력하는 것이고 또한 선생님이 입장하기라는 책임만 가지면 강의는 하지도 못하고 입장만 하고 끝나는 거다.
그리고 선생님은 수업하기를 하기 위해서 입장하기,출석하기,강의하기,퇴장하기 이 네가지를 하는 것이므로 수업하기라는 책임 하나만 갖는 것도 맞긴 한데 추후 이에 대한 대안이 캡슐화이다. 네 개의 메서드는 private으로 처리하고 수업하기만 public으로 노출시키면 된다.
지금은 템플릿 메서드 패턴을 이해하기 위함이므로 SRP 안지켰잖아요ㅡㅡ 이건 일단 넘어가자
notion image
 
main에서 각각의 메서드를 실행해보자. 실행은 되는데 약간 찜찜하다. 왜냐하면 내부에 실행해야할 메서드의 흐름이 있는데 이 흐름이 호출을 잘못하면 깨지게 된다. 이때 책임은 사용하는 사람이 아닌 설계하는 사람에게 있다. 이처럼 실수할 수 있는 상황을 애초에 만들지 않기 위해서 클래스를 캡슐화시킨다.
 
notion image
 

2. JavaTeacher : 수업시작

수업시작이라는 메서드를 만들어서 입장하기부터 퇴장하기까지의 메서드 순서를 그대로 넣어둔다. 그리고 수업시작이라는 메서드를 제외하고는 전부 private으로 전환한다.
이렇게 되면 캡슐화가 된다.
즉 클래스 내부 로직은 나에게 중요하지 않고 나는 사용만 할 수 있으면 된다.
 
따라서 수업시작이라는 메서드만 노출되어있다. 클래스 이름은 interface가 아니지만 수업시작만 노출되어있으므로 개념상 이 또한 인터페이스라고 할 수 있다. JavaTeacher 클래스를 쓰려면 반드시 수업시작을 사용해야하기 때문에 인터페이스라는 강제성이
 
 
 
notion image
 
 
JavaTeacher, PythonTeacher, HTMLTeacher를 만들다 보면
공통적인것과 공통적이지 않은게 보일텐데 공통적인것만 뽑아내는게 템플릿 메서드 패턴이다
 
강의하기의 구현체는 다 다르다.
나머지는 동일함 → 추상화시키면 됨
추상화
  1. 타입 일치
  1. 공통 기능 묶기
 
근데 미리 추상화시켰으면 공통적인걸 뽑아낼 수 없었을걸 그니까 노가다 먼저하고 설계 생각하고 복잡하게 생각하면 안되고 짜다 보면 보임
 
 
추상화하면서 공통적인건 끌어올린게 템플릿 메서드 패턴임
 
protected 적용전(public)
notion image
notion image
 
protected 적용시
notion image
notion image
Share article

jay0628