본문 바로가기
기타/Design Pattern

Template Method Pattern

by 코딩하는 랄로 2023. 11. 26.
728x90

Template Method Pattern

템플릿 메소드 패턴이란 상속을 이용하여 슈퍼 클래스의 기능을 확장하기 위해 사용하는 디자인 패턴이다. 공통적으로 중복되는 변하지 않는 기능은 슈퍼 클래스에 선언하고 자주 변경되는 특정 작업(기능)의 경우, 서브 클래스에서 확장하여 구현하도록 하는 방법이다.

 

슈퍼 클래스가 추상 메소드 또는 오버라이드 가능한 메소드를 정의하여 이를 이용한 기본 알고리즘을 구현하기 때문에 서브 클래스에서 해당 기능을 확장하는 방법도 두 가지가 있다. 먼저 추상 메소드를 구현하는 방법과 템플릿 메소드 패턴에서 슈퍼 클래스가 오버라이드 가능하게 만든 메소드를 훅 메소드라고 하는데 이를 서브 클래스에서 오버라이드하는 방법이 있다.

 

설명에서도 알 수 있듯이, 여러 메소드로 이루어진 특정 알고리즘이 특정 부분만 다른 형태로 변경이 필요할 경우에 해당 알고리즘을 템플릿 메소드 패턴을 통해 구현하면, 알고리즘의 기본 골격은 변경하지 않으면서도 특정 부분을 재정의하여 다른 동작을 할 수 있게 되는 것이다.

 

또는 반대로, 2개 이상의 프로그램의 동작이 기본이 되는 틀이 똑같을 때 기본 틀이 되는 기능들은 슈퍼클래스에 구현하고 각 프로그램의 다른 기능들은 각 프로그램에서 관리하도록 만들 때에도 사용할 수 있다.

 

 

 

장단점

템플릿 메소드는 변하지 않는 코드는 슈퍼 클래스에 구현하여 서브 클래스는 상속만 받으면 되기 때문에 중복된 코드가 줄어든다는 장점을 가진다. 또한 모든 기능의 구현을 서브 클래스에만 일임하는 것이 아닌 변하는 부분만을 구현하도록 함으로써 서브 클래스의 비중을 줄이고 핵심 로직의 관리 또한 용이하게 한다. 이러한 장점과 함께 확장성 또한 가지는 템플릿 메소드 패턴을 사용하면 코드가 조금 더 객체지향의 가까워질 수 있게 된다.

 

단점으로는 추상 메소드가 많아지게 되면 그를 구현하는 클래스의 관리도 복잡해질 수 있고 상속을 받는 클래스가 많아질 경우 클래스 간의 관계 또한 꼬일 수 있다. 또한, 추상 클래스를 이용하여 확장성을 확보하는 것은 좋지만 자바에서는 다중 클래스 상속을 허용하지 않기 때문에, 슈퍼 클래스를 상속 받는 서브 클래스는 다른 기능을 위한 상속은 받지 못한다는 단점 또한 존재한다.

 

 

 

사용 예제

Add 클래스를 선언한 후, 숫자 두개를 더하는 부분은 int, float, double로 나누어서 구현을 한 코드이다.

abstract class Add {

    public <T extends Number> void print(T num1, T num2) {
        beforeAdd();
        add(num1, num2);
        afterAdd();
    }

    public void beforeAdd() {
        System.out.println("Add two numbers");
    }

    public void afterAdd() {
        System.out.println("Add success!!");
    }

    abstract <T extends Number> void add(T num1, T num2);
}

// 정수 더하기
class IntegerAdd extends Add {

    @Override
    public <T extends Number> void add(T num1, T num2) {
        System.out.print("Integer : ");
        Integer n1 = (Integer)num1;
        Integer n2 = (Integer)num2;
        System.out.println(n1 + n2);
    }
}

// 실수 더하기
class FloatAdd extends Add {

    @Override
    public <T extends Number> void add(T num1, T num2) {
        System.out.print("Float : ");
        Float n1 = (Float)num1;
        Float n2 = (Float)num2;
        System.out.println(n1 + n2);
    }
}

// double 더하기
class DoubleAdd extends Add {

    @Override
    public <T extends Number> void add(T num1, T num2) {
        System.out.print("Double : ");
        Double n1 = (Double)num1;
        Double n2 = (Double)num2;
        System.out.println(n1 + n2);
    }
}


public class Main {
    public static void main(String[] args) {
        IntegerAdd ia = new IntegerAdd();
        ia.print(1, 3);

        System.out.println("-".repeat(20));

        FloatAdd fa = new FloatAdd();
        fa.print(1.1f, 3.2f);

        System.out.println("-".repeat(20));

        DoubleAdd da = new DoubleAdd();
        da.print(1.2, 3.4);
    }
}

/* 출력결과 :
Add two numbers
Integer : 4
Add success!!
--------------------
Add two numbers
Float : 4.3
Add success!!
--------------------
Add two numbers
Double : 4.6
Add success!!
*/

 

Add two numbers, Add success!! 문구는 공통된 부분이기 때문에 이는 슈퍼 클래스에서 구현하여 주고 add에 해당하는 부분만 서브클래스에서 확장하여 구현한 것이다.

 

 

 

728x90

'기타 > Design Pattern' 카테고리의 다른 글

Singleton Pattern  (0) 2023.11.16