ํฌ์ŠคํŠธ

SOLID ์›์น™

SOLID ์›์น™

๐Ÿ’ซ Solid


๊ฒฌ๊ณ ํ•˜๊ณ  ๋‹จ๋‹จํ•œ.

๐Ÿ’ซ The SOLID principles


๊ฒฌ๊ณ ํ•˜๊ณ  ๋‹จ๋‹จํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™.

  • S : Single Responsibility Principle๋‹จ์ผ์ฑ…์ž„์›์น™
  • O : Open-Closed Principle๊ฐœ๋ฐฉ-ํ์‡„์˜ ์›์น™
  • L : Liskov Substitution Principle๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™
  • I : Interface Segregation Principle์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™
  • D : Dependency Inversion Principle์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™

๐Ÿ’ซ S : Single Responsibility Principle | ๋‹จ์ผ์ฑ…์ž„์›์น™


๐Ÿซง ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„(๋ชฉ์ )๋งŒ์„ ๊ฐ€์ง„๋‹ค

Like Unity Component, ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งŒ ๊ฐ€์ง„๋‹ค.

ํ”Œ๋ ˆ์ด์–ด์˜ Audio, Input, Movement ๊ธฐ๋Šฅ์„ Player๋ผ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ํ•ฉ์ณ์„œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
PlayerAudio, PlayerInput, PlayerMovement ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ฒŒ ํ•œ๋‹ค.

ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์ด ์ฑ…์ž„๊ณผ ๋ถ€ํ•ฉํ•œ๋‹ค.

๐Ÿซง ํด๋ž˜์Šค๋Š” ๊ทธ ์ฑ…์ž„์„ ์™„์ „ํžˆ ์บก์Šํ™”ํ•ด์•ผ ํ•œ๋‹ค

ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ด์œ ๋„ ๋‹จ ํ•˜๋‚˜์˜ ์ด์œ ์—ฌ์•ผํ•œ๋‹ค.
ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก, ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค.

๐Ÿซง S : Memo

  • ํ•จ์ˆ˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€
    • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„(๋ชฉ์ )๋งŒ์„ ๊ฐ€์ง„๋‹ค.
  • ํด๋ž˜์Šค ๋‹น ์ฝ”๋“œ ๊ฐ์†Œ
    • ํด๋ž˜์Šค๋ฅผ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ํด๋ž˜์Šค์˜ ๊ธธ์ด๊ฐ€ ์งง์•„์ง„๋‹ค.
  • ํด๋ž˜์Šค ์˜์กด์„ฑ ๊ฐ์†Œ
    • ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋˜์–ด๋„ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

=>

  • Readability (๊ฐ€๋…์„ฑ)
    • ์งง์€ ํด๋ž˜์Šค๊ฐ€ ์ฝ๊ธฐ ์‰ฝ๋‹ค.
  • Extensibility (ํ™•์žฅ์„ฑ)
    • ์ž‘์€ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์ด ์‰ฝ๋‹ค.
  • Reusability (์žฌ์‚ฌ์šฉ์„ฑ)
    • ๋ถ€๋ถ„์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘๊ณ  ๋ชจ๋“ˆ์‹์œผ๋กœ ์„ค๊ณ„
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

๐Ÿ’ซ O : Open-Closed Principle | ๊ฐœ๋ฐฉ-ํ์‡„์˜ ์›์น™


ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ˆ˜์ • ์—†์ด ๋™์ž‘์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿซง ํ™•์žฅ์—๋Š” ์—ด๋Ÿฌ์žˆ๊ณ 

  • ๋ชจ๋“ˆ์˜ ๋™์ž‘์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ, ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•ด ๋ชจ๋“ˆ์„ ํ™•์žฅ
  • ์ฆ‰, ๋ชจ๋“ˆ์ด ํ•˜๋Š” ์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿซง ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผํ•œ๋‹ค

  • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ชจ๋“ˆ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๋ชจ๋“ˆ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (ex:DLL) ์˜ ์ˆ˜์ •์ด ํ•„์š” ์—†์Œ

๐Ÿซง O : Memo

AreaCalculator ์•ˆ์— ์‚ผ๊ฐํ˜•, ์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋„ฃ๊ฒŒ ๋˜๋ฉด,
๋‚˜์ค‘์— ์˜ค๊ฐํ˜•, ์œก๊ฐํ˜• ์„ ์ถ”๊ฐ€ํ•  ๋•Œ AreaCalculator ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

