์ด์ „๊ธ€๋“ค์€ ์‚ฌ์‹ค ์ด ์›์น™์„ ์œ„ํ•ด ๋‹ฌ๋ ค์˜จ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. OOP์˜ ์ •์ˆ˜๋กœ ๋ถˆ๋ฆฌ์šฐ๋Š” SOLID์›์น™์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ์•Œ์•„๋ณด๊ณ , ์‹ค์ œ iOS Framework์˜ ์„ค๊ณ„ ๋ฐฉํ–ฅ์— ๋Œ€์ž…ํ•˜๋ฉด์„œ ๋ณด๋‹ค ์ฐํ•œ ์ดํ•ด๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์ž.

Single Respoinsibility Principle (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)

  • SRP
  • ํ•œ์ค„ ์„ค๋ช…
    • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
    • ๋‹จ์ผ
      • ๋งค์šฐ ์ƒ๋Œ€์ 
      • ๋˜๋„๋ก ์ž‘์€ ๋ฒ”์œ„
    • ์ฑ…์ž„
      • ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์ด์œ 
      • ํŠน์ • ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ํด๋ž˜์Šค์˜ ๋Œ€๋ถ€๋ถ„์ด ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
        • ํด๋ž˜์Šค๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹Œ๊ฐ€?
        • ๊ธฐ๋Šฅ ํ•œ ๊ฐœ์— ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ๋งŽ์€ ๋ถ€๋ถ„ ์ˆ˜์ •์ด ๊ฐ€ํ•ด์ ธ์•ผ ํ•จ
        • ๋…ผ๋ฆฌ์  ๊ด€์ ์—์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์ด๋ผ ์ƒ๊ฐ๋˜์ง€๋งŒ, ์ฐจํ›„ ๋ณ€๊ฒฝ ๊ด€์ ์—์„œ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ฑฐ๋‚˜ ๋งŽ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋ถ€๋งŒ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ์•ผ ํ•จ
      • ํŠน์ • ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋œ ๊ฒฝ์šฐ
        • ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•จ
      • ๋ณ€๊ฒฝ์˜ ๊ด€์ ์—์„œ ๋ถ„๋ฆฌ๋  ์ด์œ ๊ฐ€ ์—†๋Š”๋ฐ ๋ถ„๋ฆฌ๊ฐ€ ๋œ ๊ฒฝ์šฐ, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
  • SRP ์ค€์ˆ˜ ํด๋ž˜์Šค์˜ ํŠน์ง•
    • ์‘์ง‘๋„๊ฐ€ ๋†’์Œ
    • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์Œ
    • ํŠน์ • ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์ˆ˜์ •์ด ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ์žˆ์Œ
  • SRP ์ค€์ˆ˜ ํด๋ž˜์Šค ์‘์šฉ
    • Design Pattern
      • Abstract Factory
      • Bridge
      • State
      • Strategy
      • Command
    • (S)OLID ์›์น™๋“ค
  • SRP ์œ„๋ฐ˜ ์‚ฌ๋ก€
    • ViewController
      • Massive ViewController
      • ํ•ด๊ฒฐ์ฑ…: MVP, MVVM, VIPER
      • ์œ„๋ฐ˜ ๊ทผ๊ฑฐ
        • VC ์ •์˜: Provides the infrastructure for managing the views of your UIKit app
        • ์ด๋ฏธ view๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Œ
        • ํ•˜์ง€๋งŒ ์‹ค์ œ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด view๋งŒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ์ƒ๋‹น์ด ๋งŽ์Œ (์˜ˆ: network ์ฒ˜๋ฆฌ)
    • Apple MVC
      • ๊ธฐ์กด MVC์—์„œ Controller๋Š” View์™€ Model์„ ์ด์–ด์ฃผ๋Š” ์—ญํ• 
      • ํ•˜์ง€๋งŒ VC๋Š” View๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Œ
      • ๋˜ํ•œ Model์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง๊นŒ์ง€ ๋“ค์–ด๊ฐ€ ์žˆ์Œ
      • MVP, MVVM, VIPER๋Š” ๋ชจ๋‘ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์‹œ๋จ
        • VC๋ฅผ View๋กœ ๋ฐ”๋ผ๋ด„

