Template 메서드 패턴
템플릿 메서드 패턴은 알고리즘의 구조를 정의하는 추상 클래스와 실제 구현을 수행하는 하위 클래스로 구성된 디자인 패턴입니다.
추상 클래스에서는 알고리즘의 골격을 정의하며, 하위 클래스에서는 그 골격에 따라 실제 구현을 제공합니다.
이렇게 하여 알고리즘의 구조를 변경하지 않고 일부 구현을 변경할 수 있습니다.
예제 코드
abstract class Beverage {
// 템플릿 메소드
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew(); // 추상 메소드
abstract void addCondiments(); // 추상 메소드
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
}
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("Brewing coffee");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
class Tea extends Beverage {
@Override
void brew() {
System.out.println("Steeping tea");
}
@Override
void addCondiments() {
System.out.println("Adding lemon");
}
}
public class Main {
public static void main(String[] args) {
Coffee coffee = new Coffee();
Tea tea = new Tea();
System.out.println("Preparing coffee:");
coffee.prepareRecipe();
System.out.println("\nPreparing tea:");
tea.prepareRecipe();
}
}
위 예시에서 Beverage
추상 클래스는 템플릿 메소드인 prepareRecipe
를 포함하며, 일부 구현을 하위 클래스에게 위임하는 brew
와 addCondiments
추상 메소드를 가집니다.
Coffee
와 Tea
클래스는 Beverage
를 상속받아 각각 brew
와 addCondiments
메소드를 구현하였습니다.
이렇게 함으로써, Beverage
클래스에서 정의된 알고리즘의 구조를 변경하지 않고도, Coffee
와 Tea
클래스에서 각각 다른 구현을 제공할 수 있습니다.
Static과 Final로 더 똑똑하게 사용하자
템플릿 메서드 패턴에서 final
이나 static
을 사용하면 추상 클래스의 메서드에 대한 변경을 제한하고 안정성을 높일 수 있습니다.
final 메서드
final
키워드가 붙은 메서드는 서브클래스에서 오버라이드할 수 없습니다.
템플릿 메서드 패턴에서는 일부 공통 로직을 제공하는 메서드를 final
로 선언하여 서브클래스가 해당 메서드를 수정(Overriding(재정의)하지 못하게 함으로써, 전체 프로세스에 일관성을 유지할 수 있습니다.
이렇게 하면 템플릿 메서드를 사용하는 곳에서 예기치 않은 동작 변경을 방지할 수 있습니다.
static 메서드
static
메서드는 클래스 레벨에서 실행되며, 인스턴스화 없이 호출할 수 있습니다.
이는 메서드가 인스턴스 변수에 의존하지 않고, 메서드의 동작이 인스턴스의 상태에 영향을 받지 않음을 의미합니다.
이러한 특성 때문에, 템플릿 메서드 패턴에서 static
메서드를 사용하여 일부 로직을 공통적으로 제공하고, 이를 서브클래스에서 변경하지 못하게 할 수 있습니다.
결국, 템플릿 메서드 패턴에서 final
과 static
을 사용하는 이유는 추상 클래스에서 제공하는 일부 메서드를 고정하고, 안정성과 일관성을 유지하기 위함입니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
추상클래스(Abstract Class) (1) | 2023.04.27 |
---|---|
프레임워크와 라이브러리의 차이 (0) | 2023.04.27 |
다운 캐스팅(DownCasting) (0) | 2023.04.27 |
가상 함수(Virtual Method) (0) | 2023.04.27 |
Is-A와 HAS-A 또는 Inheritance와 Composition - 🐥 카카오 테크 캠퍼스 (0) | 2023.04.27 |