λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/UIKit

[iOS] λ””μžμΈ νŒ¨ν„΄ & Singleton νŒ¨ν„΄ 적용된 사둀

by Danna 2021. 6. 16.
728x90
728x90

λ””μžμΈ νŒ¨ν„΄μ˜ μ •μ˜, μ‹œμž‘ 그리고 λΆ„λ₯˜μ— λŒ€ν•΄μ„œ 정리. iOS μ•± κ°œλ°œμ—μ„œ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ΄ 적용된 사둀λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν•™μŠ΅ν•΄λ³΄μž!


 

iOS μ•± ν”„λ‘œκ·Έλž˜λ°

λΆ€μŠ€νŠΈμ½”μŠ€ 무료 κ°•μ˜

www.boostcourse.org

 

1μž₯μ—μ„œ μŒμ•…μž¬μƒ 앱을 λ§Œλ“€λ©΄μ„œ μ•„λž˜μ˜ λ‚΄μš©λ“€μ„ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

  • 에셋(Asset) - μ•± μ•„μ΄μ½˜, 이미지 파일, 데이터 νŒŒμΌμ„ 관리, μ•± μ‹€ν–‰μ‹œ νŒŒμΌμ— μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ 도와쀀닀.
  • μ•± μ‹œλ‹(App thinning)κ³Ό μ•± μŠ¬λΌμ΄μ‹±(App slicing) - λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ—μ„œ λΉ λ₯΄κ²Œ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ„λ‘ ν•˜λŠ” μ΅œμ ν™” 기술 
  • Cocoa Touch, UIKit, Foundation - iOS μ•± κ°œλ°œμ— ν•„μš”ν•œ ν”„λ ˆμž„μ›Œν¬ 
  • Autolayout μ„ μ μš©ν•˜λ©° UIλ₯Ό κ°œλ°œν•˜λŠ” λ²• - μΈν„°νŽ˜μ΄μŠ€ λΉŒλ” vs μ½”λ“œλ‘œ μž‘μ„±
  • iOS의 View 체계 - λ·° 계측, 뷰의 μ’Œν‘œ, ν”„λ ˆμž„ vs λ°”μš΄λ“œ, λ·° 계측 디버깅 툴
  • λ””μžμΈ νŒ¨ν„΄κ³Ό MVC νŒ¨ν„΄ - μ‹±κΈ€ν„΄ νŒ¨ν„΄κ³Ό μ•±κ°œλ°œμ—μ„œμ˜ MVC νŒ¨ν„΄μ„ μ€‘μ μ μœΌλ‘œ
  • AVAudioPlayer, Timer - μŒμ•… νŒŒμΌμ„ μž¬μƒν•˜κΈ° μœ„ν•œ AVAudioPlayer, μ‹œκ°„μ΄ˆλ₯Ό 재기 μœ„ν•œ Timer

πŸ’‘ λ””μžμΈ νŒ¨ν„΄

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ νŠΉμ • 상황을 ν•΄κ²°ν•˜λŠ” 방법(νŒ¨ν„΄)을 μ •ν˜•ν™”ν•˜λŠ” 것을 λ””μžμΈ νŒ¨ν„΄μ΄λΌκ³  ν•œλ‹€. μœ μ‚¬ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄μ„ μˆ™μ§€ν•΄λ‘λ©΄, λΉ„μŠ·ν•œ 상황을 λ§ˆμ£Όν–ˆμ„ λ•Œ λΉ λ₯΄κ³  μœ μ—°ν•˜κ²Œ λŒ€μ²˜ν•  수 μžˆλ‹€. 

 

πŸ‘£ λ””μžμΈ νŒ¨ν„΄μ˜ μ‹œμž‘


객체지ν–₯섀계λ₯Ό μœ„ν•œ 23개의 νŒ¨ν„΄μ„ κΈ°μˆ ν•œ "λ””μžμΈ νŒ¨ν„΄(Design Pattern)" 책이 μΆœκ°„λ˜λ©΄μ„œλΆ€ν„° λ””μžμΈ νŒ¨ν„΄μ΄ ν­λ„“κ²Œ μ‚¬μš©λ˜κΈ° μ‹œμž‘ν–ˆλ‹€.

 