Open / Closed Principle (๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)

  • OCP
  • ํ•œ์ค„ ์„ค๋ช…
    • ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ฒด (Class, function, etc)๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค์žˆ๊ณ  ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค์žˆ๋‹ค.
      • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ํ™•์žฅ์„ ์œ„ํ•ด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†๋Œ€์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์ถ”๊ฐ€๋งŒ์œผ๋กœ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
    • ์ˆ˜์ •์— ๋Œ€ํ•ด ๋‹ซํ˜€์žˆ๋‹ค.
      • ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ์ฝ”๋“œ ํ˜น์€ ์ˆ˜์ •๋˜๋Š” ์ฝ”๋“œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • OCP ์ค€์ˆ˜ ํšจ๊ณผ
    • ๊ฒฝ์ง์„ฑ์ด ์ค„์–ด๋“ฆ
      • ๊ฒฝ์‹์„ฑ
        • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜๊ณ , ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๊ธฐ ์‰ฌ์šด ์†์„ฑ์„ ๋งํ•จ
    • ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์ˆ˜์ •
    • ๋ถ€์ž‘์šฉ์˜ ์ตœ์†Œํ™”
  • ๋ฐฉ๋ฒ•
    • OCP๋Š” ์ถ”์ƒํ™”์— ํฌ๊ฒŒ ์˜์กด
      • ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ํ–‰์œ„ ๊ตฌํ˜„
    • ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ตฌ์ฒดํ™”๋œ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ ๋™์ž‘
      • ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ ๊ธฐ์กด ์ฝ”๋“œ ์†๋Œˆ ์ด์œ ๊ฐ€ ์—†์Œ
  • OCP ์ ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ Code Smell
    • ์–ด๋–ค ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์ ์ธ ๋ถ„๊ธฐ๋ฌธ
      • Enum ๊ฐ’์„ switch๋‚˜ if๋ฌธ์œผ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ
      • ์ƒˆ๋กœ์šด case ์ถ”๊ฐ€๋Š” ์‰ฌ์šฐ๋‚˜ ๋ชจ๋“  ๋ถ„๊ธฐ๋ฌธ๋“ค์„ ํ™•์ธํ•ด์•ผ ํ•จ
    • ์ˆ˜์ •์— ๋‹ซํ˜€์žˆ์ง€ ์•Š์Œ
      • ๋ถ„๊ธฐ๋ฌธ ๊ฐ™์€ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ์ถ”๊ฐ€์‹œ ์ƒˆ๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•จ
  • ์‹ค์ œ ์˜ˆ
    • switch ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , protocol์„ ์„ ์–ธํ•œ ๋’ค, ๊ฐ ํด๋ž˜์Šค์—์„œ ์ด๋ฅผ ์ฑ„ํƒํ•œ๋‹ค์Œ, ๋‹คํ˜•์„ฑ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • OCP๋Š” ๋งŒ๋Šฅ์ธ๊ฐ€?
    • ๋งŒ๋Šฅ์ธ ๊ฒƒ์€ ์—†๋‹ค.
    • ์ƒˆ๋กœ์šด case, ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‚จ์šฉ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ณต์žกํ•จ์„ ๊ฐ€์ง€๊ฒŒ ๋จ
    • greedyํ•˜๊ฒŒ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์ข‹์ง€ ์•Š์„๊นŒ?
  • ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?
    • Type์— ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋“ค์ด ๊ณ„์† ์ถ”๊ฐ€๋  ๊ฐ€๋Šฅ์„ฑ์ด ํด ๋•Œ
    • Type์˜ ๋ฉค๋ฒ„๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณณ์ด ๋งค์šฐ ๋งŽ์„๋•Œ
  • ๋” ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•  ๊ฒƒ๋“ค
    • ์–ด๋–ค ๋ถ€๋ถ„์„ Open, ์–ด๋–ค ๋ถ€๋ถ„์„ Closeํ•  ๊ฒƒ์ธ๊ฐ€?
      • == ์–ด๋–ค ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”ํ•  ๊ฒƒ์ด๊ณ  ์–ด๋–ค ๋ถ€๋ถ„์„ ๊ตฌ์ฒดํ™”ํ•  ๊ฒƒ์ธ๊ฐ€?
      • ํŒ๋‹จ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ, ๋ณ€๊ฒฝ์ด ์—†์„ ๊ฒƒ์ด๋‹ค ๊ฐ€์ •ํ•˜๊ณ  ๊ฐœ๋ฐœํ•œ๋‹ค.
        • ์œ ์—ฐํ•จ๋ณด๋‹ค ๋‹จ์ˆœํ•จ์ด ์šฐ์„ 
    • ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๋•Œ
      • ์ด ๋ณ€๊ฒฝ์ด ์™œ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
      • ์–ด๋–ค ๊ณณ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€?
      • ๋ณ€๊ฒฝ์ผ์–ด๋‚œ ๋ถ€๋ถ„์ด ์•ž์œผ๋กœ๋„ ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•  ๊ฒƒ ๊ฐ™๋‹ค โ†’ ๋ฆฌํŒฉํ† ๋ง
    • ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ™”๊ฐ€ ๋” ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค๋ฉด
      • ์ถ”์ƒํ™”๋ฅผ ์ž˜๋ชปํ•œ ๊ฒƒ.
    • ์ž˜ ์ถ”์ƒํ™”ํ•˜๋ฉด interface๋Š” ๊ฐ€๋งŒํžˆ ์žˆ๊ณ  ๊ตฌํ˜„๋ถ€๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋œ๋‹ค.
  • ์—ฐ์Šต ๋ฐฉ๋ฒ•
    • ์˜๋„์  ์‚ฌ์šฉ
    • if/switch๋ฅผ ๊ทน๋„๋กœ ์ œํ•œํ•˜๋Š” ์ฝ”๋”ฉ

