6_oHji
6_oHji
ν™˜μ˜ν•©λ‹ˆλ‹€☺
GitHub   Gmail
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (62)
    • πŸ’‘ DEEP DIVE (17)
      • PATTERN (17)
    • πŸ“ 끄적끄적 (4)
    • 🌈 EXPERIENCE (3)
    • πŸ’» PROJECT (3)
    • πŸ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

κ°œμΈμ •λ³΄

  • ν‹°μŠ€ν† λ¦¬ ν™ˆ
  • μŠ€ν† λ¦¬
  • 포럼
  • 둜그인
hELLO Β· Designed By μ •μƒμš°.
6_oHji
6_oHji
Deep Dive Into Design Patterns - μ „λž΅ νŒ¨ν„΄
πŸ’‘ DEEP DIVE/PATTERN

Deep Dive Into Design Patterns - μ „λž΅ νŒ¨ν„΄

2024. 5. 20. 17:22

πŸ’‘ μ „λž΅(Strategy) νŒ¨ν„΄μ΄λž€?

μ•Œκ³ λ¦¬μ¦˜λ“€μ˜ νŒ¨λ°€λ¦¬λ₯Ό μ •μ˜ν•˜κ³ , 각 νŒ¨λ°€λ¦¬λ₯Ό λ³„λ„μ˜ ν΄λž˜μŠ€μ— 넣은 ν›„ κ·Έλ“€μ˜ 객체듀을 μƒν˜Έκ΅ν™˜ν•  수 μžˆλ„λ‘ ν•˜λŠ” 행동 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. μ‹€ν–‰(λŸ°νƒ€μž„) 쀑에 μ•Œκ³ λ¦¬μ¦˜ μ „λž΅μ„ μ„ νƒν•˜μ—¬ 객체 λ™μž‘μ„ μ‹€μ‹œκ°„μœΌλ‘œ λ°”λ€Œλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, μ–΄λ–€ 일을 μˆ˜ν–‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ—¬λŸ¬κ°€μ§€μΌ λ•Œ, λ™μž‘λ“€μ„ 미리 μ „λž΅μœΌλ‘œ μ •μ˜ν•¨μœΌλ‘œμ¨ μ†μ‰½κ²Œ μ „λž΅μ„ ꡐ체할 수 있게 ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ•Œκ³ λ¦¬μ¦˜ λ³€ν˜•μ΄ λΉˆλ²ˆν•˜κ²Œ ν•„μš”ν•œ κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€.

 

GoF의 λ””μžμΈ νŒ¨ν„΄ μ±…μ—μ„œλŠ” μ „λž΅ νŒ¨ν„΄μ„ λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

  • 동일 κ³„μ—΄μ˜ μ•Œκ³ λ¦¬μ¦˜κ΅°μ„ μ •μ˜ν•˜κ³ 
  • 각각의 μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•˜λ©°,
  • μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ 상관없이 λ…λ¦½μ μœΌλ‘œ
  • μ•Œκ³ λ¦¬μ¦˜μ„ λ‹€μ–‘ν•˜κ²Œ λ³€κ²½ν•  수 있게 ν•œλ‹€.

즉, μ „λž΅ νŒ¨ν„΄μ€ SOLID μ›μΉ™μ˜ OCP 원칙, DIP 원칙, ν•©μ„±(compositoin), λ‹€ν˜•μ„±(polymorphism), μΊ‘μŠν™”(encapsulation) λ“± OOP κΈ°μˆ λ“€μ˜ 총 μ§‘ν•© λ²„μ „μž…λ‹ˆλ‹€.

 

πŸ’‘ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ³Έ μ „λž΅ νŒ¨ν„΄

  1. Context : Strategyλ₯Ό μ΄μš©ν•˜λŠ” μ‹œμŠ€ν…œμœΌλ‘œ, μ•Œκ³ λ¦¬μ¦˜ μ „λž΅ 객체λ₯Ό ν•©μ„±(composition)ν•˜μ—¬ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μš”μ²­λ°›μœΌλ©΄ Stretegy 객체에 ν–‰μœ„ 싀행을 μœ„μž„ν•©λ‹ˆλ‹€.
  2. Strategy Interface : μ „λž΅μ„ μΆ”μƒν™”ν•œ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
  3. Concrete State : μ•Œκ³ λ¦¬μ¦˜, ν–‰μœ„, λ™μž‘μ„ 객체둜 μ •μ˜ν•œ κ΅¬ν˜„μ²΄λ‘œ, μ½˜ν…μŠ€νŠΈκ°€ μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ λ‹€μ–‘ν•œ λ³€ν˜•λ“€μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

 

πŸ’‘ μ „λž΅ νŒ¨ν„΄ κ΅¬ν˜„

// μ „λž΅(μΆ”μƒν™”λœ μ•Œκ³ λ¦¬μ¦˜)
interface IStrategy {
    void doSomething();
}