πŸ‘€ λ””μžμΈ νŒ¨ν„΄μ˜ μ •μ˜
GoF, "νŠΉμ •ν•œ μƒν™©μ—μ„œ 일반적 μ„€κ³„λ¬Έμ œλ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μƒν˜Έκ΅λ₯˜ν•˜λŠ” μˆ˜μ • κ°€λŠ₯ν•œ 객체와 ν΄λž˜μŠ€λ“€μ— λŒ€ν•œ μ„€λͺ…이닀."
--- GoF (Gang of Four) :: λ””μžμΈ νŒ¨ν„΄ μ±…μ˜ μ €μžλ“€

라만(C. Larman), "μˆ™λ ¨λœ 객체지ν–₯ 개발자 및 기타 μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμžλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발의 κ°€μ΄λ“œλΌμΈμ΄ λ˜λŠ” 일반적인 원칙듀과 κ΄€μš©μ μΈ ν•΄κ²°μ±…λ“€μ˜ λ ˆνΌν† λ¦¬(repertoire)λ₯Ό κ΅¬μΆ•ν•œλ‹€. νŒ¨ν„΄μ€ μ΄λŸ¬ν•œ 원칙듀과 κ΄€μš©μ  해결책듀이 λ¬Έμ œμ™€ 해결책을 κΈ°μˆ ν•˜λŠ” ꡬ쑰적인 ν˜•νƒœλ‘œ μ²΄κ³„ν™”λ˜κ³  λͺ…λͺ…λœ 것이닀."

 

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

 

  • νŠΉμ • 문제 해결을 μœ„ν•΄ 같은 νŒ¨ν„΄μœΌλ‘œ μ ‘κ·Όν•˜λ©° λ…Όμ˜ν•˜λ©΄ μ›ν™œν•˜κ²Œ μ˜μ‚¬μ†Œν†΅ ν•  수 μžˆλ‹€.
  • κ²€μ¦λœ λ””μžμΈ νŒ¨ν„΄μ„ μ‚¬μš©ν•΄ λΉ λ₯Έ μ‹œκ°„λ‚΄μ— 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ–΄ 개발 λΉ„μš©μ΄ 적게 λ“ λ‹€.
  • νŒ¨ν„΄μ΄ 적용된 μ„€κ³„λ‚˜ μ•„ν‚€ν…μ²˜μ˜ 경우, νŒ¨ν„΄μ„ μ•Œκ³  μžˆλ‹€λ©΄ μ†Œν”„νŠΈμ›¨μ–΄ ꡬ쑰λ₯Ό λΉ λ₯΄κ²Œ 이해할 수 μžˆλ‹€.

 

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

μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ‹œ κ³ λ―Όν•˜λŠ” 것듀인 "μ–΄λ–€ 클래슀λ₯Ό λ§Œλ“€μ§€, μ–΄λŠ μ‹œμ μ— 객체λ₯Ό μƒμ„±ν•˜κ³  μ†Œλ©Έμ‹œν‚¬μ§€, 데이터λ₯Ό μ–΄λ–»κ²Œ λ°›μ•„μ„œ μ²˜λ¦¬ν• μ§€, ꡬ쑰 섀계λ₯Ό μ–΄λ–»κ²Œ 할지" λ“±μ˜ 상황에 λ§žλŠ” λ””μžμΈ νŒ¨ν„΄λ“€μ΄ μžˆλ‹€. 

 

GoF λŠ” λ””μžμΈ νŒ¨ν„΄μ„ λͺ©μ κ³Ό λ²”μœ„λ‘œ λΆ„λ₯˜ν–ˆλ‹€. λͺ©μ μ€ νŒ¨ν„΄μ΄ 무엇을 ν•˜λŠ”μ§€ μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ, 생성, ꡬ쑰, ν–‰μœ„λ‘œ λ‚˜λ‰œλ‹€. 

 

  • 생성 νŒ¨ν„΄ (Cretional Pattern) : 객체의 생성 과정에 κ΄€λ ¨, 객체 생성 μ‹œ μœ μ—°μ„±μ„ 높이고 μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ— 도움을 μ€€λ‹€.
  • ꡬ쑰 νŒ¨ν„΄ (Structural Pattern) : ν΄λž˜μŠ€λ‚˜ 객체의 ꡬ성을 톡해 더 큰 ꡬ쑰둜 λ§Œλ“€ 수 있게 ν•΄μ£ΌλŠ” 것과 κ΄€λ ¨λœ νŒ¨ν„΄
  • ν–‰μœ„ νŒ¨ν„΄ (Behavioral Pattern) : νŒ¨ν„΄μ„ 주둜 ν΄λž˜μŠ€μ— μ μš©ν•˜λŠ”μ§€ or 객체에 μ μš©ν•˜λŠ”μ§€ 따라 κ΅¬λΆ„λœλ‹€.

 