Liskov Subsitution Principle (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)

  • LSP
  • ํ•œ์ค„ ์„ค๋ช…
    • ์ž๋ฃŒํ˜• S๊ฐ€ ์ž๋ฃŒํ˜• T์˜ ํ•˜์œ„ํ˜•์ด๋ผ๋ฉด, ํ”„๋กœ๊ทธ๋žจ์˜ ์†์„ฑ์˜ ๋ณ€๊ฒฝ์—†์ด T ๊ฐ์ฒด๋ฅผ S ๊ฐ์ฒด๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์˜์˜
    • ์ƒ์†์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋ณธ ์›์น™ ์ œ์‹œ
    • OCP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์›์น™
  • ์ƒ์†ํ•  ๋•Œ ํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ํ–‰์œ„
    • ๋ถ€๋ชจ์˜ ํ–‰์œ„๋ฅผ ์ž์‹์ด ๊ฑฐ๋ถ€
    • ํ‡ดํ™” ํ•จ์ˆ˜
  • ๋‚œํ•ดํ•œ ์˜ˆ์‹œ
    • ์ง์‚ฌ๊ฐํ˜•์„ ์ƒ์†๋ฐ›์€ ์ •์‚ฌ๊ฐํ˜•?
      • ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ง‘ํ•ฉ ๊ด€๊ณ„
    • ์ •์‚ฌ๊ฐํ˜•์„ ์ƒ์†๋ฐ›์€ ์ง์‚ฌ๊ฐํ˜•?
    • ๋‘˜ ์‚ฌ์ด์—๋Š” ์ƒ์†๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ
      • ์ผ๋ฐ˜์ ์ธ ๊ด€๋…๊ณผ ์ƒ์ถฉ๋จ
      • ์ง์‚ฌ๊ฐํ˜•์„ ์ƒ์†๋ฐ›์€ ์ •์‚ฌ๊ฐํ˜•์€ ๋„ˆ๋ฌด๋‚˜ ๋‹น์—ฐํ•ด ๋ณด์ž„. ํ•˜์ง€๋งŒ..
      • ๋งŒ์ผ setWidth() ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด
        • ์ •์‚ฌ๊ฐํ˜•์˜ ๊ฒฝ์šฐ height๋„ ๊ฐ™์ด ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.
        • ์ง์‚ฌ๊ฐํ˜•์€ setWidth()๋กœ ํญ์„ 2๋ฐฐ๋กœ ํ•˜๋ฉด ๋ฉด์ ์ด 2๋ฐฐ๊ฐ€ ๋จ
        • ์ •์‚ฌ๊ฐํ˜•์€ setWidth()๋กœ ํญ์„ 2๋ฐฐ๋กœ ํ•˜๋ฉด ๋ฉด์ ์ด 4๋ฐฐ๊ฐ€ ๋จ
        • ๋ถ€๋ชจ์˜ ์ •ํ•ฉ์„ฑ์„ ๊นจ๋ฒ„๋ฆผ
      • ์ž์‹์ด ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ธฐ๋Šฅ์„ ๋ถ€๋ชจ๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ
  • ์ƒ์†์— ๊ด€ํ•ด ๊นŠ์ด ์ƒ๊ฐํ•ด๋ณด๊ธฐ
    • ๊ฐœ, ๊ณ ์–‘์ด์— โ€œ๊ฑท๊ธฐโ€, โ€œ๋›ฐ๊ธฐโ€ ํ–‰์œ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ทธ ํ–‰์œ„๋ฅผ ๋™๋ฌผ๋ ˆ๋ฒจ๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์—†์Œ
      • ๋งŒ์•ฝ ๋™๋ฌผ ๋ ˆ๋ฒจ์— ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด, ์–ด๋ฅ˜์˜ ๊ฒฝ์šฐ ํ‡ดํ™”ํ•จ์ˆ˜๊ฐ€ ๋ฐœ์ƒ (๊ฑท๊ธฐ, ๋›ฐ๊ธฐ ๋ถˆ๊ฐ€)
    • ์ฆ‰, ๋™๋ฌผ ์ƒ์† ๊ตฌ์กฐ์—์„œ โ€œ๊ฑท๊ธฐโ€, โ€œ๋›ฐ๊ธฐโ€๋Š” ๋„ฃ์„ ์ˆ˜ ์—†์Œ
    • ์ƒ์†๊ณผ ๋ณ„๋„๋กœ ์กด์žฌํ•ด์•ผ ํ•จ
  • UIKit์—์„œ LSP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ
    • VC์— ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ View ์š”์†Œ๋ฅผ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. (10๊ฐœ)
    • ํ•ด๋‹น view๋“ค์˜ height๋ฅผ ๋ชจ๋‘ 30์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ชจ๋“  ๋ทฐ๋“ค์˜ height์˜ ํ•ฉ๊ณ„๋ฅผ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‹ถ๋‹ค.
    • ๋‹น์—ฐํžˆ 300์ด๋ผ๋Š” ๊ฐ’์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ๊ทธ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋„์ถœ๋œ๋‹ค.
    • ๊ทธ ์ด์œ ๋Š” UIView๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ View ํด๋ž˜์Šค๋“ค์ด ๋งŒ๋“ค์–ด์ง€๋‚˜, ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋†’์ด์— ์ œํ•œ์„ ๋‘๋Š” ๊ฒƒ๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ
    • ๋ถ€๋ชจ์˜ ํ–‰์œ„๋ฅผ ์ž์‹์ด ๊ฑฐ๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
    • ๋ฌผ๋ก , ๊ฒฝํ—˜์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ธ์ง€ํ•˜๊ณ  ์žˆ์œผ๋‚˜, ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์ด ๋งŽ๋‹ค๋ฉด ์ž‘์—…์ด ์–ด๋ ค์›Œ์ง
  • LSP ์œ„๋ฐ˜์‹œ ๋ฌธ์ œ
    • ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์„œ ์ฝ”๋”ฉํ•ด์•ผ ํ•จ
      • ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€
    • OCP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋จ
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ , ์ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํŠน์ • ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ
      • ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ
    • ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ๋†’์ž„
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ถ”์ƒํ™”๋กœ ์ฝ”๋“œ ์ž‘์—…์ด ๋ถˆ๊ฐ€ํ•จ
    • ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒ
    • ๋Œ€๋ถ€๋ถ„์€ LSP๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏฟ์–ด๋„ ๋œ๋‹ค.
  • LSP ์ค€์ˆ˜์‹œ ํšจ๊ณผ
    • ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ์—†์ด ๋™์ž‘(๋‹คํ˜•์„ฑ)
    • ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋กœ ๊ณตํ†ต์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
      • ์ƒ์†๋œ ์ˆ˜๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ์ผ์ผ์ด ๊ณ ๋ฏผํ•˜์ง€ ์•Š์Œ
      • ํ™•์žฅ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•จ
        • ๊ธฐ๋Šฅ ํ™•์žฅ์„ ์œ„ํ•ด ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜! ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ผ ๋ฟ
        • Protocol extension์ด๋ผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ
  • ํ˜„์‹ค์ ์ธ ์ด์•ผ๊ธฐ
    • ๋ชจ๋“  ์ฝ”๋“œ์—์„œ LSP ์ง€ํ‚ค๊ธฐ๋Š” ์–ด๋ ค์›€
    • ์ ์ •์„ ์—์„œ Trade-Off
    • LSP๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋”ฐ๋ฅด๋ฉด
      • ์„ค๊ณ„์— ๋„์›€์ด ๋จ
      • ๋ฐœ์ƒํ•  ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
      • ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ƒ์†์„ ๋งŒ๋“ค์ง€ ์•Š๊ฒŒ ํ•จ
    • ๋ฉ์น˜ํฐ ์ฝ”๋“œ๋“ค์—์„œ ์ƒํ™ฉ์„ ๋‹ค๊ฐ์ ์ด๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ •์ œํ•˜๋Š”๋ฐ ๋„์›€์„ ์คŒ

