oop의 개념정도로 비즈니스 로직을 자주 코드 했는데, 디자인 패턴등의 책을 보고 적용해보고, 대략 비슷하면서도 정확히 집고 넘어가야할 내용이라고 생각들어 그 중 하나인 템플릿메소드 패턴, 스트레티지, 탬플릿 콜백 패턴에 대해서 쓰임새, 어디에 쓰면 좋을지 등을 생각해보고 정리하고자 한다.
큰 목적은 클래스간의 결합도를 낮추고, 기능응집도를 높이기 위한 작업들이다. 더 풀어 이야기 해보면 클래스간 의존도(특정 클래스의 인스턴스를 만들고 작동하기 위해서 여기저기 클래스들이 얽혀 있게되는 것)을 줄이는 것이다.
이렇게 함으로써 추후 변경되는 사항(요구사항은 언제든 바뀔 수 있기 때문에) 에 최소한의 비용(시간, human resource)를 들임으로써 수정에 용이성을 더할 수 있겠다.
이전에는 추상화를 위한 클래스를 여럿 만듦으로써 메모리등의 성능적인 측면에 의심이 많이 들었는데, 이런 작은 비용때문에 추후 유지관리에 힘들게 된다면 더 손실이 크다고 볼 수 있다. (이것은 자바의 메모리 할당과정을 보면서 조금 안심? 하게 되었는데, 추후 자바의 메모리 구조에 대해 더 포스팅하면서 정리해보도록 하겠다.) 아래는 탬플릿 메소드 패턴이다. 모 클래스( 해당 객체의 행동을 결정하는 행동 함수들을 모두 모아 놓고, 하위 상속객체에서 특정 행동 메소드를 오버라이드 하여 각 파생 클래스의 행동을 다시 만들어줄 수 있다. 행동 프레임?은 같지만 행동의 모양? 특성?이 다를 때 이용할 수 있겠다. 동물이 태어나고 울음 행동을 한다는 흐름은 같은데, 각 동물들의 울음소리가 다르다. 최상위 클래스 animal을 두고 dog, cat이 해당 메소드를 오버라이드 하여 울음 소리가 다르게 된다.
public abstract class Animal {
	public void play(){
		System.out.println("come on");
		playOut();
		runSomething();
		System.out.println("good");
	}
	public abstract void playOut();
	
	void runSomething(){
		System.out.println("HI HI");
	}
}
public class Cat extends Animal{
	@Override
	public void playOut() {
		System.out.println("miya~ miya~");
	}
	@Override
	public void runSomething(){
		System.out.println("고양이 HI HI");
	}
}
public class Dog extends Animal{
	@Override
	public void runSomething(){
		System.out.println("개 HI HI");
	}

	@Override
	public void playOut() {
		// TODO Auto-generated method stub
		System.out.println("wow wow");	
	}
}
public class main {
	public static void main(String[] args) {
		Animal a1 = new Dog();
		Animal a2 = new Cat();
		
		a1.play();
		
		a2.play();
	}
}