Skip to content

Latest commit

Β 

History

History
147 lines (127 loc) Β· 10.7 KB

File metadata and controls

147 lines (127 loc) Β· 10.7 KB

5. Design Pattern

πŸ“– Contents


λ””μžμΈ νŒ¨ν„΄μ˜ κ°œλ…κ³Ό μ’…λ₯˜

λ””μžμΈ νŒ¨ν„΄μ΄λž€

  • μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό 섀계할 λ•Œ νŠΉμ • λ§₯λ½μ—μ„œ 자주 λ°œμƒν•˜λŠ” 고질적인 λ¬Έμ œλ“€μ΄ 또 λ°œμƒν–ˆμ„ λ•Œ μž¬μ‚¬μš©ν•  ν•  μˆ˜μžˆλŠ” ν›Œλ₯­ν•œ ν•΄κ²°μ±…
  • "바퀴λ₯Ό λ‹€μ‹œ 발λͺ…ν•˜μ§€ 마라(Don't reinvent the wheel)"
  • 이미 λ§Œλ“€μ–΄μ Έμ„œ 잘 λ˜λŠ” 것을 μ²˜μŒλΆ€ν„° λ‹€μ‹œ λ§Œλ“€ ν•„μš”κ°€ μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€.
  • νŒ¨ν„΄μ΄λž€
    • 각기 λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄ λͺ¨λ“ˆμ΄λ‚˜ κΈ°λŠ₯을 κ°€μ§„ λ‹€μ–‘ν•œ μ‘μš© μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œλ“€μ„ κ°œλ°œν•  λ•Œλ„ μ„œλ‘œ 간에 κ³΅ν†΅λ˜λŠ” 섀계 λ¬Έμ œκ°€ μ‘΄μž¬ν•˜λ©° 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•΄κ²°μ±… 사이에도 곡톡점이 μžˆλ‹€. μ΄λŸ¬ν•œ μœ μ‚¬μ μ„ νŒ¨ν„΄μ΄λΌ ν•œλ‹€.
    • νŒ¨ν„΄μ€ κ³΅ν†΅μ˜ μ–Έμ–΄λ₯Ό λ§Œλ“€μ–΄μ£Όλ©° νŒ€μ› μ‚¬μ΄μ˜ μ˜μ‚¬ μ†Œν†΅μ„ μ›ν™œν•˜κ²Œ ν•΄μ£ΌλŠ” μ•„μ£Ό μ€‘μš”ν•œ 역할을 ν•œλ‹€.

λ””μžμΈ νŒ¨ν„΄μ˜ μ’…λ₯˜

  • GoF λ””μžμΈ νŒ¨ν„΄
    • GoF(Gang of Four)라 λΆˆλ¦¬λŠ” μ‚¬λžŒλ“€
      • μ—λ¦¬νžˆ 감마(Erich Gamma), λ¦¬μ°¨λ“œ 헬름(Richard Helm), λž„ν”„ 쑴슨(Ralph Johnson), μ‘΄ λΈ”λ¦¬μ‹œλ””μŠ€(John Vissides)
      • μ†Œν”„νŠΈμ›¨μ–΄ 개발 μ˜μ—­μ—μ„œ λ””μžμΈ νŒ¨ν„΄μ„ κ΅¬μ²΄ν™”ν•˜κ³  μ²΄κ³„ν™”ν•œ μ‚¬λžŒλ“€
      • 23κ°€μ§€μ˜ λ””μžμΈ νŒ¨ν„΄μ„ μ •λ¦¬ν•˜κ³  각각의 λ””μžμΈ νŒ¨ν„΄μ„ 생성(Creational), ꡬ쑰(Structural), ν–‰μœ„(Behavioral) 3κ°€μ§€λ‘œ λΆ„λ₯˜ν–ˆλ‹€.

