전략 패턴
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 69번째.
Strategy Pattern은 알고리즘군을 정의하고, 각 알고리즘을 자체 클래스에 캡슐화하며, 서로 바꿔 사용할 수 있도록 하는 행위 디자인 패턴입니다. 특정 동작을 하드코딩하는 대신, 해당 알고리즘을 사용하는 코드를 변경하지 않고 런타임에 알고리즘을 교체할 수 있습니다.
여러 결제 방법을 지원하는 결제 시스템을 상상해 보세요. Strategy Pattern이 없다면 복잡한 조건부 로직을 작성하게 될 것입니다. Strategy Pattern을 사용하면 각 결제 방법이 자체 전략이 됩니다.
interface PaymentStrategy {
void pay(int amount);
}
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " via Credit Card");
}
}
class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " via PayPal");
}
}context class는 전략에 대한 참조를 보유하고 작업을 해당 전략에 위임합니다. 핵심은 context가 어떤 concrete 전략을 사용하고 있는지 알지 못한다는 것입니다. context가 아는 것은 interface뿐입니다.
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}이제 결제 동작을 동적으로 변경할 수 있습니다:
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100); // 신용카드로 100 결제됨
cart.setPaymentStrategy(new PayPalPayment());
cart.checkout(50); // PayPal로 50 결제됨Strategy Pattern은 작업을 수행하는 여러 방법이 있고 그사이를 쉽게 전환하고 싶을 때 특히 유용합니다. 새로운 결제 방법을 추가하려면 PaymentStrategy를 implements하는 새 클래스만 만들면 됩니다. 기존 코드를 변경할 필요가 없습니다.
챌린지
쉬움Strategy Pattern을 사용하여 텍스트 formatting 시스템을 구축해 봅시다! 런타임에 서로 다른 formatting 전략을 교체하여 텍스트를 다양한 방식으로 변환할 수 있는 시스템을 만들 것입니다. 여러 출력 형식을 지원해야 하는 애플리케이션에 적합합니다.
코드를 네 개의 파일로 구성합니다:
TextFormatter.java: 모든 formatting 전략이 implement할TextFormatterinterface를 Define합니다. 문자열을 받아 formatted 버전을 반환하는 단일 메서드String format(String text)을 declare해야 합니다.Formatters.java:TextFormatterinterface를 implement하는 세 가지 concrete 전략을 Create합니다:UpperCaseFormatter- 텍스트를 모두 대문자로 변환합니다.LowerCaseFormatter- 텍스트를 모두 소문자로 변환합니다.TitleCaseFormatter- 각 단어의 first 글자를 capitalizes하고 나머지는 소문자로 만듭니다. 단어는 공백으로 구분됩니다.TextEditor.java: formatting 전략을 사용하는 context class를 Create합니다.TextEditor에는 다음이 있어야 합니다:현재
TextFormatter전략을 hold하는 private field.active formatting 전략을 changes하는
setFormatter(TextFormatter formatter)메서드.현재 formatter를 텍스트에 적용하고
Published: [formatted text]를 출력하는publishText(String text)메서드. formatter가 설정되지 않았다면 변경 없이Published: [original text]를 출력해야 합니다.Main.java: strategy 시스템을 하나로 결합합니다! 두 개의 입력을 받습니다. formatting할 텍스트(String)와 formatting style(String:"upper","lower", 또는"title")입니다.TextEditor를 Create하고, formatter를 설정하기 전에 먼저 입력 텍스트와 함께publishText를 call합니다(기본 동작을 보여 줌).그런 다음 style 입력을 Based로 appropriate formatter 전략을 설정하고, 같은 텍스트와 함께
publishText를 다시 call하여 formatted 결과를 보여 줍니다.
두 개의 입력을 순서대로 받습니다. formatting할 텍스트(String)와 formatting style(String)입니다.
예를 들어 입력이 hello world와 title이면 출력은 다음과 같습니다:
Published: hello world
Published: Hello WorldTextEditor는 구체적인 formatting 로직을 전혀 알지 못한다는 점에 주목하세요. 단순히 현재 설정된 전략에 작업을 위임합니다. 따라서 editor 코드를 수정하지 않고도 새로운 formatting style을 쉽게 추가할 수 있습니다!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String style = scanner.nextLine();
// TODO: TextEditor 인스턴스 생성하기
// TODO: 입력 텍스트로 publishText 호출하기 (포맷터를 설정하기 전에)
// TODO: 스타일 입력("upper", "lower" 또는 "title")에 따라,
// 적절한 포맷터를 설정하고 publishText를 다시 호출하기
}
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러