๋Œ€์‹  CalculateArea() ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ Shape ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ ,
์‚ผ๊ฐํ˜•, ์‚ฌ๊ฐํ˜•, ์˜ค๊ฐํ˜• ๋“ฑ์˜ ํด๋ž˜์Šค์—์„œ ์ด๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด AreaCalculator ํด๋ž˜์Šค๋Š” Shape.CalculateArea()๋ฅผ ์ด์šฉํ•ด ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ,
์ƒˆ๋กœ์šด ๋„ํ˜•์ด ์ถ”๊ฐ€๋˜์–ด๋„ AreaCalculator ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

=> ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ซ L : Liskov Substitution Principle | ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™


๐Ÿซง ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

(ํŒŒ์ƒ, ์ž์‹, ํ•˜์œ„) <-> (๊ธฐ์กด, ๋ถ€๋ชจ, ์ƒ์œ„)

  • ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฐฉํ–ฅ์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋Š” ์›์น™ ์œ„๋ฐ˜ (๋ฐฉํ–ฅ์„ฑ์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฏ€๋กœ)
  • ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค๋กœ ๋ฐ”๊ฟ”๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

  • ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์›์น™
  • OOP์˜ ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ทธ๋Ÿฌ๋‚˜, ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒ

๐Ÿซง ์ƒ์†๋ณด๋‹ค๋Š” ๊ตฌ์„ฑ

= ์ƒ์†๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก
= is-a ๋ณด๋‹ค๋Š” has-a

  • ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ํด๋ž˜์Šค API๋ฅผ ๊ณ ๋ ค
    • ํ˜„์‹ค์˜ ๋ถ„๋ฅ˜๊ฐ€ ํ•ญ์ƒ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
    • Ex: Car์™€ Train์ด ๋ณ„๋„์˜ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ 
      • X : Vehicle (GoFoward, Reverse, TurnRight, TurnLeft) -> Car, Train
        • ๊ธฐ์ฐจ๋Š” ๊ธธ์„ ๋”ฐ๋ผ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— TurnRight, TurnLeft๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
      • O : IMovable (GoFoward, Reverse), ITurnable (TurnRight, TurnLeft)
        • RoadVehicle (IMovable, ITurnable) -> Car
        • RailVehicle (IMovable) -> Train

๐Ÿซง L : Memo

  • ์ถ”์ƒํ™”๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€

  • ํ•˜์œ„ ํด๋ž˜์Šค์—๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ํผ๋ธ”๋ฆญ ๋ฉค๋ฒ„ ์กด์žฌ
  • ์„œ๋ธŒํด๋ž˜์‹ฑํ•  ๋•Œ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ฆฌ์Šค์ฝ”ํ”„์น˜ํ™˜์›์น™ ์œ„๋ฐฐ
    • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฏ€๋กœ

๐Ÿ’ซ I : Interface Segregation Principle | ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™


ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.

ํฐ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ์ชผ๊ฐœ์ง„ ์ž‘์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ข‹๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž์‹ ์ด ์ด์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ์›์น™
  • ํฐ ๋ฉ์–ด๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๊ตฌ์ฒด์ ์ด๊ณ  ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ
    • ํด๋ผ์ด์–ธํŠธ๋“ค์ด ๊ผญ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋“ค๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์‹œ์Šคํ…œ ๋‚ด๋ถ€ ์˜์กด์„ฑ์„ ์•ฝํ™”ํ•˜๊ณ  ์œ ์—ฐ์„ฑ์„ ๊ฐ•ํ™”

๐Ÿ’ซ D : Dependency Inversion Principle | ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™


๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜

  • ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ํŠน์ • ํ˜•์‹
  • ์ƒ์œ„(High-level) ๋ชจ๋“ˆ์€ ํ•˜์œ„(Low-level) ๋ชจ๋“ˆ์˜ ๊ฒƒ์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋ฉด ์•ˆ๋จ
    • ๋‘˜ ๋‹ค ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•จ
  • ์ถ”์ƒํ™”๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋จ.
    • ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•จ.
  • ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ
    • ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋งŽ์ด ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์•ˆ๋จ
    • ์ข…์†์„ฑ(dependency) ๋˜๋Š” ๊ฒฐํ•ฉ(coupling) ๋ฐœ์ƒ
    • ์ข…์†์„ฑ์€ ์–ด๋Š ์ž ์žฌ์ ์ธ ์œ„ํ—˜
  • X : Switch๊ฐ€ Door, Light, Fan์„ ๋ชจ๋‘ ์ง์ ‘ ์ œ์–ด (์˜์กด)
    • ๋‹ค๋ฅธ ๊ธฐ๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด Switch๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•จ
  • O : Swtich๊ฐ€ ISwitchable์„ ์ œ์–ด
    • Door, Light, Fan์€ ๊ฐ๊ฐ ISwitchable์„ ๊ตฌํ˜„

๐Ÿ’ซ Ref


์ฐธ๊ณ  : โ€˜SOLID (๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„)โ€™

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.