[백준] 1929번 소수 구하기
in Algorithms on BOJ
에라토스테네스의 체
in Algorithms on BOJ
에라토스테네스의 체
in Study on Design Pattern
싱글턴 패턴이란 인스턴스를 단 하나만 만들어 사용하기 위한 패턴이다. 윈도우 매니져, 쓰레드 풀 매니져 등의 경우, 인스턴스를 여러 개 만들게 되면 자원을 낭비하게 되거나 오류를 발생할 수 있기 때문에 오직 하나의 인스턴스만 만들어 사용하도록 하는 것이 이 패턴의 ㄴ목적이다.
in Study on Design Pattern
커피를 만드는 Coffee 클래스와 홍차를 만드는 Tea 클래스가 있다고 하자. 커피와 홍차를 만드는 과정은 각각 prepareRecipe( ) 메소드에 정의되어있다.
Coffee 클래스
public class Coffee {
void prepareRecipe(){
boilWater(); // 물을 끓인다.
brewCoffeeGrinds(); // 끓는 물에 커피를 우려낸다.
pourInCup(); // 커피를 컵에 따른다.
addSugarAndMilk(); // 설탕과 우유를 넣는다.
}
public void boilWater() {
Sysetm.out.println("물을 끓이는 중...");
}
public void brewCoffeeGrinds() {
Sysetm.out.println("커피를 우려내는 중...");
}
public void pourInCup(){
System.out.println("컵에 따르는 중...");
}
public void addSugarAndMilk(){
System.out.println("설탕과 우유를 추가하는 중...");
}
}
Tea 클래스
public class Tea {
void prepareRecipe() {
boilWater(); // 물을 끓인다.
steepTeaBag(); // 끓는 물에 차를 우려낸다.
pourInCup(); // 차를 컵에 따른다.
addLemon(); // 레몬을 추가한다.
}
public void boilWater(){
Sysetm.out.println("물을 끓이는 중...");
}
public void steepTeaBag(){
Sysetm.out.println("끓는 물에 차를 우려내는 중...");
}
public void pourInCup(){
System.out.println("컵에 따르는 중...");
}
public void addLemon(){
System.out.println("레몬을 추가하는 중...");
}
}
이때 boilWater() 와 pourInCup() 메소드는 커피 클래스와 홍차 클래스에서 완전히 중복된다. 따라서 중복되는 부분을 다음과 같이 추상화 시킬 수 있다.
Coffee 클래스와 Tea 클래스를 만드는 순서를 다시 한번 살펴보면 만드는 방법의 알고리즘이 다음과 같이 똑같다는 것을 알 수 있습니다.
(1) 물을 끓인다.
(2) 뜨거운 물을 이용하여 커피 또는 홍차를 우려낸다.
(3) 만들어진 음료를 컵에 따른다.
(4) 각 음료에 맞는 첨가물을 추가한다.
새로운 prepareRecipe() 메소드를 CaffeineBeverage 수퍼클래스에 정의해보면 다음과 같습니다.
public abstract class CaffeineBeverage{
final void prepareRecipe() {
boilWater(); // 물을 끓인다.
brew(); // 뜨거운 물을 이용하여 커피 또는 홍차를 우려낸다.
pourInCup(); // 차를 컵에 따른다.
addCondiments(); // 각 음료에 맞는 첨가물을 추가한다.
}
abstract void brew();
abstract void addCondiments();
public void boilWater() {
System.out.println("물 끓이는 중...");
}
public void pourInCup() {
System.out.println("컵에 따르는 중...");
}
}
다음으로 Coffee 클래스와 Tea 클래스를 다시 정의해보면 다음과 같이 정의할 수 있습니다.
public class Coffee extends CaffeineBeverage {
public void brew() {
Sysetm.out.println("필터로 커피를 우려내는 중...");
}
public void addCondiments(){
System.out.println("설탕과 우유를 추가하는 중...");
}
}
public class Tea extends CaffeineBeverage{
public void brew() {
Sysetm.out.println("차를 우려내는 중...");
}
public void addCondiments() {
System.out.println("레몬을 추가하는 중...");
}
}
수퍼클래스 CaffeineBeverage의 prepareRecipe()를 템플릿 메소드 (Template Method) 라고 한다.
템플릿 메소드 (Template Method) 에서는 알고리즘의 각 단계(step)들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 구현되어 제공된다.
다음과 같이 후크를 활용할 수 있습니다.
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
public void boilWater() {
Sysetm.out.println("물 꿇이는 중...");
}
public void pourInCup() {
System.out.println("컵에 따르는 중...");
}
boolean customerWantsCondiments() { // Hook
return true;
}
}
public class Coffee extends CaffeineBeverage{
public void brew() {
Sysetm.out.println("필터로 커피 우려내는 중...");
}
public void addCondiments() {
System.out.println("우유와 설탕을 추가하는 중...");
}
public boolean customerWantsCondiments() {
String answer = getUserInput();
if (answer.toLowerCase().startsWith("y"_)) {
return true;
} else {
return false;
}
}
}
2019.09.24~ Blog 시작 !!