// μ „λž΅ μ•Œκ³ λ¦¬μ¦˜ A
class ConcreteStrateyA implements IStrategy {
    public void doSomething() {}
}

// μ „λž΅ μ•Œκ³ λ¦¬μ¦˜ B
class ConcreteStrateyB implements IStrategy {
    public void doSomething() {}
}
// μ»¨ν…μŠ€νŠΈ(μ „λž΅ 등둝/μ‹€ν–‰)
class Context {
    IStrategy Strategy; // μ „λž΅ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•©μ„±(composition)
	
    // μ „λž΅ ꡐ체 λ©”μ†Œλ“œ
    void setStrategy(IStrategy Strategy) {
        this.Strategy = Strategy;
    }
	
    // μ „λž΅ μ‹€ν–‰ λ©”μ†Œλ“œ
    void doSomething() {
        this.Strategy.doSomething();
    }
}
// ν΄λΌμ΄μ–ΈνŠΈ(μ „λž΅ ꡐ체/μ „λž΅ μ‹€ν–‰ν•œ κ²°κ³Όλ₯Ό μ–»μŒ)
class Client {
    public static void main(String[] args) {
        // 1. μ»¨ν…μŠ€νŠΈ 생성
        Context c = new Context();

        // 2. μ „λž΅ μ„€μ •
        c.setStrategy(new ConcreteStrateyA());

        // 3. μ „λž΅ μ‹€ν–‰
        c.doSomething();

        // 4. λ‹€λ₯Έ μ „λž΅ μ„€μ •
        c.setStrategy(new ConcreteStrateyB());

        // 5. λ‹€λ₯Έ μ „λž΅ μ‹œν–‰
        c.doSomething();
    }
}

 

πŸ’‘ 마무리

μ „λž΅ νŒ¨ν„΄μ€

  1. 객체 λ‚΄μ—μ„œ ν•œ μ•Œκ³ λ¦¬μ¦˜μ˜ λ‹€μ–‘ν•œ λ³€ν˜•λ“€μ„ μ‚¬μš©ν•˜κ³  싢을 λ•Œ
  2. λŸ°νƒ€μž„ 쀑에 ν•œ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ „ν™˜ν•˜κ³  싢을 λ•Œ
  3. 일뢀 행동을 μ‹€ν–‰ν•˜λŠ” λ°©μ‹μ—μ„œλ§Œ 차이가 μžˆλŠ” μœ μ‚¬ν•œ ν΄λž˜μŠ€λ“€μ΄ λ§Žμ„ λ•Œ

에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ „λž΅ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ˜ κ΅¬ν˜„ μ„ΈλΆ€ 정보듀을 고립할 수 있고, μ½˜ν…μŠ€νŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ μ „λž΅λ“€μ„ λ„μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.(OCP μ€€μˆ˜)

 

 

μ „λž΅ νŒ¨ν„΄

/ λ””μžμΈ νŒ¨ν„΄λ“€ / 행동 νŒ¨ν„΄ μ „λž΅ νŒ¨ν„΄ λ‹€μŒ μ΄λ¦„μœΌλ‘œλ„ λΆˆλ¦½λ‹ˆλ‹€: Strategy μ˜λ„ μ „λž΅ νŒ¨ν„΄μ€ μ•Œκ³ λ¦¬μ¦˜λ“€μ˜ νŒ¨λ°€λ¦¬λ₯Ό μ •μ˜ν•˜κ³ , 각 νŒ¨λ°€λ¦¬λ₯Ό λ³„λ„μ˜ ν΄λž˜μŠ€μ— 넣은 ν›„ κ·Έλ“€μ˜ 객체듀을 μƒν˜Έκ΅ν™˜

refactoring.guru

 

πŸ’  μ „λž΅(Strategy) νŒ¨ν„΄ - μ™„λ²½ λ§ˆμŠ€ν„°ν•˜κΈ°

Strategy Pattern μ „λž΅ νŒ¨ν„΄μ€ μ‹€ν–‰(λŸ°νƒ€μž„) 쀑에 μ•Œκ³ λ¦¬μ¦˜ μ „λž΅μ„ μ„ νƒν•˜μ—¬ 객체 λ™μž‘μ„ μ‹€μ‹œκ°„μœΌλ‘œ λ°”λ€Œλ„λ‘ ν•  수 있게 ν•˜λŠ” ν–‰μœ„ λ””μžμΈ νŒ¨ν„΄ 이닀. μ—¬κΈ°μ„œ 'μ „λž΅'μ΄λž€ μΌμ’…μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄ 될 수

inpa.tistory.com

 

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ’‘ DEEP DIVE/PATTERN' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • Deep Dive Into Design Patterns - λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μ»€λ§¨λ“œ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μƒνƒœ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄
    6_oHji
    6_oHji
    끄적끄적

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”