GoF λ””μžμΈ νŒ¨ν„΄μ˜ λΆ„λ₯˜

  1. 생성(Creational) νŒ¨ν„΄
    • 객체 생성에 κ΄€λ ¨λœ νŒ¨ν„΄
    • 객체의 생성과 쑰합을 μΊ‘μŠν™”ν•΄ νŠΉμ • 객체가 μƒμ„±λ˜κ±°λ‚˜ λ³€κ²½λ˜μ–΄λ„ ν”„λ‘œκ·Έλž¨ ꡬ쑰에 영ν–₯을 크게 λ°›μ§€ μ•Šλ„λ‘ μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€.
  2. ꡬ쑰(Structural) νŒ¨ν„΄
    • ν΄λž˜μŠ€λ‚˜ 객체λ₯Ό μ‘°ν•©ν•΄ 더 큰 ꡬ쑰λ₯Ό λ§Œλ“œλŠ” νŒ¨ν„΄
    • 예λ₯Ό λ“€μ–΄ μ„œλ‘œ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€λ‹Œ 2개의 객체λ₯Ό λ¬Άμ–΄ 단일 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ±°λ‚˜ 객체듀을 μ„œλ‘œ λ¬Άμ–΄ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.
  3. ν–‰μœ„(Behavioral)
    • κ°μ²΄λ‚˜ 클래슀 μ‚¬μ΄μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄λ‚˜ μ±…μž„ 뢄배에 κ΄€λ ¨λœ νŒ¨ν„΄
    • ν•œ 객체가 혼자 μˆ˜ν–‰ν•  수 μ—†λŠ” μž‘μ—…μ„ μ—¬λŸ¬ 개의 객체둜 μ–΄λ–»κ²Œ λΆ„λ°°ν•˜λŠ”μ§€, 또 κ·Έλ ‡κ²Œ ν•˜λ©΄μ„œλ„ 객체 μ‚¬μ΄μ˜ 결합도λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것에 쀑점을 λ‘”λ‹€.

⏫Top ↩️Back ℹ️Home

Singleton νŒ¨ν„΄

  • κ°œλ…
    • μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체λ₯Ό ν•˜λ‚˜λ§Œ 생성 ν•˜λ„λ‘ ν•˜λ©°, μƒμ„±λœ 객체λ₯Ό μ–΄λ””μ—μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜λŠ” νŒ¨ν„΄
    • '생성(Creational) νŒ¨ν„΄'의 ν•˜λ‚˜
  • 역할이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…
    • Singleton
      • ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ„ μƒμ„±ν•˜λŠ” μ±…μž„μ΄ 있으며 getInstance λ©”μ„œλ“œλ₯Ό 톡해 λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ™μΌν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
  • μ˜ˆμ‹œ
    • ν”„λ¦°ν„° κ΄€λ¦¬μž λ§Œλ“€κΈ°

⏫Top ↩️Back ℹ️Home

Strategy νŒ¨ν„΄

  • κ°œλ…
    • ν–‰μœ„λ₯Ό 클래슀둜 μΊ‘μŠν™”ν•΄ λ™μ μœΌλ‘œ ν–‰μœ„λ₯Ό 자유둭게 λ°”κΏ€ 수 있게 ν•΄μ£ΌλŠ” νŒ¨ν„΄
      • 같은 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜μ΄ ν΄λž˜μŠ€λ³„λ‘œ μΊ‘μŠν™”λ˜μ–΄ 있고 이듀이 ν•„μš”ν•  λ•Œ ꡐ체할 수 μžˆλ„λ‘ ν•¨μœΌλ‘œμ¨ λ™μΌν•œ 문제λ₯Ό λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν•΄κ²°ν•  수 있게 ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄
    • 'ν–‰μœ„(Behavioral) νŒ¨ν„΄'의 ν•˜λ‚˜
    • 즉, μ „λž΅μ„ μ‰½κ²Œ λ°”κΏ€ 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
      • μ „λž΅μ΄λž€
        • μ–΄λ–€ λͺ©μ μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ 일을 μˆ˜ν–‰ν•˜λŠ” 방식, λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™, 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ λ“±
    • 특히 κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ²Œμž„ 캐릭터가 μžμ‹ μ΄ μ²˜ν•œ 상황에 따라 κ³΅κ²©μ΄λ‚˜ ν–‰λ™ν•˜λŠ” 방식을 λ°”κΎΈκ³  싢을 λ•Œ μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄μ€ 맀우 μœ μš©ν•˜λ‹€.
  • 역할이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…
    • Strategy
      • μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀둜 μ™ΈλΆ€μ—μ„œ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ„ ν˜ΈμΆœν•˜λŠ” 방법을 λͺ…μ‹œ
    • ConcreteStrategy
      • μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄μ—μ„œ λͺ…μ‹œν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‹€μ œλ‘œ κ΅¬ν˜„ν•œ 클래슀
    • Context
      • μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄μ„ μ΄μš©ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
      • ν•„μš”μ— 따라 λ™μ μœΌλ‘œ ꡬ체적인 μ „λž΅μ„ λ°”κΏ€ 수 μžˆλ„λ‘ setter λ©”μ„œλ“œ('μ§‘μ•½ 관계')λ₯Ό μ œκ³΅ν•œλ‹€.
  • μ˜ˆμ‹œ
    • λ‘œλ΄‡ λ§Œλ“€κΈ°

