Note

[디자인패턴] Template Method Pattern - 템플릿 메서드 패턴

Supreme_YS 2021. 12. 8. 11:02

Template Method Pattern은 일 처리의 단계를 미리 정해놓고 자세한 내용은 나중에 처리하도록 강제하고 싶을 때를 위한 패턴이다. 이를 위해 자바에서 제공하는 추상클래스를 살펴보자.

 

* Abstract Class vs Interface의 비교

public interface Interface {
	public String showName();
}

public abstract class AbstractClass {
	public String showName(); // body가 없으므로 Error!
}

* 자바의 인터페이스는 원하는 메서드를 미리 선언하고, 선언된 메서드를 상속받은 객체(구현체)가 구현하도록 강제하는 역할을 한다.

* 자바의 추상클래스는 인터페이스와 같은 의도이지만,  컴파일러는 "body( { } )"가 없다는 오류를 발생시킨다. 그래서 showName() 메서드도 추상화시켜야 한다.

public abstract class AbstractClass {
	public abstract String showName(); // 메서드를 추상화 시킴
}

 위의 코드블럭과 같은 상황은 추상 메서드를 가지는 추상클래스가 인터페이스가 된 상황이다. 추상 메서드를 통하여 인터페이스처럼 자신을 상속받아 만들어지는 객체에 어떤 메서드를 구현해야 한다는 의도를 프로그래밍할 수 있게 한다.  추가로 추상 메서드는 추상 클래스에서 바로 이용할 수 있다. 아직 상속받은 클래스가 만들어지지 않았더라도 추상 메서드를 이용하는 것이 가능하다. 

public abstract class AbstractClass {
    public abstract String showName();
    public void printMessage() {
    	System.out.print("제 이름은 ");
        System.out.print(showName());
        System.out.print(" 입니다.");
    }
}

class Supreme extends AbstractClass {
    @Override
    public String showName() {
    	return "Supreme";
    }
    
    public static void main(String[] args) {
    	AbstractClass myObject = new Supreme();
        myObject.printMessage();
    }
}

/* 출력결과 : 제 이름은 Supreme 입니다. */

순서 : main 메서드 -> new Supreme(); 생성자를 AbstractClass 타입의 myObject 참조변수에 할당한다 -> 이때 추상 메서드 showName();를 호출해서 값을 리턴해준다. -> 이후 printMessage(); 메서드 호출 -> 출력


추상 메서드의 활용은 거시적 단계를 다룰 수 있게 해준다.  한 마디로 요약하자면, 작업 순서를 정의해두고 구체적인 작업 내용은 알아서 구현하는 것이다. 현실적인 문제로 접근하면 조금 이해가 잘 되긴 한다. 간단한 계란 프라이를 만드는 과정에 빗대어 살펴보자. 계란 프라이를 만드는 순서는 대부분 비슷할 것이다. 아래와 같이 다섯 단계로 순서를 고정했다고 하자.

계란 프라이 요리법 방법
팬을 준비한다 프라이팬, 냄비, 인덕션 용 프라이팬 등
팬을 가열한다 가스레인지, 인덕션, 휴대용 버너 등
팬에 기름을 두른다 식용유, 버터, 카놀라유, 옥수수유 등
계란을 준비한다 왕란, 영양란, 유기농란 등
계란 안의 내용물을 팬에 넣는다 반으로 깨기,  윗 부분만 깨기 등
익힌다 완숙, 반숙

조금 예제가 억지..? 스러운 부분도 없지 않아 있지만, 위에서 정의한 예제를 보면, 순서는 확실히 보장되어 있고 저 순서대로 진행하면 계란 프라이가 완성된다. 하지만 그 상세한 과정 속에서 어떠한 도구와 재료들로 계란 프라이을 완성할 것인지는 개인마다 다르다. 이처럼 템플릿(계란 프라이 요리 순서)의 메서드(방법) 순서를 미리 정의해 놓는 패턴을 Template Method Pattern 이라고 한다.