[java] 템플릿 메소드 패턴

템플릿 메소드 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다. 해당 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고 하위 클래스에서 알고리즘의 구체적인 단계를 구현할 수 있게 합니다. 이를 통해 하위 클래스에서 알고리즘의 일부분을 변경하면서도 전체 알고리즘의 구조는 변경하지 않아도 되게 합니다. 이로써 코드 재사용성이 높아지고 일관성 있게 알고리즘을 적용할 수 있습니다.

템플릿 메소드 패턴의 구조

템플릿 메소드 패턴은 일반적으로 다음과 같은 구조를 가집니다.

public abstract class AbstractClass {
    
    public void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
    }

    protected abstract void primitiveOperation1();

    protected abstract void primitiveOperation2();

}

public class ConcreteClass extends AbstractClass {

    @Override
    protected void primitiveOperation1() {
        // 구체적인 구현 내용
    }

    @Override
    protected void primitiveOperation2() {
        // 구체적인 구현 내용
    }

}

위의 예제에서 AbstractClass는 알고리즘의 구조를 정의하는데 사용되고, ConcreateClass는 구체적인 단계를 구현합니다. templateMethod는 알고리즘의 구조를 정의하고, primitiveOperation1primitiveOperation2는 구체적인 단계를 구현합니다.

예제

예를 들어, 커피를 만드는 프로세스를 템플릿 메소드 패턴으로 구현해보겠습니다.

public abstract class CoffeeTemplate {

    public final void makeCoffee() {
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        addCondiments();
    }

    private void boilWater() {
        System.out.println("물 끓이기");
    }

    private void pourInCup() {
        System.out.println("컵에 따르기");
    }

    protected abstract void brewCoffeeGrinds();

    protected abstract void addCondiments();

}

public class Cappuccino extends CoffeeTemplate {

    @Override
    protected void brewCoffeeGrinds() {
        System.out.println("커피 가루 우려내기");
    }

    @Override
    protected void addCondiments() {
        System.out.println("우유 추가하기");
    }

}

public class Americano extends CoffeeTemplate {

    @Override
    protected void brewCoffeeGrinds() {
        System.out.println("커피 가루 우려내기");
    }

    @Override
    protected void addCondiments() {
        System.out.println("물 추가하기");
    }

}

위의 예제를 보면, CoffeeTemplate 클래스에서 makeCoffee 메소드는 커피 제조 프로세스의 구조를 정의하고, brewCoffeeGrindsaddCondiments는 각각 커피 가루를 우려내는 구체적인 단계와 첨가물을 추가하는 구체적인 단계를 정의합니다. CappuccinoAmericano 클래스에서는 CoffeeTemplate 클래스를 상속받아 구체적인 단계를 구현합니다.

이렇게 함으로써, 템플릿 메소드 패턴을 통해 커피 제조 프로세스의 일부분을 변경할 수 있고, 알고리즘의 구조는 변경하지 않아도 되어 코드 재사용성과 일관성을 유지할 수 있습니다.

결론

템플릿 메소드 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고 하위 클래스에서 구체적인 단계를 구현함으로써, 일관성 있게 알고리즘을 적용하고 코드를 재사용할 수 있는 패턴입니다. 이 패턴은 소프트웨어의 유지보수성과 확장성을 높일 수 있는 중요한 기법 중 하나입니다.

참조 :