⏫Top ↩️Back ℹ️Home

Template Method νŒ¨ν„΄

  • κ°œλ…
    • μ–΄λ–€ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 일뢀뢄을 μ„œλΈŒ 클래슀둜 μΊ‘μŠν™”ν•΄ 전체 일을 μˆ˜ν–‰ν•˜λŠ” κ΅¬μ‘°λŠ” λ°”κΎΈμ§€ μ•ŠμœΌλ©΄μ„œ νŠΉμ • λ‹¨κ³„μ—μ„œ μˆ˜ν–‰ν•˜λŠ” 내역을 λ°”κΎΈλŠ” νŒ¨ν„΄
      • 즉, μ „μ²΄μ μœΌλ‘œλŠ” λ™μΌν•˜λ©΄μ„œ λΆ€λΆ„μ μœΌλ‘œλŠ” λ‹€λ₯Έ ꡬ문으둜 κ΅¬μ„±λœ λ©”μ„œλ“œμ˜ μ½”λ“œ 쀑볡을 μ΅œμ†Œν™” ν•  λ•Œ μœ μš©ν•˜λ‹€.
      • λ‹€λ₯Έ κ΄€μ μ—μ„œ 보면 λ™μΌν•œ κΈ°λŠ₯을 μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•˜λ©΄μ„œ ν™•μž₯/λ³€ν™”κ°€ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•œλ‹€.
      • 예λ₯Ό λ“€μ–΄, 전체적인 μ•Œκ³ λ¦¬μ¦˜μ€ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•˜λ©΄μ„œ λ‹€λ₯Έ 뢀뢄은 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•¨μœΌλ‘œμ¨ 전체적인 μ•Œκ³ λ¦¬μ¦˜ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 데 μœ μš©ν•˜λ„λ‘ ν•œλ‹€.
    • 'ν–‰μœ„(Behavioral) νŒ¨ν„΄'의 ν•˜λ‚˜
  • 역할이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…
    • AbstractClass
      • ν…œν”Œλ¦Ώ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 클래슀
      • ν•˜μœ„ ν΄λž˜μŠ€μ— 곡톡 μ•Œκ³ λ¦¬μ¦˜μ„ μ •μ˜ν•˜κ³  ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λ  κΈ°λŠ₯을 primitive λ©”μ„œλ“œ λ˜λŠ” hook λ©”μ„œλ“œλ‘œ μ •μ˜ν•˜λŠ” 클래슀
    • ConcreteClass
      • 물렀받은 primitive λ©”μ„œλ“œ λ˜λŠ” hook λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀
      • μƒμœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„λœ ν…œν”Œλ¦Ώ λ©”μ„œλ“œμ˜ 일반적인 μ•Œκ³ λ¦¬μ¦˜μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€μ— μ ν•©ν•˜κ²Œ primitive λ©”μ„œλ“œλ‚˜ hook λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜λŠ” 클래슀
  • μ˜ˆμ‹œ
    • μ—¬λŸ¬ νšŒμ‚¬μ˜ λͺ¨ν„° μ§€μ›ν•˜κΈ°