λ²”μœ„λŠ” νŒ¨ν„΄μ„ ν΄λž˜μŠ€μ— μ μš©ν•˜λŠ”μ§€, 객체에 μ μš©ν•˜λŠ”μ§€μ— 따라 "클래슀 νŒ¨ν„΄", "객체 νŒ¨ν„΄" 으둜 λ‚˜λ‰œλ‹€.

 

  • 클래슀 : ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀 κ°„μ˜ 관계λ₯Ό λ‹€λ£¨λŠ” νŒ¨ν„΄,  μ»΄νŒŒμΌ μ‹œ 관계가 κ²°μ •λœλ‹€.
  • 객체 : 객체 κ°„μ˜ 관계λ₯Ό λ‹€λ£¨λŠ” νŒ¨ν„΄, λŸ¬λ‹νƒ€μž„μ— 관계가 μƒμ„±λ˜μ–΄ 동적이고 μœ μ—°ν•˜λ‹€.

 

1. μ‹±κΈ€ν„΄ νŒ¨ν„΄(Singleton Pattern)

  • λͺ©μ  : 생성, λ²”μœ„ : 객체
  • νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 였직 ν•˜λ‚˜μž„μ„ 보μž₯ν•˜κ³  이 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  방법을 μ œκ³΅ν•œλ‹€. 
  • κ°μ²΄λŠ” μ—¬λŸ¬λ²ˆ μƒμ„±λ˜μ§€ μ•Šκ³ , 졜초 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•œλ‹€. 이후 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•œλ‹€. 
  • μ „μ—­μ μœΌλ‘œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μ‚¬μš©ν•˜κ³  싢은 경우 μ‚¬μš©ν•œλ‹€.
  • μ‹±κΈ€ν„΄ ν΄λž˜μŠ€λŠ” ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œ μΈμŠ€ν„΄μŠ€ 볡사(copying), μœ μ§€(retaining), ν•΄μ œ(releasing) 을 λ°©μ§€ν•˜κ³  μžˆλ‹€.

 

iOS μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ΄ μ“°μ΄λŠ” 곳은 λ‹€μŒκ³Ό κ°™λ‹€.

 

  • 파일 접근을 λ•λŠ” FileManager 클래슀의 객체 -- FileManager.default
  • μ•±μ˜ 쀑앙 μ œμ–΄λ₯Ό ν•˜λŠ” UIApplication 클래슀의 객체 -- UIApplication.shared
  • μ•± μ„€μ • λ“± Key-value ν˜•νƒœμ˜ 데이터λ₯Ό μ§€μ†μ μœΌλ‘œ μ €μž₯ν•˜λŠ” UserDefaults 클래슀의 객체 -- UserDefaults.standard
  • λ“±λ‘λœ μ•Œλ¦Όμ˜ 정보λ₯Ό μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” NotificationCenter 클래슀의 객체 -- NotificationCenter.default
  • ν•˜λ“œμ›¨μ–΄μ˜ 가속도 값을 μ•Œλ €μ£ΌλŠ” CMMotionManager 클래슀 -- 객체λ₯Ό 단 ν•˜λ‚˜λ§Œ λ§Œλ“€λΌκ³  λͺ…μ‹œλ˜μ–΄μžˆμŒ.
    --- λ¬Έμ„œμ— λ‚˜νƒ€λ‚œ UIAccelerometer λŠ” Deprecated class 이닀. 

 

일반적인 클래슀의 μΈμŠ€ν„΄μŠ€ vs μ‹±κΈ€ν„΄ νŒ¨ν„΄μ˜ μΈμŠ€ν„΄μŠ€

 

 

