์–ด๋Š ์ง‘๋‹จ์ด๋“  ๋”ฐ๋ผํ•˜๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์ •์—๋„ ์žˆ๊ณ , ํ•™๊ต์—๋„ ์žˆ๊ณ , ์ง์žฅ์—๋„ ์žˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํ’ˆ์งˆ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ˆ๊ฑด์ด๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋“ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ , ์ด๋ฅผ ์ˆ˜ํ˜ธ(?)ํ•˜๊ธฐ ์œ„ํ•œ ์›์น™๋“ค์— ๋Œ€ํ•ด์„œ ์ƒ๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค ํ•œ๋‹ค. ์ด๋ฒˆ ๊ธ€์€ Kent Beck์˜ Implement Pattern์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.

ํŒ๋‹จ ๊ธฐ์ค€์ด ํ•„์š”ํ•œ ์ด์œ 

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ ์ž‘์„ฑ ๋งค ์ˆœ๊ฐ„ ํŒ๋‹จ์„ ์š”๊ตฌํ•จ
  • ํ•˜์ง€๋งŒ ์ œ์•ฝ ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์“ธ ์ˆ˜๋Š” ์—†์Œ
  • ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์˜€๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๋” ์ด์ƒํ•ด์ง
  • ์™œ์ผ๊นŒ?
  • ํŒ๋‹จ ๊ธฐ์ค€์ด ํ•„์š”ํ•จ
  • ํŒ๋‹จ ๊ธฐ์ค€์€ ํ•ฉ์˜๊ฐ€ ํ•„์š”

๊ตฌํ˜„์— ์žˆ์–ด ํ•„์š”ํ•œ ๊ฐ€์น˜ 3๊ฐ€์ง€

  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์žˆ์–ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ€์น˜
    • ์ฝ”๋“œ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณ„์† ์ฝ์–ด์•ผ ํ•จ
    • ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์†Œํ†ตํ•จ
    • ์ฝ๊ณ  ์ดํ•ด์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†์Œ
  • ๋‹จ์ˆœํ•จ
    • ๋‹จ์ˆœํ•˜์—ฌ์•ผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ๋„์›€์ด ๋จ
    • ๋ฒ„๊ทธ๊ฐ€ ์—†์–ด์ง
    • ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ
    • ์ฃผ์˜ํ•  ์ 
      • ๋‹จ์ˆœํ•จ์€ ๊ฐœ๋ฐœ์ž, ์กฐ์ง ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง
        • ์ƒ๋Œ€์ ์ธ ๊ฒƒ
      • ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ ์œ„ํ•œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ํŒจํ„ด๋„ ๊ฒฝ๊ณ„์˜ ๋Œ€์ƒ์ž„
        • ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์Œ
      • ๋‹จ์ˆœํ•จ๊ณผ ์งง์Œ๊ณผ๋Š” ๋‹ค๋ฆ„
        • ๋‹จ์ˆœํ•จ์€ ์ฝ๊ธฐ ์‰ฌ์›€์— ๊ฐ€๊นŒ์›€
  • ์œ ์—ฐํ•จ
    • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜๊ณผ ๋‹จ์ˆœํ•จ์ด ๋งŒ์กฑ๋˜๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ตฌ
    • ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ผ์— ์‚ฌ์šฉ
      • ๊ฐ€๋Šฅํ•œ ํ•œ ์œ ์—ฐํ•˜๊ฒŒ ์œ ์ง€
    • ์œ ์—ฐ์„ฑ ํ™•๋ณด๋Š” ๋‹จ์ˆœํ•จ์™€ Trade off

๊ฐ€์น˜๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ์›์น™ 6๊ฐ€์ง€

  • ์ง€์—ญ์  ๋ณ€ํ™”
    • ์ฝ”๋“œ ์ˆ˜์ •์‹œ ํ•จ๊ป˜ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„ ์ตœ์†Œํ™”/์ง€์—ญํ™”
    • ์ฝ”๋“œ ๊ด€๋ฆฌ ๋น„์šฉ์„ ์ค„์ž„
    • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์„ ๋†’์ž„
  • ์ตœ์†Œ ์ค‘๋ณต
    • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋Š” ๋™์‹œ์— ๋‹ค๋ฅธ ๋ถ€๋ถ„๊นŒ์ง€ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
    • ๊ด€๋ฆฌ๋น„์šฉ์„ ๋†’์ž„
  • ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ์˜ ๊ฒฐํ•ฉ
    • ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๊ณณ์— ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌ
      • ๋กœ์ง์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘
    • ๋ฐ์ดํ„ฐ ์ˆ˜์ •์‹œ ๋กœ์ง ์ˆ˜์ • ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
  • ๋Œ€์นญ์„ฑ
    • ์ฝ”๋“œ๋Š” ๋Œ€์นญ์„ฑ์„ ๊ฐ€์ง€๋ฉด ์ข‹์Œ
      • add - remove
      • ํ•จ๊ป˜ ์ƒ์„ฑ๋œ ๊ฒƒ์€ ํ•จ๊ป˜ ์†Œ๋ฉธ๋˜๋„๋ก ๊ตฌ์„ฑ
    • ์ฝ”๋“œ ์ดํ•ด์— ๋„์›€์„ ์คŒ
      • ๋Œ€์นญ์  ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด, A๊ฐœ๋… ์ดํ•ด์™€ ๋™์‹œ์— B๊ฐœ๋… ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅ
    • ์ค‘๋ณต์ฝ”๋“œ ์ค„์ด๊ธฐ ์‰ฌ์›€
  • ์„ ์–ธ์  ํ‘œํ˜„
    • ์„ ์–ธ์  ํ‘œํ˜„์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์˜ฌ๋ผ๊ฐ
    • โ€œ์–ด๋–ป๊ฒŒ ํ•˜๋Š๋ƒโ€ ๋ณด๋‹ค โ€œ๋ฌด์—‡์„ ํ•˜๋Š๋ƒโ€๋ฅผ ๊ธฐ์ˆ 
  • ๋ณ€ํ™”์œจ
    • ๊ฐ™์€ ์‹œ๊ฐ„๋‚ด ๊ฐ™์ด ๋ณ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค
    • ์‹œ๊ฐ„์  ๋Œ€์นญ์„ฑ
    • ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ vs ํŠน์ • ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    • ์˜๋„ ์ „๋‹ฌ์ด ์‰ฌ์›€
    • ์ฝ”๋“œ ์ˆ˜์ •์— ๋Œ€ํ•œ ์˜ํ–ฅ์ด ์ ์Œ

