Menu
Coddy logo textTech

전략 패턴

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 55번째.

Strategy 패턴은 알고리즘의 family를 정의하고, 각 알고리즘을 자체 class에 캡슐화하며, 런타임에 서로 바꿔 사용할 수 있도록 하는 행동 패턴입니다. 동작을 하드코딩하는 대신 원하는 strategy를 객체에 주입합니다.

이 패턴은 세 부분으로 구성됩니다. 알고리즘 계약을 정의하는 전략 interface, 서로 다른 동작을 구현하는 구체적인 전략 class, 그리고 전략을 사용하는 context class입니다:

public interface IPaymentStrategy
{
    void Pay(decimal amount);
}

public class CreditCardPayment : IPaymentStrategy
{
    public void Pay(decimal amount) => 
        Console.WriteLine($"Paid {amount} via Credit Card");
}

public class PayPalPayment : IPaymentStrategy
{
    public void Pay(decimal amount) => 
        Console.WriteLine($"Paid {amount} via PayPal");
}

public class ShoppingCart
{
    private IPaymentStrategy _paymentStrategy;
    
    public void SetPaymentMethod(IPaymentStrategy strategy)
    {
        _paymentStrategy = strategy;
    }
    
    public void Checkout(decimal total)
    {
        _paymentStrategy.Pay(total);
    }
}

컨텍스트(ShoppingCart)는 어떤 결제 방식을 사용하는지 알지 못합니다. 단지 제공된 전략에서 Pay()를 호출할 뿐입니다:

var cart = new ShoppingCart();

cart.SetPaymentMethod(new CreditCardPayment());
cart.Checkout(99.99m);  // 신용카드로 99.99 결제됨

cart.SetPaymentMethod(new PayPalPayment());
cart.Checkout(49.99m);  // PayPal로 49.99 결제됨

Strategy 패턴은 복잡한 조건부 로직을 제거합니다. 새로운 결제 방법을 추가하려면 IPaymentStrategy를 구현하는 새 클래스를 만들면 됩니다. ShoppingCart를 변경할 필요가 없습니다. 이를 통해 코드는 확장에는 열려 있고 수정에는 닫혀 있게 됩니다.

challenge icon

챌린지

쉬움

Strategy 패턴을 사용하여 배송비 계산기를 만들어 봅시다. 배송 방법마다 서로 다른 가격 계산 알고리즘이 있으며, 시스템은 핵심 주문 처리 로직을 변경하지 않고 런타임에 이러한 방법 사이를 전환할 수 있어야 합니다.

코드를 세 개의 파일로 구성합니다:

  • ShippingStrategy.cs: Shipping namespace에 IShippingStrategy interface를 Define하고, double을 반환하는 CalculateCost(double weight) method를 포함합니다. 그런 다음 세 개의 구체적인 전략 class를 create합니다:
    • StandardShipping - weight * 1.5로 cost를 계산합니다
    • ExpressShipping - weight * 3.0 + 5.0로 cost를 계산합니다(고정 express 요금 포함)
    • OvernightShipping - weight * 5.0 + 10.0으로 cost를 계산합니다(더 높은 기본 요금이 적용되는 프리미엄 서비스)
  • OrderProcessor.cs: 동일한 namespace에 OrderProcessor class를 Create합니다. 이 class는 shipping strategy를 사용하는 Context입니다. 다음을 포함해야 합니다:
    • 현재 IShippingStrategy를 hold할 private field
    • shipping strategy를 변경하는 SetShippingMethod(IShippingStrategy strategy) method
    • current strategy를 사용하여 shipping cost를 calculate하고 반환하는 ProcessOrder(double weight) method
  • Program.cs: OrderProcessor를 Create하고 런타임에 shipping strategies를 어떻게 교체할 수 있는지 보여 주어 모든 것을 하나로 구성합니다. strategy를 변경하는 것만으로 동일한 processor가 서로 다른 알고리즘을 사용해 costs를 계산할 수 있습니다.

두 개의 input을 받습니다:

  • shipping method type: standard, express 또는 overnight
  • decimal number 형식의 package weight(예: 4.5)

OrderProcessor를 Create하고, input type에 Based하여 appropriate shipping strategy를 설정한 다음 order를 process하고 calculated cost를 print합니다.

예를 들어 input이 express4.5라면 output은 다음과 같아야 합니다:

18.5

이는 Strategy 패턴의 강력함을 보여 줍니다. OrderProcessor에는 shipping calculation logic 자체가 포함되어 있지 않습니다. 단순히 전달받은 strategy에 작업을 위임하므로, processor를 전혀 수정하지 않고도 새로운 shipping methods(예: DroneDelivery)를 쉽게 추가할 수 있습니다!

직접 해보기

using System;
using Shipping;

class Program
{
    public static void Main(string[] args)
    {
        // 입력 읽기
        string shippingType = Console.ReadLine();
        double weight = Convert.ToDouble(Console.ReadLine());

        // TODO: OrderProcessor 인스턴스 생성

        // TODO: shippingType ("standard", "express", or "overnight")에 따라,
        // 적절한 배송 전략을 생성하고 프로세서에 설정

        // TODO: 주문을 처리하고 계산된 비용을 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C# 컴파일러