자바 디자인 패턴 중 스트래티지 패턴: 유연한 알고리즘 선택과 변경

자바 디자인 패턴 중 스트래티지 패턴

Strategy Pattern

자바 개발에서 객체지향 프로그래밍을 구현하는 데 디자인 패턴은 필수적으로 사용됩니다. 디자인 패턴은 개발자들이 공통적으로 발생하는 문제를 해결하기 위해 고안되었으며, 이를 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다. 스트래티지 패턴은 디자인 패턴 중 하나로, 여러 알고리즘을 캡슐화하고, 이들을 캡슐화한 알고리즘들을 상호 교환이 가능하도록 만드는 패턴입니다.

이 글에서는 스트래티지 패턴의 개념과 특징, 자바에서의 구현 방법, 그리고 스트래티지 패턴이 어떻게 유연한 알고리즘 선택과 변경에 활용되는지에 대해 알아보겠습니다.

스트래티지 패턴의 개념과 특징

스트래티지 패턴은 "알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있게 만든다"는 디자인 패턴입니다. 이 패턴은 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있도록 만들어줍니다.

스트래티지 패턴은 다음과 같은 특징을 가집니다.

  • 알고리즘을 독립적으로 다룰 수 있습니다.
  • 전략을 쉽게 변경할 수 있습니다.
  • 전략을 캡슐화하여 재사용성을 높일 수 있습니다.

스트래티지 패턴은 객체지향 개발에서 다형성을 적용한 것입니다. 다형성은 상속, 인터페이스, 추상클래스 등을 이용하여 객체의 타입을 다양하게 사용할 수 있는 기능입니다. 스트래티지 패턴에서는 이러한 다형성을 이용하여 알고리즘들을 캡슐화하고, 이들을 교환하여 사용할 수 있습니다.

자바에서 스트래티지 패턴의 구현 방법

스트래티지 패턴을 구현하기 위해서는 다음과 같은 요소들이 필요합니다.

  • 전략 인터페이스(Strategy Interface): 스트래티지 패턴에서는 알고리즘들을 캡슐화하여 사용합니다. 이를 위해서는 각 알고리즘들이 동일한 인터페이스를 구현하여야 합니다.
  • 전략 클래스(Strategy Class): 전략 클래스는 전략 인터페이스를 구현한 클래스입니다. 각각의 전략 클래스는 다른 알고리즘을 구현하게 됩니다.
  • 컨텍스트 클래스(Context Class): 컨텍스트 클래스는 전략 인터페이스를 가지고, 전략 클래스를 사용하는 클래스입니다. 이 클래스에서는 전략 클래스를 교환하여 사용할 수 있습니다.

다음은 자바에서 스트래티지 패턴을 구현하는 코드입니다. 이 코드에서는 전략 인터페이스로 SortStrategy를 사용하고, QuickSortStrategy와 MergeSortStrategy 클래스로 각각의 알고리즘을 구현합니다.

public interface SortStrategy {
    public void sort(int[] array);
}

public class QuickSortStrategy implements SortStrategy {
    public void sort(int[] array) {
        // quick sort algorithm
    }
}

public class MergeSortStrategy implements SortStrategy {
    public void sort(int[] array) {
        // merge sort algorithm
    }
}

public class SortContext {
    private SortStrategy strategy;

    public SortContext(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public void sort(int[] array) {
        strategy.sort(array);
    }
}

위 코드에서는 SortContext 클래스에서 setStrategy 메소드를 통해 전략 클래스를 교환하고, sort 메소드를 호출하여 전략 클래스의 sort 메소드를 실행합니다.

스트래티지 패턴의 활용: 유연한 알고리즘 선택과 변경

스트래티지 패턴은 유연한 알고리즘 선택과 변경에 활용됩니다. 이 패턴을 사용하면 알고리즘을 독립적으로 다룰 수 있으며, 전략 클래스를 교환하여 다양한 알고리즘을 사용할 수 있습니다. 이를 통해 알고리즘의 선택과 변경이 쉬워지므로, 유지보수성이 향상됩니다.

다음은 스트래티지 패턴을 사용하여 유연한 알고리즘 선택과 변경을 구현한 코드입니다. 이 코드에서는 전략 인터페이스로 PaymentStrategy를 사용하고, CreditCardStrategy와 PayPalStrategy 클래스로 각각의 결제 방법을 구현합니다.

public interface PaymentStrategy {
    public void pay(double amount);
}

public class CreditCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.dateOfExpiry = dateOfExpiry;
    }

    public void pay(double amount) {
        // credit card payment
    }
}

public class PayPalStrategy implements PaymentStrategy {
    private String email;
    private String password;

    public PayPalStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public void pay(double amount) {
        // paypal payment
    }
}

public class ShoppingCart {
    private List items;

    public void addItem(Item item) {
        items.add(item);
    }

    public void removeItem(Item item) {
        items.remove(item);
    }

    public double calculateTotal() {
        double sum = 0;
        for (Item item : items) {
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentStrategy) {
        double amount = calculateTotal();
        paymentStrategy.pay(amount);
    }
}

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        cart.addItem(new Item("Item 1", 10.0));
        cart.addItem(new Item("Item 2", 20.0));

        PaymentStrategy paymentStrategy = new CreditCardStrategy("John Doe", "1234567890123456", "123", "12/24");
        cart.pay(paymentStrategy);

        paymentStrategy = new PayPalStrategy("john.doe@example.com", "password");
        cart.pay(paymentStrategy);
    }
}

위 코드에서는 ShoppingCart 클래스에서 pay 메소드를 호출할 때, PaymentStrategy 인터페이스를 구현한 CreditCardStrategy나 PayPalStrategy 클래스를 전달합니다. 이를 통해 다양한 결제 방법을 사용할 수 있습니다.

결론

스트래티지 패턴은 객체지향 개발에서 다형성을 적용하여 알고리즘을 캡슐화하고, 이를 교환하여 사용할 수 있도록 만드는 디자인 패턴입니다. 이 패턴은 알고리즘의 독립성을 보장하고, 알고리즘의 선택과 변경을 쉽게 만들어줍니다. 자바에서는 인터페이스와 클래스를 이용하여 스트래티지 패턴을 구현할 수 있으며, 이를 통해 유연한 알고리즘 선택과 변경을 구현할 수 있습니다.