๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programming Language ๐Ÿ’ป/Java โ˜•

[Java] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) - ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด(Strategy Pattern)์ด๋ž€?

by lxvxxu 2025. 10. 18.

 

2025.10.18 - [๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ] - [Java] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) - 3. ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

 

[Java] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) - 3. ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?

3) ๋””์ž์ธ ํŒจํ„ด์ด๋ž€? ๐Ÿง ๋ฐ˜๋ณต๋˜๋Š” ์„ค๊ณ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒ€์ฆ๋œ “์ด๋ฆ„ ์žˆ๋Š” ํ•ด๋ฒ•”์˜ ์นดํƒˆ๋กœ๊ทธ์žฅ์ : ๊ณตํ†ต ์–ดํœ˜ ์ œ๊ณต(์˜์‚ฌ์†Œํ†ต↑), ์žฌ์‚ฌ์šฉ์„ฑ↑, ์œ ์ง€๋ณด์ˆ˜์„ฑ↑์ฃผ์˜: “ํŒจํ„ด ์ ์šฉ์„ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ์–ต์ง€๋กœ

lxvxxu.tistory.com


๐Ÿง  5.4 ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด์ด๋ž€?

“์ „๋žต(Strategy)”์„ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด

  • ์ „๋žต์ด๋ž€ ์–ด๋–ค ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ–‰๋™ ๋ฐฉ์‹, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๊ทœ์น™์ด๋‹ค.
  • ์‹คํ–‰ ์ค‘์—๋„ ์ „๋žต(ํ–‰๋™ ๋ฐฉ์‹)์„ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠนํžˆ ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ์ฒ˜๋Ÿผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณต๊ฒฉ์ด๋‚˜ ํ–‰๋™์„ ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

โœ… ํŠน์ง•

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

๐Ÿ’ฌ ์˜ˆ์‹œ ์ƒํ™ฉ

  • ์กฐ๋ฆฌ๋ฒ•์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ผ ๋•Œ
  • ํŒŒ์ผ์˜ ์••์ถ• ๋ฐฉ์‹์ด ๋‹ค๋ฅผ ๋•Œ
  • ๊ฒฐ์ œ ๋ฐฉ์‹(ํ˜„๊ธˆ, ์นด๋“œ, ๋ฉค๋ฒ„์‹ญ ๋“ฑ)์ด ๋‹ค๋ฅผ ๋•Œ
  • ์ž๋ฐ”์˜ Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ ๋ฐฉ์‹ ์„ ํƒ

๐Ÿ“‹ ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด ๊ตฌ์กฐ ์š”์•ฝ

์š”์†Œ์„ค๋ช…
์ด๋ฆ„ ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€(Strategy)
๋ฌธ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์ด ์กด์žฌํ•ด ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ if๋ฌธ์œผ๋กœ ์„ ํƒํ•˜๋Š” ์ฝ”๋“œ ๋ฐœ์ƒ (OCP ์œ„๋ฐ˜)
ํ•ด๊ฒฐ ๊ณตํ†ต ๋ถ€๋ถ„์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ , ์‹คํ–‰ ์‹œ์ ์— ์ ์ ˆํ•œ ์ „๋žต ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…
๊ฒฐ๊ณผ ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋• ์ƒˆ๋กœ์šด Strategy๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ. ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ ์—†์Œ โœ…

๐Ÿœ ์‚ฌ๋ก€ 2 – ๋ผ๋ฉด ์กฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ

๐Ÿฅฃ ๋‹ค์–‘ํ•œ ์กฐ๋ฆฌ ๋ฐฉ๋ฒ•

  • ๊ธฐ๋ณธ ์กฐ๋ฆฌ (cook)
  • ๋ณถ์Œ ๋ผ๋ฉด (cookWithoutBroth)
  • ์น˜์ฆˆ ๋ผ๋ฉด (cookWithCheese)
  • ์‹์ดˆ ๋ผ๋ฉด (cookWithVinegar)
  • ์šฐ์œ  ๋ผ๋ฉด (cookWithMilk)

Version 1 – if๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌ

class Ramen {
    enum CookingMode { GENERAL, WITHOUT_BROTH, WITH_CHEESE, WITH_VINEGAR, WITH_MILK }
    private CookingMode mode = CookingMode.GENERAL;

