๐Ÿ• ํ”ผ์ž ๋ฐฐ๋‹ฌ๋„ ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค? ์ „๋žต ํŒจํ„ด(Strategy Pattern)

์„ํ˜„ยท2025๋…„ 2์›” 24์ผ

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
24/43

๐Ÿค” ์ „๋žต ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

์ „๋žต ํŒจํ„ด(Strategy Pattern)์€ ๊ฐ์ฒด์˜ ํ–‰๋™(์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, ์–ด๋–ค ๋™์ž‘(์ „๋žต)์ด ํ•„์š”ํ•  ๋•Œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์ „๋žต์„ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”ผ์ž ๊ฐ€๊ฒŒ์—์„œ ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

  • ๋ฐฐ๋‹ฌ์›์ด ์ง์ ‘ ๋ฐฐ๋‹ฌ ๐Ÿšฒ
  • ๋“œ๋ก  ๋ฐฐ๋‹ฌ ๐Ÿš
  • ๋งค์žฅ์—์„œ ํ”ฝ์—… ๐Ÿ•

๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ถˆํŽธํ•˜๊ฒ ์ง€์š”? ๐Ÿคฏ

์ „๋žต ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ๋‹ฌ ๋ฐฉ์‹(์ „๋žต)์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด ๋†“๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ „๋žต์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ• ์ „๋žต ํŒจํ„ด์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์š”์†Œ

์ „๋žต ํŒจํ„ด์—๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ Context(๋ฌธ๋งฅ) โ†’ ์ „๋žต์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ•  (ํ”ผ์ž ์ฃผ๋ฌธ ์‹œ์Šคํ…œ ๐Ÿ•)
2๏ธโƒฃ Strategy(์ „๋žต) ์ธํ„ฐํŽ˜์ด์Šค โ†’ ์‹คํ–‰๋  ์ „๋žต์„ ์ •์˜ (๋ฐฐ๋‹ฌ ๋ฐฉ์‹ ๐Ÿ›ต)
3๏ธโƒฃ Concrete Strategy(๊ตฌ์ฒด์ ์ธ ์ „๋žต) โ†’ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ „๋žต ๊ตฌํ˜„์ฒด๋“ค (์˜ˆ: ๋ฐฐ๋‹ฌ์› ๋ฐฐ๋‹ฌ, ๋“œ๋ก  ๋ฐฐ๋‹ฌ, ๋งค์žฅ ํ”ฝ์—… ๐ŸŽฏ)


๐Ÿ’ก ์ „๋žต ํŒจํ„ด ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๊ธฐ

์ด์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ดํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ƒ

1๏ธโƒฃ ๋ฐฐ๋‹ฌ ์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ

// ๋ฐฐ๋‹ฌ ์ „๋žต์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
public interface DeliveryStrategy {
    void deliver(String order);
}

์ด๋™ ๋ฐฉ์‹(์ „๋žต)์„ ์ •๋ฆฌํ•ด ๋†“์€ DeliveryStrategy ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
์ด์ œ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐฐ๋‹ฌ ์ „๋žต์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


2๏ธโƒฃ ๋ฐฐ๋‹ฌ ๋ฐฉ์‹ ๊ตฌํ˜„ํ•˜๊ธฐ (๋ฐฐ๋‹ฌ์›, ๋“œ๋ก , ๋งค์žฅ ํ”ฝ์—…)

// ๋ฐฐ๋‹ฌ์›์ด ์ง์ ‘ ๋ฐฐ๋‹ฌํ•˜๋Š” ์ „๋žต
public class BikeDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String order) {
        System.out.println("๐Ÿšฒ ๋ฐฐ๋‹ฌ์›์ด " + order + "๋ฅผ ๋ฐฐ๋‹ฌํ•ฉ๋‹ˆ๋‹ค!");
    }
}

// ๋“œ๋ก ์ด ๋ฐฐ๋‹ฌํ•˜๋Š” ์ „๋žต
public class DroneDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String order) {
        System.out.println("๐Ÿš ๋“œ๋ก ์ด " + order + "๋ฅผ ๋ฐฐ๋‹ฌํ•ฉ๋‹ˆ๋‹ค!");
    }
}

// ๋งค์žฅ์—์„œ ์ง์ ‘ ํ”ฝ์—…ํ•˜๋Š” ์ „๋žต
public class PickupDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String order) {
        System.out.println("๐Ÿ  ๊ณ ๊ฐ์ด ์ง์ ‘ " + order + "๋ฅผ ํ”ฝ์—…ํ•˜๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค!");
    }
}

โœ”๏ธ BikeDelivery โ†’ ๋ฐฐ๋‹ฌ์›์ด ๋ฐฐ๋‹ฌ ๐Ÿšฒ
โœ”๏ธ DroneDelivery โ†’ ๋“œ๋ก ์ด ๋ฐฐ๋‹ฌ ๐Ÿš
โœ”๏ธ PickupDelivery โ†’ ๊ณ ๊ฐ์ด ์ง์ ‘ ๊ฐ€์ ธ๊ฐ ๐Ÿ 