OOP์— ๋Œ€ํ•œ ์˜๋ฌธ๊ณผ ๊ณ ๋ฏผ

  • ์˜๋ฌธ๋“ค
    • ๋‹จ์ˆœํžˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด OOP์ผ๊นŒ?
    • OOP์—์„œ ๋งํ•˜๋Š” ๋งŽ์€ ๊ฐœ๋…์ค‘ ์–ด๋–ค ๊ฒƒ์ด ํ•ต์‹ฌ ๊ฐ€์น˜์ผ๊นŒ?
    • ์ž˜ ๋งŒ๋“ค์–ด์ง„ framework๋Š” ์™œ ๊ทธ๋Ÿฐ ๋ชจ์–‘์ผ๊นŒ?
    • ์ˆ˜๋งŽ์€ ๋””์ž์ธ ํŒจํ„ด๋“ค์„ ์ผ์ผํžˆ ์™ธ์›Œ์•ผ ํ• ๊นŒ?
  • Inheritance
    • OOP์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์ธ๊ฐ€?
      • ์ฃผ์žฅ: OOP์˜ ๊ฐ€์น˜ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์žฌํ™œ์šฉ, ์ƒ์†์ด ๊ทธ๋Ÿฌํ•œ ๋ถ€๋ถ„์—์„œ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
        • Super Class ๊ธฐ๋Šฅ ํ™•์žฅ
        • Super class ๊ธฐ๋Šฅ ์žฌํ™œ์šฉ
    • ์ข‹์€ ์„ ํƒ์ง€๊ฐ€ ์•„๋‹ ํ™•๋ฅ ์ด ๋†’์Œ
      • ์žฌํ™œ์šฉ ์œ„ํ•œ ์ƒ์† ๋‚จ๋ฐœ
      • ๊ณ ๊ฐ•๋„์˜ Coupling์ž„
      • ํ•œ๋ฒˆ ์ƒ์†์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด, ๋ฐ”๊พธ๋Š”๋ฐ ๋น„์šฉ์ด ๋งค์šฐ ํผ
      • ํ˜„์žฌ๋กœ์„œ๋Š” ์ƒ์†๋ณด๋‹ค Composition์ด ๋ณด๋‹ค ์ข‹์€ ํ•ด๋ฒ•์ž„
      • ๋˜๋„๋ก์ด๋ฉด ์ƒ์†์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„๋ผ.
  • Abstraction
    • OOP์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…
    • ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์€ ์ผ๊ด€๋˜๊ฒŒ ์ถ”์ƒํ™”์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•จ
    • ์ƒ์† ์—ญ์‹œ, ์ถ”์ƒํ™” ๊ด€์ ์—์„œ ๋ฐ”๋ผ๋ณด์•„์•ผ ํ•จ
      • ๊ธฐ๋Šฅ์˜ ํ™•์žฅ์ด ์•„๋‹ˆ๊ณ , ์ถ”์ƒ์˜ ๊ตฌ์ฒดํ™” ๋„๊ตฌ๋กœ ๋ด์•ผ ํ•จ
        • UIViewController๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜์—ฌ(์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ) ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  CustomViewController๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๋ฌด์—‡์„ ๊ณต๋ถ€ํ•ด์•ผ ํ• ๊นŒ?
    • ์ž˜ ์„ค๊ณ„๋œ OOP Code์˜ ๊ณตํ†ต์ ์„ ํŒŒ์•…ํ•˜์ž.
    • ๋ชจ๋“  ๋””์ž์ธ ํŒจํ„ด์„ ์™ธ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์–ด๋–ป๊ฒŒ ์œ ๋„ํ•  ์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”
    • ์ด๊ฒƒ์„ ์ž˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ด SOLID
    • ์ฆ‰, ๋””์ž์ธ ํŒจํ„ด ์•„๋ž˜์— ์กด์žฌํ•˜๋Š” ๊ฐœ๋…์ด SOLID์ด๋‹ค.
  • SOLID
    • Single Respoinsibility Principle (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)
    • Open / Closed Principle (๊ฐœ๋ฐฉ ํ์‡„ ์›์น™)
    • Liskov Subsitution Principle (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)
    • Interface Sergregation Principle (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)
    • Dependency Inversion Principle (์˜์กด ๊ด€๊ณ„ ์—ญ์ „ ์›์น™)

Reference