    public void setCookMode(CookingMode mode) { this.mode = mode; }

    public void cook() {
        switch (mode) {
            case GENERAL: cookWithGeneralRecipe(); break;
            case WITHOUT_BROTH: cookWithoutBroth(); break;
            case WITH_CHEESE: cookWithCheese(); break;
            case WITH_VINEGAR: cookWithVinegar(); break;
            case WITH_MILK: cookWithMilk(); break;
        }
    }
}
 

โŒ ๋ฌธ์ œ์ 

  • ์ƒˆ๋กœ์šด ์กฐ๋ฆฌ๋ฒ•์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค cook()์„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ
  • ์ฝ”๋“œ๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง → OCP ์œ„๋ฐ˜

Version 2 – ์ƒ์†์œผ๋กœ ๋ถ„๋ฆฌ

abstract class Ramen { public abstract void cook(); }

class GeneralRamen extends Ramen {
    public void cook() { System.out.println("์ผ๋ฐ˜ ์กฐ๋ฆฌ๋ฒ•์œผ๋กœ ๋“์ด๊ธฐ"); }
}
class CheeseRamen extends Ramen {
    public void cook() { System.out.println("์น˜์ฆˆ ๋ผ๋ฉด์œผ๋กœ ๋“์ด๊ธฐ"); }
}
 

โŒ ๋ฌธ์ œ์ 

  • ์ƒˆ๋กœ์šด ์Œ์‹ ์ข…๋ฅ˜๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๊ณ„์† ๋งŒ๋“ค์–ด์•ผ ํ•จ
  • cook() ํ•จ์ˆ˜ ์ค‘๋ณต ๋ฐœ์ƒ

โœ… Version 3 – ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด ์ ์šฉ

interface Recipe {
    void cook();
}

class Ramen {
    private Recipe recipe = new GeneralRamenRecipe();

    public void setRecipe(Recipe recipe) { this.recipe = recipe; }
    public void performCook() { recipe.cook(); }
}

class GeneralRamenRecipe implements Recipe {
    public void cook() { System.out.println("์ผ๋ฐ˜ ์กฐ๋ฆฌ๋ฒ•์œผ๋กœ ๋“์ด๊ธฐ"); }
}

class CheeseRamenRecipe implements Recipe {
    public void cook() { System.out.println("๋ผ๋ฉด์„ ๋“์ธ ํ›„ ์น˜์ฆˆ ๋„ฃ๊ธฐ"); }
}
public class Main {
    public static void main(String[] args) {
        Ramen ramen = new Ramen();
        ramen.setRecipe(new CheeseRamenRecipe());
        ramen.performCook();
    }
}

 

โœ… ๊ฒฐ๊ณผ

  • ์ƒˆ๋กœ์šด ์กฐ๋ฆฌ๋ฒ• ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ๋ถˆํ•„์š”
  • ์‹คํ–‰ ์ค‘์—๋„ ์กฐ๋ฆฌ๋ฒ•(์ „๋žต)์„ ๊ต์ฒด ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋Œ€ํญ ํ–ฅ์ƒ

๐Ÿ”š ์ •๋ฆฌ

ํ•ญ๋ชฉ๋‚ด์šฉ
ํ•ต์‹ฌ ๊ฐœ๋… ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ „๋žต)์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์บก์Аํ™”ํ•˜๊ณ  ์‹คํ–‰ ์‹œ ๊ต์ฒด
์ฃผ์š” ์ด์  OCP ์ค€์ˆ˜, ์ฝ”๋“œ ์ค‘๋ณต ์ œ๊ฑฐ, ์œ ์—ฐํ•œ ๊ตฌ์กฐ
๋Œ€ํ‘œ ์˜ˆ์‹œ ๋กœ๋ด‡ ๊ณต๊ฒฉ/์ด๋™ ๋ฐฉ์‹, ๋ผ๋ฉด ์กฐ๋ฆฌ๋ฒ•, ์ •๋ ฌ ๋ฐฉ์‹ ์„ ํƒ
ํ‚ค์›Œ๋“œ ์บก์Аํ™”, ์œ ์—ฐ์„ฑ, ์ „๋žต ๊ต์ฒด, ์ธํ„ฐํŽ˜์ด์Šค