템플릿 메서드 패턴(Template Method Pattern)은 객체지향 프로그래밍에서 상위 클래스에서 알고리즘의 구조를 정의하고, 세부적인 단계는 하위 클래스에서 구현하도록 하는 디자인 패턴입니다.
이 패턴은 알고리즘의 공통된 구조는 재사용하면서, 세부 구현을 필요에 맞게 변경할 수 있도록 유연성을 제공합니다.
템플릿 메서드 패턴은 상위 클래스에 알고리즘의 뼈대를 정의하고, 구체적인 단계는 하위 클래스에서 구현하는 구조를 따릅니다. 즉, 상위 클래스에서 템플릿 메서드라는 메서드가 전체 알고리즘의 순서를 정의하고, 그 알고리즘을 구성하는 여러 메서드 중 일부는 하위 클래스에서 구체적인 내용이 구현됩니다.
이 패턴을 사용하면 알고리즘의 기본 흐름은 변경하지 않고도, 특정 단계의 동작만을 변경하는 것이 가능합니다. 이는 코드의 재사용성을 높이고, 유지보수를 용이하게 해줍니다.
템플릿 메서드 패턴은 다음과 같은 구성 요소를 가지고 있습니다.
템플릿 메서드 패턴의 핵심은 상위 클래스에서 정의한 템플릿 메서드가 특정 알고리즘의 전체적인 흐름을 담당한다는 것입니다. 템플릿 메서드는 순서를 고정하고, 그 내부에서 호출되는 메서드 중 일부는 하위 클래스에서 오버라이딩을 통해 구체적으로 변경할 수 있습니다.
예를 들어, 어떤 작업을 수행하는 과정이 다음과 같이 고정된 4단계로 이루어졌다고 가정해봅시다:
여기서 prepare과 notify는 상위 클래스에서 공통으로 구현할 수 있고, execute와 postProcess는 하위 클래스마다 다르게 구현될 수 있습니다. 상위 클래스는 알고리즘의 순서(템플릿 메서드)를 고정하고, 하위 클래스에서 세부적인 단계만 변경하는 식입니다.
다음은 템플릿 메서드 패턴의 간단한 Java 코드 예시입니다.
// 추상 클래스: 알고리즘의 기본 흐름을 정의
abstract class Game {
// 템플릿 메서드: 게임 진행 과정의 큰 틀을 정의
public final void play() {
initialize();
startPlay();
endPlay();
}
// 각 단계는 하위 클래스에서 구체적으로 구현해야 함
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
}
// 하위 클래스 1: 축구 게임
class Football extends Game {
@Override
void initialize() {
System.out.println("축구 게임 준비 완료!");
}
@Override
void startPlay() {
System.out.println("축구 게임 시작!");
}
@Override
void endPlay() {
System.out.println("축구 게임 종료!");
}
}
// 하위 클래스 2: 농구 게임
class Basketball extends Game {
@Override
void initialize() {
System.out.println("농구 게임 준비 완료!");
}
@Override
void startPlay() {
System.out.println("농구 게임 시작!");
}
@Override
void endPlay() {
System.out.println("농구 게임 종료!");
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
Game football = new Football();
football.play(); // 축구 게임의 진행 과정 출력
Game basketball = new Basketball();
basketball.play(); // 농구 게임의 진행 과정 출력
}
}
설명:
답: 게임의 각 레벨이 서로 다른 규칙이나 환경에서 작동한다면, 템플릿 메서드 패턴을 활용하여 각 레벨에 대한 공통된 구조는 유지하면서, 레벨별로 특정 동작을 하위 클래스에서 정의할 수 있습니다. 예를 들어, 추상 클래스에서 initialize(), startPlay(), endPlay() 메서드를 정의하고, 각 레벨을 하위 클래스로 분리하여 레벨별로 다르게 구현할 수 있습니다. 레벨 1, 레벨 2, 레벨 3 등을 하위 클래스로 만들어 각 레벨에 맞는 게임 규칙을 구현하면 됩니다.
답: 하위 클래스에서 수정해야 할 부분이 많아지면 코드 관리가 어려울 수 있습니다. 이를 최적화하려면 다음과 같은 방법을 고려할 수 있습니다:
답: 템플릿 메서드 패턴이 적합하지 않은 상황은 다음과 같습니다: