과거의나야도와줘

Spring 02. Template Method Pattern - 디자인패턴 본문

개발공부노트/Spring

Spring 02. Template Method Pattern - 디자인패턴

o_60__o 2022. 10. 12. 00:46
728x90
주의!
공부하면서 제가 이해한 대로 쓰는거라 잘못된 부분이 있을 수 있습니다
만약 잘못된 부분이 있다면 댓글로 가르쳐주시면 감사합니다

 

 

01. Template Method Pattern

 지금부터 학생과 교직원이라는 두가지 클래스를 간단하게 만들어 볼겁니다

public abstract class Person {
	private String name;
	public abstract void doSomething();
}
public class Staff extends Person{
	private String name;

	@Override
	public void dailySchedule() {
		System.out.println("학교에 온다.");
		System.out.println("일을 한다.");
		System.out.println("교직원 식당에서 밥을 먹는다.");
		System.out.println("집에 간다.");
	}
}
public class Student extends Person{
	private String name;
	
     	@Override
	public void dailySchedule() {
		System.out.println("학교에 온다.");
		System.out.println("공부를 한다.");
		System.out.println("학식을 먹는다.");
		System.out.println("집에 간다.");
	}
}

 먼저 Person이라는 추상클래스를 만들고 이를 상속받아 두 가지 클래스를 만들었는데요

개발자의 피가 흐르신다면 학교에 오고 집에 가는 저 중복되는 부분 때문에 벌써부터 눈살을 찌푸리셨을 겁니다.

 

그럼 이제 Template Method Pattern으로 멋들어지게 한 번 중복을 제거해 볼까요

 

public abstract class Person {
	private String name;
	
	public abstract void doSomething();
	
	public void dailySchedule() {
		System.out.println("학교에 온다.");
		doSomething();
		System.out.println("집에 간다.");
	}
}

 Person 추상클래스를 먼저 볼까요. dailySchedule()에 중복되는 부분을 남겨두고 나머지는 doSomething()부분을 추상메소드로 만듭니다. 추후 이 추상클래스를 상속받는 클래스에서 이 메소드를 Override한 뒤 동적바인딩을 해서 상속받은 클래스마다 다른 결과를 출력하게 할 겁니다.

public class Staff extends Person{

	@Override
	public void doSomething() {
		System.out.println("일을 한다.");
		System.out.println("교직원 식당에서 밥을 먹는다.");
	}

}
public class Student extends Person{

	@Override
	public void doSomething() {
		System.out.println("공부를 한다.");
		System.out.println("학식을 먹는다.");
	}

}

 이렇게 상속 받는 클래스에서는 중복되는 부분은 작성할 필요 없겠죠

 

 지금 템플릿 메소드 패턴에 대해 정말 간단하게만 알아봤는데요 뭔가 불편한 점이 생길 것 같지 않나요?

 

 

 조교 클래스를 한번 만들어 보겠습니다.

public class TA extends Person{

	@Override
	public void doSomething() {
		System.out.println("일을 한다.");
		System.out.println("학식을 먹는다.");
	}
	
}

 조교들은 학교에 와서 일을 하고 학식을 먹는다고 해봅시다.

조교 클래스의 "일을 한다"와 교직원 클래스의 "일을 한다"가 중복되고

조교 클래스의 "학식을 먹는다"와 학생 클래스의 "학식을 먹는다가 중복이 되네요?

 

이를 해결하기 위해

"일을 한다" 부분만 빼서 Person의 dailySchedule()에 넣으려니 학생클래스도 일을 해버리게 되고

"학식을 먹는다" 부분만 빼서 넣으려니 교직원클래스가 학식을 먹어버리게 되는 일이 생깁니다.

 

이를 통해 템플릿 메소드 패턴은 수직적으로 기능을 끌어내는 것이기 때문에

이렇게 수평적인 부분에서의 중복은 해결하지 못한다는 것을 알 수 있습니다.

 

"일을 한다", "공부를 한다" , "교직원 식당에서 밥을 먹는다", "학식을 먹는다" 라는 코드를 중복해서 쓰지않고 한 번씩만 쓰고 싶은게 우리의 새로운 목표인데 이를 어떻게 달성할 수 있을까요?

 

바로 각각의 행동들을 클래스로 쪼개버리고 학생, 교직원, 조교 클래스에서 이 행동들을 담은 클래스를 참조하는 방법이 있습니다. 이를 전략패턴(Strategy Pattern)이라고 하는데요 이는 다음 포스트에서 다뤄볼게요

 

728x90
Comments