Interface Sergregation Principle (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

  • ISP
  • ํ•œ์ค„ ์„ค๋ช…
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์ด ์ด์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
    • A๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ B๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, B ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋ผ๋Š” ์˜๋ฏธ
  • ์˜๋ฌธ๊ณผ ๊ณ ๋ฏผ
    • ๊ทธ๋Ÿผ ๊ทธ๋ƒฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“ค๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?
    • ๋‹ค์‹œ ํ•œ์ค„ ์„ค๋ช…์˜ ๋‹จ์–ด๋“ค์˜ ์ •์˜๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
    • ํด๋ผ์ด์–ธํŠธ
      • ์–ด๋–ค ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ
    • ์„œ๋ฒ„
      • ์‚ฌ์šฉ๋˜๋Š” ์ชฝ
    • ์˜์กด
      • ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๋ง
    • ์„œ๋ฒ„ ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ œ๊ณตํ•ด์„œ ๋‘˜ ๊ฐ„์˜ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถฐ์•ผ ํ•จ
  • ์‚ฌ์šฉ ๋ฐฉ์‹
    • ์„œ๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์†์„ ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      • ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ์˜ ์„ ์–ธ์„ ๊ฐ•์ œํ•˜๊ฒŒ ๋จ
      • ์ด๋Š” ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ‡ดํ™”์‹œ์ผœ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ = LSP ์œ„๋ฐ˜
      • ๋ฉ์น˜๊ฐ€ ํฐ protocol์„ ์ƒ์† ๋ฐ›์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
        • Swift์—์„œ๋Š” Protocol์— ์ž‘์„ฑ๋œ ๊ฒƒ์€ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
        • ๋ฌผ๋ก  Optional์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ด Optional์„ ๋”ฐ๋กœ protocol๋กœ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Œ
    • ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ์„œ๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ
      • ์ง์ ‘์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํฌ๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ์•Š์Œ
      • ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ์‹œ ์˜์กด๊ด€๊ณ„์— ์˜ํ•ด ๋ถˆํ•„์š”ํ•œ ์ปดํŒŒ์ผ์ด ์š”๊ตฌ๋จ
      • ๋ถˆํ•„์š”ํ•œ ๋ชจ๋“ˆ์˜ ์—…๋ฐ์ดํŠธ ์œ ๋ฐœ
  • ์˜ˆ์‹œ
    • Hashable
      • Protocol
      • String์—ญ์‹œ hashable ์ฑ„ํƒํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ž‘์€ ๊ฐ™๊ฒŒ ํ•จ
      • ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ํŠน์ •ํ•จ์ˆ˜์—์„œ Hashable ์— ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, String์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์žก๊ธฐ๋ณด๋‹ค Hashable๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด ์ข‹์Œ
        • String๋ณด๋‹ค Hashable์ด ๋” ์ž‘์€ Interface์ด๊ธฐ ๋•Œ๋ฌธ
        • ํด๋ผ์ด์–ธํŠธ์™€ String ์‚ฌ์ด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ํ•œ๋ฒˆ ๋Š์„ ์ˆ˜ ์žˆ์Œ
      •   func myFunction(key: String) {
              let hashValue = key.hashValue
              // continue
          }
         
          func meyFunction(key: Hashable) {
              let hashValue = key.hashValue
          }
    • UITableViewDataSource & UITableViewDelegate ๋ถ„๋ฆฌ
      • ๋™์ž‘์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ œ๊ณต
    • Swift์—์„œ ์ž˜๊ฒŒ ๋ถ„ํ•ด๋œ Protocol๋“ค
      • Equatable, Comparable, Hashable etc
  • ํ†ต์ƒ์ ์ธ ์ž‘์—… ๋ฐฉ์‹
    • ๋ณดํ†ต ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค ์ชฝ์ด ์„œ๋ฒ„ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์ปคํ”Œ๋ง๋˜์–ด ์žˆ์Œ
      • ๋ณ„๋„๋กœ ๋ถ„๋ฆฌ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์„œ๋ฒ„ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ
      • ์„œ๋ฒ„ ํด๋ž˜์Šค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํด๋ผ์ด์–ธํŠธ์— ๊ฐ•ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นจ
    • ISP ์ ์šฉ
      • ์„œ๋ฒ„ ํด๋ž˜์Šค๋ฅผ SRP ์ค€์ˆ˜ํ•˜๋„๋ก ์ž˜๊ฒŒ ๋ถ„ํ•ด
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ทธ๋ฃน ๋ณ„๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ
      • ๋‚จ๋ฐœํ•  ๊ฒฝ์šฐ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•จ
      • Protocol๋กœ ์ž‘์—…ํ•˜๋ฉด ๊ฐ„๊ฒฐํ•จ
  • Protocol Oriented Programming
    • POP ์‹ค์ฒœ์€, ISP ์ดํ•ด์™€ ์Šต๊ด€์œผ๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•จ
    • ๊ณ ์ „์ ์ธ ISP๋Š” abstract class๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋‚˜ swift์—์„œ protocol๋กœ ๋ณ€ํ™”ํ•จ
    • ISP์— ๋”ฐ๋ผ ์ž‘๊ฒŒ ๋ถ„ํ•ด๋œ Interface๋ฅผ ์ด์šฉํ•ด ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด POP
  • ์š”์•ฝ
    • ํฐ ๋ฉ์–ด๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๊ตฌ์ฒด์ ์ด๊ณ  ์ž‘์€ ๋‹จ์œ„๋“ค๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ ํด๋ผ์ด์–ธํŠธ๋“ค์ด ๊ผญ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

Dependency Inversion Principle (์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ์›์น™)

  • DIP
  • ํ•œ์ค„ ์„ค๋ช…
    • ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์›์น™
    • ์ƒ์œ„ ๋ชจ๋“ˆ์€ ํ•˜์œ„ ๋ชจ๋“ˆ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    • ์ƒ์œ„ ๋ชจ๋“ˆ๊ณผ ํ•˜์œ„๋ชจ๋“ˆ ๋ชจ๋‘ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
    • ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์— ์˜์กดํ•˜๋Š” ์ „ํ†ต์ ์ธ ์˜์กด๊ด€๊ณ„๋ฅผ ์—ญ์ „์‹œ์ผœ ์ƒ์œ„๊ณ„์ธต์ด ํ•˜์œ„๊ณ„์ธต์˜ ๊ตฌํ˜„์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ๋˜๋„๋ก ํ•œ๋‹ค.
    • ์ถ”์ƒํ™”๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์„ธ๋ถ€์‚ฌํ•ญ์ด ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
  • ํ’€๊ณ  ์‹ถ์€ ์ƒํ™ฉ
    • ์ƒ์œ„ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒฝํ–ฅ
    • ์ •์ฑ…์ด ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๋Š” ๊ฒฝํ–ฅ
  • ๋ชฉ์ 
    • ๋ชจ๋“ˆ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋Š๋Š” ๋ฐฉ๋ฒ• ์ œ์‹œ
    • ๋ณ€๊ฒฝ์‹œ ๋‹ค๋ฅธ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ œ์‹œ
  • ๋ชจ๋“ˆ์˜ ์˜์กด ๊ด€๊ณ„
    • ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ๋“  ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง
    • ์˜์กด ๊ด€๊ณ„ ์ž์ฒด๋ฅผ ์—†์•จ ์ˆ˜๋Š” ์—†์Œ
    • ํ•˜์ง€๋งŒ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ž˜ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๋Š” ๊ฒฝ์ง์„ฑ์„ ๊ฐ€์ง
    • ๋ฌด์—‡์ด ๋ฌด์—‡์— ์˜์กดํ•˜๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋ƒ„
  • ๋ฌธ์ œ ์ƒํ™ฉ ์˜ˆ์‹œ
    • ์„œ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“ˆ
      • Class A ์™€ Class B๊ฐ€ ์„œ๋กœ๊ฐ€ ์žˆ์–ด์•ผ ์กด์žฌ ์„ฑ๋ฆฝ
        • ์•„ํ‚คํ…์ณ ํŒจํ„ด์—์„œ ์ค‘๊ฐ„์— ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ด๋Ÿฐ ๊ฒฝ์šฐ
        • ๋งŒ์•ฝ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์žˆ๋‹ค๋ฉด weak์œผ๋กœ ๊ด€๊ณ„๋ฅผ ๋Š์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ
      • Class B๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด Class A๋„ ํ•จ๊ป˜ ๊ฐ€์•ผ๋งŒ ํ•˜๋Š” ์ƒํ™ฉ์ž„
        • ๋…๋ฆฝ์ ์ด์ง€ ๋ชปํ•จ
    • ์˜์กด ๊ด€๊ณ„๊ฐ€ ์ˆœํ™˜์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ
      • Class A โ†’ Class B โ†’ Class C โ†’ Class A
      • ์–ด๋Š ํด๋ž˜์Šค๋„ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    • ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š” ์˜์กด ๊ด€๊ณ„
      • Class A โ†’ Class B โ†’ Class C
      • ์ตœ์„ 
      • ํ˜„์‹ค์ ์œผ๋กœ ์–ด๋ ค์›€
      • ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ Class C๊ฐ€ B ํ˜น์€ A์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๋ฉด?
        • DIP๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Œ
  • ์˜์กด์˜ ๋ฐฉํ–ฅ
    • ์˜์กด ๊ด€๊ณ„๋Š” ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€์•ผ ํ•˜๋Š”๊ฐ€?
      • ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์—์„œ ์ถ”์ƒ์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ์˜์กดํ•ด์•ผ ํ•จ
      • ์ถ”์ƒ์ ์ธ ๊ฒƒ์ด ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
    • ์ •์ฑ…์ด ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๋Š” ๊ฒฝํ–ฅ
      • ์ •์ฑ…์€ ์ถ”์ƒ์ ์ธ ๊ฒƒ์ž„
    • ์ƒ์œ„ ์ˆ˜์ค€์€ ํ•˜์œ„ ์ˆ˜์ค€์— ์˜์กดํ•˜๋ฉด ์•ˆ๋จ
      • ์ƒ์œ„ ์ˆ˜์ค€: ์ถ”์ƒ์ ์ธ ๋ถ€๋ถ„
      • ํ•˜์œ„ ์ˆ˜์ค€: ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„
  • iOS ์˜ˆ์‹œ
    • UITableView
      • UITableView์˜ ๋™์ž‘์€ DataSource, Delegate์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ์ฃผ์ž…๋ฐ›์•„์„œ ๋™์ž‘ํ•จ
      • ์ถ”์ƒ์ ์ธ ๋ถ€๋ถ„(UITableView)์ด ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„(DataSource, Delegate์— ๊ตฌํ˜„๋œ ์ฝ”๋“œ)์— ์˜์กดํ•˜์ง€ ์•Š์Œ
      • ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค(DataSource, Delegate)์— ์˜์กดํ•จ
    • UIViewController, CustomViewController
      • UIViewController๋Š” View life-cycle์— ๋Œ€ํ•œ ์ •์ฑ… ๊ฒฐ์ •
      • CustomViewController๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ์ˆ˜ํ–‰
  • ํšจ๊ณผ
    • ๋‘ ๋ชจ๋“ˆ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ
    • ์ถ”์ƒํ™”๋œ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์žฌํ™œ์šฉ์„ฑ์ด ์ฆ๊ฐ€ํ•จ
  • ๊ณ ๋ฏผ ์‚ฌํ•ญ๋“ค
    • ๋ ˆ์ด์–ด์˜ ๊ตฌ๋ถ„
      • ์ถ”์ƒ์ ์ธ ๋ถ€๋ถ„ (์ •์ฑ…)
        • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„
        • ํ•ด๋‹น ๋กœ์ง์˜ ๋ผˆ๋Œ€
      • ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„ (์„ธ๋ถ€)
        • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„
        • ์ž๊พธ ์ถ”๊ฐ€๋˜๋Š” ๋ถ€๋ถ„
    • ์˜์กด์„ฑ์˜ ์ดํ–‰
      • ํŠน์ • ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•จ
      • ์˜์กด์„ฑ์˜ ์ดํ–‰์€ ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋งŒ๋“ฆ
      • ์ ํ•ฉํ•œ ์œ„์น˜์—์„œ DIP๋ฅผ ์ด์šฉํ•ด์„œ ์˜์กด์„ฑ ์ดํ–‰์„ ๋ง‰์•„์ฃผ์–ด์•ผ ํ•จ
    • ๊ฐ ๋ ˆ์ด์–ด์™€ ์ธํ„ฐํŽ˜์ด์Šค
      • ์ธํ„ฐํŽ˜์ด์Šค: ๊ฐ€์žฅ ๋ณ€ํ™”๊ฐ€ ์ ์–ด์•ผ ํ•จ
        • ์ƒ์œ„ ๋ ˆ์ด์–ด์™€ ํ•˜์œ„ ๋ ˆ์ด์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ
      • ์ƒ์œ„ ๋ ˆ์ด์–ด
        • ๋ณ€ํ™”๊ฐ€ ์ ์Œ
        • ์žฌํ™œ์šฉ์„ฑ ๋†’์Œ
      • ํ•˜์œ„ ๋ ˆ์ด์–ด
        • ์ž์ฃผ ๋ณ€๊ฒฝ๋จ
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ์†Œ์œ 
      • ๋ˆ„๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š”๊ฐ€?
      • Class A - Class B๋Š” ์„œ๋กœ ์ฐธ์กฐ์ค‘
      • Class A๊ฐ€ Class B๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
        • Class A๊ฐ€ interface ์ œ๊ณต, Class B๊ฐ€ ์‚ฌ์šฉ
        • Class B๊ฐ€ interface ์ œ๊ณต, Class A๊ฐ€ ์‚ฌ์šฉ: iOS ์ฑ„ํƒ
          • ViewController(A)๊ฐ€ UITableView(B)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
          • UITableView๊ฐ€ DataSource, Delegate๋ฅผ ์ œ๊ณตํ•˜๊ณ , ViewController๊ฐ€ ์‚ฌ์šฉ
          • DIP ๊ฐœ๋…์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค์™€ ์„œ๋ฒ„ ํด๋ž˜์Šค๋ฅผ ๋‚˜๋ˆ ๋ณธ๋‹ค๋ฉด,
            • UIViewController: ์„œ๋ฒ„ ํด๋ž˜์Šค
              • ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ (DataSource, Delegate)๋ฅผ ์ œ๊ณต
              • ํ•ด๋‹น ๋™์ž‘์ด ์‚ฌ์šฉ๋จ(์ˆ˜๋™)
              • ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋™์ž‘์„ ์‘๋‹ตํ•ด์คŒ
            • UITableView: ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค
              • ์ œ๊ณต๋œ ๋™์ž‘์„ ์‚ฌ์šฉํ•จ(๋Šฅ๋™)
          • ์ฆ‰, iOS์—์„œ ์ฑ„ํƒํ•˜๋Š” interface ์ œ๊ณต ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ interface๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ž„
            • ์ด์œ 
              • ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ์€, ํด๋ผ์ด์–ธํŠธ ์š”๊ตฌ์— ์˜ํ•ด์„œ ๋ฐœ์ƒ
              • ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•œ ์ชฝ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์œ ๋ฆฌ
              • ์ฆ‰, ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ์ค˜! ๋ผ๊ณ  ํ•˜๋‹ˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๋Š” ๋ง
    • ํด๋ž˜์Šค์˜ ํœ˜๋ฐœ์„ฑ์— ๋”ฐ๋ฅธ ์ ์šฉ
      • ํœ˜๋ฐœ์„ฑ
        • ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ํด๋ž˜์Šค
        • String, Data etc
      • ๋น„ํœ˜๋ฐœ์  ํด๋ž˜์Šค ๊ฒฝ์šฐ ๊ฐ•ํ•˜๊ฒŒ ์ ์šฉํ•  ํ•„์š” ์—†์Œ
      • ๋น„ํœ˜๋ฐœ์  ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ํฐ ํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Œ
      • ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค(DataSource, Delegate)๋Š” ๋น„ํœ˜๋ฐœ์  ํด๋ž˜์Šค์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์†Œ์œ ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