제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



자바 디자인 패턴 4 - Template Method

1. Template Method 패턴은..

전체적인 로직에는 큰 차이가 없지만 일부분만 바뀌는 비스무레한 몇 가지 클래스가 있다고 칩시다. 일부분을 위해서 전체를 새로 작성할 필요는 없지요. Template Method에서는 전반적인 구현은 상위클래스(주로 Abstract로 만듭니다.)에서 담당하고 부분적인 곳의 구체적인 구현은 하위클래스가 담당합니다.

2. 예제

------------- 템플릿 메쏘드가 있는 Abstract Class ---------------
package ch04_TemplateMethod;

public abstract class Worker {
    protected abstract void doit();
    public final void work(){
        System.out.println("출근");
        doit();
        System.out.println("퇴근");
    }
}
------------- Abstract Class 구현체 1 ---------------------
package ch04_TemplateMethod;

public class Designer extends Worker {
    @Override
    protected void doit() {
        System.out.println("열심히 디자인");
    }
}
------------- Abstract Class 구현체 2 ---------------------
package ch04_TemplateMethod;

public class Gamer extends Worker {
    @Override
    protected void doit(){
        System.out.println("열심히 껨질");
    }
}
------------- 테스트 코드 ---------------------
package ch04_TemplateMethod;

public class Test {
    public static void main(String[] args) {
        Worker designer = new Designer();
        designer.work();
        Worker gamer = new Gamer();
        gamer.work();
    }
}

Worker 클래스의 work()는 내부적으로 abstract 메쏘드인 doit()을 호출하고 있습니다. work() 안에서 전반적인 로직이 수행되고, 로직 중 각각의 특성을 탈 수 있는 부분을 doit() 안에서 해결합니다. doit()은 실제 구현체에서 알아서 구현하면 됩니다.
work() 를 final로 구현한 것은 하위 클래스에서 전체적인 로직 변경을 하지 못하도록 하는 것입니다.

3. Template Method 사용시 고려사항

Template Method는 위험성을 어느 정도 내포하고 있습니다. 바로 전체적인 프로세스가 바뀌는 것입니다. 상위 클래스에서 변동이 일어날 경우 하위 클래스가 안전하리라는 보장은 할 수 없습니다. 상위 클래스에 abstract method가 하나만 추가되어도 모든 하위 클래스는 변경이 불가피합니다. 나중에 발생하는 작은 변경이 큰 재난을 일으킬 수 있습니다. 이것은 상속이 가지는 위험성입니다.
그래서 Template Method 패턴을 사용할 때는 상위클래스에 대한 심사숙고가 반드시 필요합니다. 
일반적으로는 전체적인 프로세스를 담당하는 로직을 final 메쏘드로 정의하기도 하지만, 프로세스 자체의 변경을 고려해 상속의 여지를 남겨두기 위해 final 메쏘드로 정의하지 않기도 합니다.
또 한가지는 하위 클래스의 메쏘드들은 외부에서 직접 호출되지 않고 상위 클래스의 Template Method에서 호출됩니다. 그래서 주로 protected 로 선언됩니다. 그런 이유로 외부의 호출과 구체적인 구현체의 메쏘드가 실행되기까지의 과정을 쉽게 파악하기가 어렵습니다. 문제가 생겼을 때 추적이 어려울 수도 있다는 것이죠.

4. JAVA API에 있는 Template Method

아마 JDK안에 가장 많이 들어 있는 패턴 중 하나가 Template Method일 겁니다.
Servlet 을 개발할 때, HttpServlet을 상속 받아 doGet()doPost() 를 구현합니다. HttpServlet의 service() 에서 하위구현체의 doGet()이나 doPost() 등으로 분기를 시킵니다.(그 외에도 do머시기하는 메쏘드가 있지만 생략합니다.) Template Method의 전형적인 사용법 중 하나입니다. 분기를 담당하는 부분은 상위클래스에 구체적으로 구현하고, 분기된 이후의 행동은 하위구현체에 떠 넘기는 방법이죠.

HashSet이라는 Set의 구현체를 아시죠? 얘는 Set이니까 중복 데이터를 요소로 가지지 않습니다. 그럼 '같다 다르다'의 기준은 뭘까요? 내용이 같으면 될까요? 아니면, 실제 레퍼런스가 같아야 할까요?
이름에 나와 있듯 hash 값이 일단 같아야 합니다. hash값은 Object의 hashCode() 메쏘드를 이용하여 체크합니다. 그리고 나서 또 Object의 equals() 메쏘드를 호출합니다. 그래서 Set에 넣을 요소에 대해서는 hashCode() 메쏘드와 equals() 메쏘드가 잘 구현되어있어야 합니다. 그렇지 않으면, 중복된 데이터가 삽입될 수 있습니다.
HashSet의 경우는 위에서 설명한 Template Method와는 좀 다릅니다. 상위클래스와 하위클래스의 상관관계 같은 게 없죠. 다만 나도 모르는 사이에 내가 구현한 메쏘드가 호출될 수 있기 때문에 Template Method가 될 수 있습니다.(HashSet의 add(SomeClass) 메쏘드는 SomeClass의 hashCode()와 equals()를 호출합니다. )
정확히 말하면 Set.add(SomeClass) 메쏘드는 Set.contains(SomeClass) 메쏘드를 호출하고 그 안에서 다시 SomeClass.hashCode()와 SomeClass.equals(SomeClass) 를 호출합니다. ( 중간에 좀 더 복잡한 과정이 있지만, 설명할 필요는 없으므로 생략합니다. )
여기서 UI관련 각종 EventListener들도 그런 맥락에서 Template Method라고 볼 수 있습니다. event 발생에서 리스너까지의 과정을 알 필요가 없습니다. 대략 어떤 이벤트를 발생시키면, 어떤 이벤트 리스너한테 전달된다 정도만 알면 되죠. 이벤트 핸들링에는 그 외에도 여러가지 패턴들이 적용되어 있습니다.