⏫Top ↩️Back ℹ️Home

Factory Method νŒ¨ν„΄

  • κ°œλ…
    • 객체 생성 처리λ₯Ό μ„œλΈŒ 클래슀둜 뢄리 ν•΄ μ²˜λ¦¬ν•˜λ„λ‘ μΊ‘μŠν™”ν•˜λŠ” νŒ¨ν„΄
      • 즉, 객체의 생성 μ½”λ“œλ₯Ό λ³„λ„μ˜ 클래슀/λ©”μ„œλ“œλ‘œ λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ 객체 μƒμ„±μ˜ 변화에 λŒ€λΉ„ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.
      • νŠΉμ • κΈ°λŠ₯의 κ΅¬ν˜„μ€ κ°œλ³„ 클래슀λ₯Ό 톡해 μ œκ³΅λ˜λŠ” 것이 λ°”λžŒμ§ν•œ 섀계닀.
        • κΈ°λŠ₯의 λ³€κ²½μ΄λ‚˜ 상황에 λ”°λ₯Έ κΈ°λŠ₯의 선택은 ν•΄λ‹Ή 객체λ₯Ό μƒμ„±ν•˜λŠ” μ½”λ“œμ˜ 변경을 μ΄ˆλž˜ν•œλ‹€.
        • 상황에 따라 μ μ ˆν•œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ½”λ“œλŠ” 자주 쀑볡될 수 μžˆλ‹€.
        • 객체 생성 λ°©μ‹μ˜ λ³€ν™”λŠ” ν•΄λ‹Ήλ˜λŠ” λͺ¨λ“  μ½”λ“œ 뢀뢄을 λ³€κ²½ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
      • μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄, μ‹±κΈ€ν„΄ νŒ¨ν„΄, ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ„ μ‚¬μš©ν•œλ‹€.
    • '생성(Creational) νŒ¨ν„΄'의 ν•˜λ‚˜
  • 역할이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…
    • Product
      • νŒ©ν† λ¦¬ λ©”μ„œλ“œλ‘œ 생성될 객체의 곡톡 μΈν„°νŽ˜μ΄μŠ€
    • ConcreteProduct
      • ꡬ체적으둜 객체가 μƒμ„±λ˜λŠ” 클래슀
    • Creator
      • νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό κ°–λŠ” 클래슀
    • ConcreteCreator
      • νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀둜 ConcreteProduct 객체λ₯Ό 생성
  • νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ˜ κ°œλ…κ³Ό 적용 방법
    1. 객체 생성을 μ „λ‹΄ν•˜λŠ” λ³„λ„μ˜ Factory 클래슀 이용
      • μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄κ³Ό μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ μ΄μš©ν•œλ‹€.
      • ν•΄λ‹Ή Postμ—μ„œλŠ” 이 방법을 κΈ°μ€€μœΌλ‘œ νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ„ μ μš©ν•œλ‹€.
    2. 상속 이용: ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ ν•©ν•œ 클래슀의 객체λ₯Ό 생성
      • μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄, μ‹±κΈ€ν„΄ νŒ¨ν„΄κ³Ό ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ„ μ΄μš©ν•œλ‹€.
      • ν•΄λ‹Ή Post의 맨 ν•˜λ‹¨μ— 'λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄ μ μš©ν•˜κΈ°'λ₯Ό ν™•μΈν•œλ‹€.
  • μ˜ˆμ‹œ
    • μ—¬λŸ¬ κ°€μ§€ λ°©μ‹μ˜ μ—˜λ¦¬λ² μ΄ν„° μŠ€μΌ€μ€„λ§ 방법 μ§€μ›ν•˜κΈ°

⏫Top ↩️Back ℹ️Home

MVC1 νŒ¨ν„΄κ³Ό MVC2 νŒ¨ν„΄

⏫Top ↩️Back ℹ️Home


Reference

🏠 Home