์ด์ œ ํ”ผ์ž ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์—์„œ ์ด ์ „๋žต์„ ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ•


3๏ธโƒฃ ํ”ผ์ž ์ฃผ๋ฌธ ์‹œ์Šคํ…œ (Context) ๋งŒ๋“ค๊ธฐ

public class PizzaOrder {
    private final DeliveryStrategy deliveryStrategy;
    private String order;

    public PizzaOrder(DeliveryStrategy deliveryStrategy, String order) {
        this.deliveryStrategy = deliveryStrategy;
        this.order = order;
    }

    public void deliverOrder() {
        deliveryStrategy.deliver(order);
    }
}

ํ”ผ์ž ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์ด DeliveryStrategy๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ์ „๋žต์„ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


4๏ธโƒฃ ์‹คํ–‰ ์ฝ”๋“œ (Main)

public class Main {
    public static void main(String[] args) {
        // ๋ฐฐ๋‹ฌ์›์ด ๋ฐฐ๋‹ฌํ•˜๋Š” ์ฃผ๋ฌธ
        PizzaOrder bikeOrder = new PizzaOrder(new BikeDelivery(), "ํŽ˜ํผ๋กœ๋‹ˆ ํ”ผ์ž");
        bikeOrder.deliverOrder(); // ๐Ÿšฒ ๋ฐฐ๋‹ฌ์›์ด ํŽ˜ํผ๋กœ๋‹ˆ ํ”ผ์ž๋ฅผ ๋ฐฐ๋‹ฌํ•ฉ๋‹ˆ๋‹ค!

        // ๋“œ๋ก ์ด ๋ฐฐ๋‹ฌํ•˜๋Š” ์ฃผ๋ฌธ
        PizzaOrder droneOrder = new PizzaOrder(new DroneDelivery(), "๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ ํ”ผ์ž");
        droneOrder.deliverOrder(); // ๐Ÿš ๋“œ๋ก ์ด ๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ ํ”ผ์ž๋ฅผ ๋ฐฐ๋‹ฌํ•ฉ๋‹ˆ๋‹ค!

        // ๊ณ ๊ฐ์ด ์ง์ ‘ ๋งค์žฅ ํ”ฝ์—…ํ•˜๋Š” ์ฃผ๋ฌธ
        PizzaOrder pickupOrder = new PizzaOrder(new PickupDelivery(), "ํ•˜์™€์ด์•ˆ ํ”ผ์ž");
        pickupOrder.deliverOrder(); // ๐Ÿ  ๊ณ ๊ฐ์ด ์ง์ ‘ ํ•˜์™€์ด์•ˆ ํ”ผ์ž๋ฅผ ํ”ฝ์—…ํ•˜๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค!
    }
}

โœ”๏ธ bikeOrder๋Š” ๋ฐฐ๋‹ฌ์›์ด ๋ฐฐ๋‹ฌ ๐Ÿšฒ
โœ”๏ธ droneOrder๋Š” ๋“œ๋ก ์ด ๋ฐฐ๋‹ฌ ๐Ÿš
โœ”๏ธ pickupOrder๋Š” ๊ณ ๊ฐ์ด ์ง์ ‘ ํ”ฝ์—… ๐Ÿ 

๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅด์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰


โœ… ์ „๋žต ํŒจํ„ด์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

๐ŸŽฏ ์ „๋žต ํŒจํ„ด์˜ ์žฅ์ 

โœ” ์œ ์—ฐํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ โ†’ ์ƒˆ๋กœ์šด ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
โœ” ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€ โ†’ ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ฐฐ๋‹ฌ ์ „๋žต์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โœ” ๊ฐ์ฒด์ง€ํ–ฅ ์›์น™ ์ค€์ˆ˜ โ†’ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ์ง€์ผœ ํ™•์žฅ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ „๋žต ํŒจํ„ด์˜ ๋‹จ์ 

โŒ ํด๋ž˜์Šค ์ˆ˜ ์ฆ๊ฐ€ โ†’ ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ด ๋งŽ์•„์ง€๋ฉด ํŒŒ์ผ์ด ๋งŽ์•„์ง€๊ณ  ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โŒ ์ „๋žต์„ ์ดํ•ดํ•ด์•ผ ํ•จ โ†’ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ๊ฒฐ๋ก 

์ „๋žต ํŒจํ„ด์€ ํ–‰๋™(์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

โœ… ํ”ผ์ž ๋ฐฐ๋‹ฌ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
โœ… ์ „๋žต์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
โœ… ํ•˜์ง€๋งŒ ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž์ž ์ด์ œ ๋‹ค๋“ค ๋ฆฌํŒฉํ† ๋ง์„ ํ•ด๋ณด๋Ÿฌ ๊ฐ‘์‹œ๋‹ค! ๐Ÿš€

0๊ฐœ์˜ ๋Œ“๊ธ€