봄수의 연구실

Template 메서드 패턴 본문

DEV/Java

Template 메서드 패턴

berom 2023. 4. 27. 11:57

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를 포함하며, 일부 구현을 하위 클래스에게 위임하는 brewaddCondiments 추상 메소드를 가집니다.
CoffeeTea 클래스는 Beverage를 상속받아 각각 brewaddCondiments 메소드를 구현하였습니다.
이렇게 함으로써, Beverage 클래스에서 정의된 알고리즘의 구조를 변경하지 않고도, CoffeeTea 클래스에서 각각 다른 구현을 제공할 수 있습니다.

Static과 Final로 더 똑똑하게 사용하자

템플릿 메서드 패턴에서 final이나 static을 사용하면 추상 클래스의 메서드에 대한 변경을 제한하고 안정성을 높일 수 있습니다.

final 메서드
final 키워드가 붙은 메서드는 서브클래스에서 오버라이드할 수 없습니다.
템플릿 메서드 패턴에서는 일부 공통 로직을 제공하는 메서드를 final로 선언하여 서브클래스가 해당 메서드를 수정(Overriding(재정의)하지 못하게 함으로써, 전체 프로세스에 일관성을 유지할 수 있습니다.
이렇게 하면 템플릿 메서드를 사용하는 곳에서 예기치 않은 동작 변경을 방지할 수 있습니다.

static 메서드
static 메서드는 클래스 레벨에서 실행되며, 인스턴스화 없이 호출할 수 있습니다.
이는 메서드가 인스턴스 변수에 의존하지 않고, 메서드의 동작이 인스턴스의 상태에 영향을 받지 않음을 의미합니다.
이러한 특성 때문에, 템플릿 메서드 패턴에서 static 메서드를 사용하여 일부 로직을 공통적으로 제공하고, 이를 서브클래스에서 변경하지 못하게 할 수 있습니다.

결국, 템플릿 메서드 패턴에서 finalstatic을 사용하는 이유는 추상 클래스에서 제공하는 일부 메서드를 고정하고, 안정성과 일관성을 유지하기 위함입니다.

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90