코코아 패턴에서의 템플릿 메서드는 개발자가 직접 호출 하지 않고 애플리케이션의 진행에 따라 -ondraw나 -dealloc 과 같이 자동으로 호출되는 메서드를 지칭한다. (두메서드 모두 명시적으로 호출해서는 안된다.)  GOF디자인 패턴에서의 템플릿 메서드는 서브클래싱을 통한 추상연산으로 알고리즘을 정의하고 있는 메서드를 지칭하는 데 한마디로 알고리즘의 일부분을 함수호출로 대체 하였는데 이 함수의 실제 동작은 서브클래스에서 지정한다는 것이다.
말도안되는 예를 하나 들자면

@interface Shape{
    CGRect Frame;
}
- (BOOL)start; //그리기를 시작하기 위한 설정을 한다. 
- (void)end; // 그리기를 끝내고 난 후의 설정을 한다.
- (void)draw // 도형을 그린다
- (void)drawing //위 3개의 메소드를 캡슐화한 템플릿 메서드
@end

@implementation Shape 
- (BOOL)start{
//그리기 시작하기 위한 코드
}
- (void)end{
//그리기를 끝내는 코드
}
- (void)drawing{
    if([self start]){
        [self  draw];
        [self end];
    }
}
- (void)draw{
//비어있다.
}
@end

-start는 도형을 그리기 위한 준비 작업을 하는 메서드라고 가정하자. 설정이 정상적으로 완료 되면 TRUE를 반환한다.
-end는 도형을 그린후 메모리 해제와 같은 작업을 하는 메서드라고 가정하자.
그리고 -draw는 도형을 실제로 그리는 메서드이지만 여기에는 아무내용도 없다.
Shape를 생성한후 -drawing를 호출하면 화면에 도형이 그려진다.
@implementation MyShape(Shape)
- (void)draw{
 //도형을 그린다.
}
@end


MyShape는 shape를 상속받았다. 그리고 -draw를 오버라이딩 하여 도형을 그리는 코드를 작성하였다. -drawing에 지정된 알고리즘에 따라 도형을 그리는데 오버라이딩된 draw의 설정에 따라서 알고리즘의 결과가 결정된다.

템플릿 메서드를 사용하는 장점은 상위클래스에서 알고리즘의 기본골격같은 코드들을 지정하고 일부분만 오버라이딩을 통해 재정의 하기때문에 많은 양의 코드를 재사용할 수 있다.
-draw처럼 기본코드가 정의되어 있지 않아서 상위 메서드를 호출하지 않아도 되는 경우도 있지만 기본코드가 정의되어 있을때에는 기본코드가 알고리즘에 중요한 역할을 하기 때문에 반드시 호출해야 하는 경우와 기본코드를 반드시 호출하지 않아도 되는경우도 존재하기 때문에 잘 정리된 문서는 필수 이다.

2011/11/06 23:26 2011/11/06 23:26

trackback url: http://jeonglim.net/blog/trackback/80

1 2 3 4 5 6 ... 69