by 삼실청년 | 2007/09/27 11:22 | 컴터질~ | 트랙백(13) | 핑백(2) | 덧글(12)

트랙백 주소 : http://iilii.egloos.com/tb/3806897
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Confluence: .. at 2014/05/09 14:48

제목 : 템플릿 메소드 패턴(박)
패턴목적   이 패턴이 나오게 된 목적을 설명합니다.   설명 패턴을 설명합니다. 그림이 ...more

Tracked from Confluence: .. at 2014/05/09 14:48

제목 : 템플릿 메소드 패턴(박)
패턴목적   이 패턴이 나오게 된 목적을 설명합니다.   설명 패턴을 설명합니다. 그림이 ...more

Tracked from Confluence: .. at 2014/05/09 16:36

제목 : 템플릿 메소드 패턴(박)
패턴목적   이 패턴이 나오게 된 목적을 설명합니다.   설명 패턴을 설명합니다. 그림이 ...more

Tracked from Confluence: .. at 2014/05/09 16:37

제목 : 템플릿 메소드 패턴(박)
패턴목적   이 패턴이 나오게 된 목적을 설명합니다.   설명 패턴을 설명합니다. 그림이 ...more

Tracked from Confluence: .. at 2014/05/09 16:41

제목 : 템플릿 메소드 패턴(박)
1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의...more

Tracked from Confluence: .. at 2014/05/09 16:43

제목 : 템플릿 메소드 패턴(박)
1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의...more

Tracked from Confluence: .. at 2014/05/09 17:05

제목 : 템플릿 메소드 패턴(박)
1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의...more

Tracked from Confluence: .. at 2014/05/13 12:48

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Tracked from Confluence: .. at 2014/07/31 16:01

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Tracked from Confluence: .. at 2014/07/31 16:56

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Tracked from Confluence: .. at 2014/08/04 18:41

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Tracked from Confluence: .. at 2014/08/04 19:15

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Tracked from Confluence: .. at 2014/08/21 00:55

제목 : 템플릿 메소드 패턴(박)
패턴목적 1. 템플릿 메소드 패턴이란?  템플릿 메소드 패턴에서는 메소드에서 알고리즘의 골...more

Linked at java design patt.. at 2017/05/31 09:25

... 4. 자바 디자인 패턴 4 &#8211; Template Method</A> 5. 자바 디자인 패턴 5 – Singleton 6. 자바 디자인 패턴 6 – Strategy 7. 자바 디자인 패턴 7 – Composite 8. 자바 디자인 패턴 8 – Decorator 9. 자바 디자인 패턴 9 <a href="http://blog.sina.com.cn/s/blog_8e40db350102wt27.html">港股 ... more

Linked at 자바 디자인 패턴 종류 &#8.. at 2017/09/26 09:15

... erator 2. 자바 디자인 패턴 2 – Adapter 3. 자바 디자인 패턴 3 &#8211; Factory Method 4. 자바 디자인 패턴 4 &#8211; Template Method 5. 자바 디자인 패턴 5 – Singleton 6. 자바 디자인 패턴 6 – Strategy 7. 자바 디자인 패턴 ... more

Commented by 깜모 at 2009/01/07 10:14
좋은 글 감사합니다..
Commented by 삼실청년 at 2009/01/09 16:48
하핫~ 고맙습니다. 좋은 하루 되세요.
Commented by 지돌스타 at 2009/07/29 11:25
좋은글 넘 잘보고 갑니다.
Commented by 삼실청년 at 2009/08/22 05:38
캬캬 버려진 이곳을 찾아주시니 고맙습니다.
다시 개간 사업 좀 해야할텐데 이래저래 구찮음에 허덕이느라...
Commented by zeros at 2010/01/28 11:45
퍼갈께요 ^^ 감사합니다
Commented by 삼실청년 at 2010/02/02 21:44
하핫~ 별 말씀을요~ 열공하세요~~^^
Commented at 2011/03/22 10:31
비공개 덧글입니다.
Commented by 삼실청년 at 2011/04/15 19:36
핫 고맙습니다. 방치 상태 홈피라 이제 봤네요.
Commented by negabaro at 2012/06/26 13:30
역시 삼실형님 존경합니다
Commented by 삼실청년 at 2012/06/27 23:24
뉘시온지요?-_-;
Commented by 적외선 at 2014/04/16 16:38
좋은 글 잘 보고 갑니다.
퍼가겠습니다.~
Commented by 삼실청년 at 2014/05/09 14:12
네넹~ 맘껏 퍼가세요!

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