2. νΌμ‚¬λ“œ νŒ¨ν„΄ (Facade Pattern)

  • λͺ©μ  : ꡬ쑰, λ²”μœ„ : 객체
  • Facade :: 창ꡬ, μ•žλ©΄ => Facade Pattern 을 톡해 μ‹œμŠ€ν…œμ˜ μ•ˆλ‚΄μ†Œ 역할을 μ œκ³΅ν•œλ‹€.
  • μ„œλ‘œ κ΄€λ ¨μžˆκ³  λ³΅μž‘ν•˜κ²Œ μ–½ν˜€μžˆλŠ” ν΄λž˜μŠ€λ“€μ„ μ •λ¦¬ν•΄μ„œ μƒμœ„ 레벨의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.
  • μ‹œμŠ€ν…œμ˜ λ³΅μž‘μ„±μ„ 쀄이기 μœ„ν•΄ μ„œλΈŒ μ‹œμŠ€ν…œμ„ κ΅¬μ‘°ν™”ν•˜κ³ , μ„œλΈŒ μ‹œμŠ€ν…œμœΌλ‘œμ˜ 접근을 ν•˜λ‚˜μ˜ νΌμ‚¬λ“œ 객체둜 μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.
  • => μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©μ„ κ°„λ‹¨ν•˜κ²Œ ν•œλ‹€.

 

3. μ˜΅μ €λ²„ νŒ¨ν„΄ (Observer Pattern)

  • λͺ©μ  : ν–‰μœ„, λ²”μœ„ : 객체
  • Observer :: κ΄€μ°°μž => Observer Pattern 을 톡해 κ°μ²΄μ˜ μƒνƒœ λ³€ν™”λ₯Ό κ΄€μ°°ν•œλ‹€.
  • 객체에 μ˜΅μ €λ²„λ“€μ„ λ“±λ‘ν•˜μ—¬ μƒνƒœ λ³€ν™”κ°€ μžˆμ„ λ•Œ, λ©”μ„œλ“œ 등을 톡해 객체가 각 μ˜΅μ €λ²„μ—μ„œ ν†΅μ§€ν•˜λ„λ‘ ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

 

4. μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄ (Strategy Pattern)

  • λͺ©μ  : ν–‰μœ„, λ²”μœ„ : 객체
  • μ•Œκ³ λ¦¬μ¦˜μ„ λ‹΄λ‹Ήν•˜λŠ” 클래슀λ₯Ό 뢄리해, μ±…μž„μ„ λΆ„μ‚°μ‹œν‚€λŠ” νŒ¨ν„΄μ΄λ‹€.

 

5. νŒ©ν† λ¦¬ νŒ¨ν„΄ (Factory Pattern)

  • λͺ©μ  : 생성, λ²”μœ„ : 클래슀
  • 객체 생성 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜μ§€λ§Œ, 생성할지 μ—¬λΆ€λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ— μ±…μž„μ„ λ„˜κΈ°λŠ” νŒ¨ν„΄μ΄λ‹€.
  • μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” 곡μž₯(Factory) λ₯Ό 톡해 객체λ₯Ό μƒμ„±ν•œλ‹€κ³  μƒκ°ν•˜μž !
  • ν•œ 집합 내에 μžˆλŠ” ν΄λž˜μŠ€λ“€μ˜ 생성을 ν•œ κ³³μ—μ„œ μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€. 

 

6. μ–΄λŒ‘ν„° νŒ¨ν„΄ (Adapter Pattern)

  • λͺ©μ  : ꡬ쑰, λ²”μœ„ : 클래슀, 객체
  • μ–΄λŒ‘ν„° νŒ¨ν„΄μ€ λ°”λ‘œ μ‚¬μš©μ΄λ‚˜ μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•œ, ν˜Έν™˜μ„±μ΄ μ—†λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.
  • 클래슀 상속, μœ„μž„(delegate, λ©”μ†Œλ“œμ˜ μ‹€μ œ 처리λ₯Ό λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ†Œλ“œμ— 맑김) λ“±μ˜ 방법을 톡해 λ³€ν™˜ν•œλ‹€.

참고 링크

 

728x90
728x90