본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



템플릿 메서드 패턴은 상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리의 내용을 구체화하는 것을 말한다. 코드의 중복을 줄이고, 리팩토링에 유리한 패턴으로 상속을 통한 확장 개발 방법으로써 많이 사용되는 패턴중에 하나이다. 즉 쉽게 말해 프로그램 흐름의 틀을 만드는 것이다.


템플릿 메서드 패턴을 이해하기 위해 먼저 Hook 메서드가 무엇인지 알아보자


훅(갈고리 : hook) 메서드란 ?


abstract 키워드를 붙이면 상속 받은 클래스는 반드시 해당 메소드를 구현해야 하지만 abstract 키워드를 붙이지 않고 훅 메소드로 만들면 반드시 구현할 필요가 없다. 상속 받은 클래스에서는 선택적으로 오버라이드할 수 있다.


아래 예제를 보면 speak() 메서드는 추상 클래스에서 구현이 되어 있기 때문에 추상클래스를 상속받은 클래스에서는 오버라이드 할 필요없이 바로 사용해도 된다. 아래 예제에서 훅 메서드는 speak()가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract class Man {
    abstract public void walk();
    
    public void speak() {
        System.out.println("Speak!!");
    }
}
 
class Male extends Man {
    
    @Override
    public void walk() {
        // TODO Auto-generated method stub
        System.out.println("걷는중");
    }
}



훅 메서드에 대해서 간단히 작성해보았고.. 이제 다시 템플릿 메서드에 대한 예제를 아래 적어 보았다.

ktko는 커피와 차를 만들려고 한다. 커피와 홍차는 아래의 절차대로 만들어진다.


 물을 넣고 끓인다.

 물을 넣고 끓인다. 

커피를 넣는다. 

 티를 넣는다.

휘젓는다. 

휘젓는다. 

커피를 마신다.

차를 마신다. 


여기에서 공통되는 부분은 물을 넣고 끓인다. 그리고 휘젓는다가 잇고 차이점은 첨가물이 달라지고 마시는 결과물이 달라지게 된다. 결국 위의 차이점을 가지고 공통되는 부분을 정리해 보았더니 아래와 같이 나왔다.


 물을 넣고 끓인다.

 첨가물을 넣는다. 

 휘젓는다. 

 음료를 마신다. 


공통되는 부분을 추상클래스인 Drink로 만들어 공통되는 부분과 아닌 부분을 분리하였고, 커피와 차는 추상클래스인 Drink를 상속받아 사용하고 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
abstract class Drink {
    protected String name;
    
    public void getDrink() {
        boil();
        additives();
        stir();
        drink();
    }
    
    //물을 끓이고.
    public void boil() {
        System.out.println("물을 끓입니다.");
    }
    
    //첨가물을 넣고.
    abstract public void additives();
    
    //휘젓고.
    public void stir() {
        System.out.println("휘젓습니다.");
    }
    
    //마신다.
    abstract void drink();
}
 
class Coffee extends Drink {
    
    public Coffee() {
        super.name = "커피";
    }
 
    @Override
    public void additives() {
        // TODO Auto-generated method stub
        System.out.println(super.name + "을 추가합니다.");
    }
 
    @Override
    void drink() {
        // TODO Auto-generated method stub
        System.out.println(super.name + "을 마십니다.");
    }
}
 
class Tea extends Drink {
    
    public Tea() {
        super.name = "홍차";
    }
    
    @Override
    public void additives() {
        // TODO Auto-generated method stub
        System.out.println(super.name + "을 추가합니다.");
    }
 
    @Override
    void drink() {
        // TODO Auto-generated method stub
        System.out.println(super.name + "을 마십니다.");
    }
}
 
 
public class TemplatePattern {
    public static void main(String[] args) {
        Tea tea = new Tea();
        tea.getDrink();
        
        Coffee coffee = new Coffee();
        coffee.getDrink();
    }
}



템플릿 메서드 패턴을 요약하자면 "상위 클래스의 견본 메서드에서 하위 클래스가 오버리이딩한 메서드를 호출하는 패턴"이라고 할 수 있다. 템플릿 메서드 패턴은 의존 역전 원칙(DIP)를 활용하고 있음을 알 수 있다. 템플릿 메서드 패턴은 추상 메소드와 훅 메소드를 적절히 사용해서 전체적인 알고리즘의 틀을 만들수 있다. 그 결과로 유연하게 기능을 변경할 수 있도록 하고자 할 때 사용하면 유용하다.