๐Ÿ’ป CS

SOLID 5์›์น™

JerryiOS 2023. 4. 5. 21:40

๐Ÿ–๐Ÿป SOLID 5์›์น™

1๏ธโƒฃ SRP (๋‹จ์ผ์ฑ…์ž„์˜ ์›์น™)

ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์ •์˜

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

์ ์šฉ๋ฐฉ๋ฒ•

  • ์—ฌ๋Ÿฌ ์›์ธ๋“ค ์†์— ํ˜ผ์žฌ๋œ ๊ฐ ์ฑ…์ž„์„ ๊ฐœ๋ณ„ ํด๋ž˜์Šค๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํด๋ž˜์Šค ๋‹น ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๋งก๋„๋ก ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ๊ด€๊ฑด์€ ์ฑ…์ž„๋งŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ถ„๋ฆฌ๋œ ๋‘ ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋งŒ์•ฝ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋“ค์ด ์œ ์‚ฌํ•˜๊ณ  ๋น„์Šทํ•œ ์ฑ…์ž„์„ ์ค‘๋ณตํ•ด์„œ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด Extract Superclass๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Extract Superclass๋Š” Extact๋œ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋“ค์˜ ๊ณต์œ ๋˜๋Š” ์š”์†Œ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜์—ฌ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
      • ๋”ฐ๋ผ์„œ ๊ฐ๊ฐ์˜ Extract class๋“ค์€ ์œ ์‚ฌํ•œ ์ฑ…์ž„๋“ค์€ ๋ถ€๋ชจ์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ๋‹ค๋ฅธ ์ฑ…์ž„๋“ค์€ ๊ฐ๊ฐ์˜ class์—๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฐํƒ„์ด ์ˆ˜์ˆ  (Shotgun surgery)
    • Move Field์™€ Move Mehtod๋ฅผ ํ†ตํ•ด ์ฑ…์ž„์„ ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋กœ ๋ชจ์œผ๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฐ๋ฐœ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ณณ์— ๋ถ„ํฌ๋œ ์ฑ…์ž„๋“ค์„ ํ•œ ๊ณณ์— ๋ชจ์œผ๋ฉด์„œ ์„ค๊ณ„๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ํ•œ๋‹ค.

์ ์šฉ์ด์Šˆ

  • ํด๋ž˜์Šค๋Š” ์ž์‹ ์˜ ์ด๋ฆ„์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ผ์„ ํ•ด์•ผํ•œ๋‹ค.
    • ์˜ฌ๋ฐ”๋ฅธ ํด๋ž˜์Šค ์ด๋ฆ„์€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ฐ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ๊ฐœ๋…์„ ๋‚˜ํƒ€๋‚ด์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฌด์กฐ๊ฑด ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•œ๋‹ค๊ณ  SRP๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ๊ฐ ๊ฐœ์ฒด ๊ฐ„์˜ ์‘์ง‘๋ ฅ์ด ์žˆ๋‹ค๋ฉด ๋ณ‘ํ•ฉ์ด ์ˆœ ์ž‘์šฉ์˜ ์ˆ˜๋‹จ์ด ๋˜๊ณ  ๊ฒฐํ•ฉ๋ ฅ์ด ์žˆ๋‹ค๋ฉด ๋ถ„๋ฆฌ๊ฐ€ ์ˆœ ์ž‘์šฉ์˜ ์ˆ˜๋‹จ์ด ๋œ๋‹ค.

2๏ธโƒฃ OCP (๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)

์†Œํ”„ํŠธ ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ •์˜

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

์ ์šฉ๋ฐฉ๋ฒ•

  1. ๋ณ€๊ฒฝ(ํ™•์žฅ)๋  ๊ฒƒ๊ณผ ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ์—„๊ฒฉํžˆ ๊ตฌ๋ถ„ํ•œ๋‹ค.
  2. ๊ตฌ๋ถ„ํ•œ ๋‘ ๋ชจ๋“ˆ์ด ๋งŒ๋‚˜๋Š” ์ง€์ ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.
  3. ๊ตฌํ˜„์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

์ ์šฉ์ด์Šˆ

  • ํ™•์žฅ๋˜๋Š” ๊ฒƒ๊ณผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ํฌ๊ธฐ ์กฐ์ ˆ์— ์‹คํŒจํ•˜๋ฉด ์˜คํžˆ๋ ค ๊ด€๊ณ„๊ฐ€ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•œ ๊ณ ๋ ค์™€ ์˜ˆ์ธก์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„์—์„œ ์ ๋‹นํ•œ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์„ ์„ ํƒํ•ด์•ผํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ถ”์ƒํ™”๋ผ๋Š” ๊ฐœ๋…์— ‘๊ตฌ์ฒด์ ์ด์ง€ ์•Š์€' ์ •๋„์˜ ์˜๋ฏธ๋กœ ๋Š์Šจํ•œ ๊ฐœ๋…์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜๋”” ๋ถ€์น˜๋Š” ์ถ”์ƒํ™”๋ž€ ๋‹ค๋ฅธ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์‹๋ณ„๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ณธ์งˆ์ ์ธ ํŠน์ง•์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค. ์ฆ‰, ์ด ํ–‰์œ„์— ๋Œ€ํ•œ ๋ณธ์งˆ์ ์ธ ์ •์˜๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•œ๋‹ค.

3๏ธโƒฃ LSP (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)

ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ •์˜

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

์ ์šฉ๋ฐฉ๋ฒ•

  1. ๋งŒ์•ฝ ๋‘ ๊ฐœ์ฒด๊ฐ€ ๋˜‘๊ฐ™์€ ์ผ์„ ํ•œ๋‹ค๋ฉด ๋‘˜์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์ด๋“ค์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ๋‘”๋‹ค.
  2. ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ด๋“ค์„ ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฅด๊ฒŒ ํ•œ๋‹ค๋ฉด ๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‘˜์ด ์ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  3. ๊ณตํ†ต๋œ ์—ฐ์‚ฐ์ด ์—†๋‹ค๋ฉด ์™„์ „ ๋ณ„๊ฐœ์ธ 2๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
  4. ๋งŒ์•ฝ ๋‘ ๊ฐœ์ฒด๊ฐ€ ํ•˜๋Š” ์ผ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋” ํ•œ๋‹ค๋ฉด ๊ตฌํ˜„ ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ ์šฉ์‚ฌ๋ก€

  • LSP ์ ์šฉ ์ „
void f() {
        LinkedList lis = new LinkedList();
        // ...
        modify(list);
}

void modify(LinkedList list) {
        list.add(...);
        doSomethingWith(list);
}

List๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋ฉด ์œ„ ์ฝ”๋“œ๋„ ๋ฌธ์ œ๋Š” ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด HashSet์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด LinkedList๋ฅผ ๋‹ค์‹œ HashSet์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„๊นŒ?

LinkedList์™€ HashSet์€ ๋ชจ๋‘ Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

  • LSP ์ ์šฉ ํ›„
void f() {
        Collection collection = new HashSet();
        //...
        modify(list);
}

void modify(Collection collection) {
        collection.add(...);
        doSomethingWith(collection);
}

์ด์ œ Collection ์ƒ์„ฑ ๋ถ€๋ถ„๋งŒ ๊ณ ์น˜๋ฉด ๋งˆ์Œ๋Œ€๋กœ ์–ด๋–ค Collection ๊ตฌํ˜„ ํด๋ž˜์Šค๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ LSP๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฒ”์šฉ ์ž‘์—…์ด ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋ชจ๋‘ LSP๋ฅผ ์ž˜ ์ค€์ˆ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค์„ ์ œ์™ธํ•œ ๋ชจ๋“  Collection ์—ฐ์‚ฐ์—์„œ๋Š” modify()๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด modify()๋Š” ๋ณ€ํ™”์— ๋‹ซํ˜€ ์žˆ์œผ๋ฉด์„œ, ์ปฌ๋ ‰์…˜์˜ ๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๋Š” ๊ตฌ์กฐ(OCP)๊ฐ€ ๋œ๋‹ค.

์ ์šฉ์ด์Šˆ

  1. ํ˜ผ๋™๋  ์—ฌ์ง€๊ฐ€ ์—†๊ณ  ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ๊ณ ๋ คํ•ด ์„ ํƒํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.
  2. ๋‹คํ˜•์„ฑ์„ ์œ„ํ•œ ์ƒ์†๊ด€๊ณ„๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด Replace with Delegation์„ ํ•œ๋‹ค. ์ƒ์†์€ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค ๋“ฑ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์œผ๋ฏ€๋กœ IS-A๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
    1. LSP๋ฅผ ์ง€ํ‚ค๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์ƒ์†๋Œ€์‹  ํ•ฉ์„ฑ(composition)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  3. ์ƒ์† ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด Extract Subclass, Push Down Field, Push Down Method ๋“ฑ์˜ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ LSP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  4. IS-A๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค๊ณ  ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๋“ค๊ฐ„์˜ ๊ด€๊ณ„๋Š” ์ด๋“ค์˜ ์—ญํ• ๊ณผ ์ด๋“ค ์‚ฌ์ด์— ๊ณต์œ ํ•˜๋Š” ์—ฐ์‚ฐ์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋“ฑ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๊ฒ€ํ† ํ•ด๋ด์•ผ ํ•œ๋‹ค.
  5. ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค๋กœ ์น˜ํ™˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฐ›์•„๋“ค์ด๋Š” ์„  ์กฐ๊ฑด์—์„œ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ์ œ์•ฝ์‚ฌํ•ญ์ด ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์˜ ์ œ๋ฐ˜ ์‚ฌํ•ญ๋ณด๋‹ค ๋Š์Šจํ•˜๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
    1. ๋งŒ์•ฝ ์ œ์•ฝ์กฐ๊ฑด์ด ๋” ๊ฐ•ํ•˜๋‹ค๋ฉด ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์—์„œ ์‹คํ–‰๋˜๋˜ ๊ฒƒ์ด ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๊ฐ• ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4๏ธโƒฃ ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

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

์ •์˜

  • ํ•œ ํด๋ž˜์Šค๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ์›๋ฆฌ๋‹ค.
  • ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์ข…์†๋  ๋•Œ์—๋Š” ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ISP๋ฅผ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š”, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค ๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ์šฉ๋ฐฉ๋ฒ•

  1. ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๋ถ„๋ฆฌ
    1. ํด๋ž˜์Šค์˜ ์ƒ์†์„ ์ด์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์ฃผ์ง€ ์•Š์„ ๋ฟ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  2. ๊ฐ์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๋ถ„๋ฆฌ
    1. ์œ„์ž„(Delegation)์„ ์ด์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    • ์œ„์ž„์ด๋ž€, ํŠน์ • ์ผ์˜ ์ฑ…์ž„์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ๋งก๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, ๊ทธ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์ƒ์† ๋Œ€์‹  ์œ„์ž„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ ์šฉ์‚ฌ๋ก€

  • Java Swing์˜ JTable
import javax.swing.event.*;
import javax.swing.table.TableModel;

public class SimpleTableDemo ... implements TableModelListener {
    ...
    public SimpleTableDemo() {
        ...
        table.getModel().addTableModelListener(this);
        ...
    }
    //์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋…ธ์ถœํ•  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);

        ...// Do something with the data...
    }
    ...
}

JTable ํด๋ž˜์Šค์—๋Š” ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ๋‹ค.

JTable์€ ISP๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ํŠน์ • ์—ญํ• ๋งŒ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ ์šฉ์ด์Šˆ

  1. ๊ธฐ ๊ตฌํ˜„๋œ ํด๋ผ์ด์–ธํŠธ์— ๋ณ€๊ฒฝ์„ ์ฃผ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  2. ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ถ€๋ถ„์˜ ์žฌ์‚ฌ์šฉ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค.
  3. ์„œ๋กœ ๋‹ค๋ฅธ ์„ฑ๊ฒฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…๋ฐฑํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค.

5๏ธโƒฃ DIP (์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” “์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค" ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ •์˜

  • ์˜์กด ๊ด€๊ณ„์˜ ์—ญ์ „ Dependency Inversion ์ด๋ž€ ๊ตฌ์กฐ์  ๋””์ž์ธ์—์„œ ๋ฐœ์ƒํ•˜๋˜ ํ•˜์œ„ ๋ ˆ๋ฒจ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์ด ์ƒ์œ„ ๋ ˆ๋ฒจ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•˜๋Š” ์œ„๊ณ„๊ด€๊ณ„๋ฅผ ๋Š๋Š” ์˜๋ฏธ์˜ ์—ญ์ „์ด๋‹ค.
    • ์‹ค์ œ ์‚ฌ์šฉ ๊ด€๊ณ„๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉฐ, ์ถ”์ƒ์„ ๋งค๊ฐœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ์œผ๋กœ์จ ๊ด€๊ณ„๋ฅผ ์ตœ๋Œ€ํ•œ ๋Š์Šจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์›์น™์ด๋‹ค.
  • DIP๋Š” ๋ณต์žกํ•˜๊ณ  ์ง€๋‚œํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ„์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ด€๊ณ„๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์›์น™์ด๋‹ค.
  • ์ƒ์œ„๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

์ ์šฉ๋ฐฉ๋ฒ•

  1. Layering
  • ์ž˜ ๊ตฌ์กฐํ™”๋œ ๊ฐ์ฒด์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜๋“ค์€ ๊ฐ ๋ ˆ์ด์–ด๋งˆ๋‹ค ์ž˜ ์ •์˜๋˜๊ณ  ํ†ต์ œ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ธด๋ฐ€ํ•œ ์„œ๋น„์Šค๋“ค์˜ ์ง‘ํ•ฉ์„ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์–ด๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
    • ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•œ ๊ตฌ์กฐํ™” ๋งŒ์„ ๋œปํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Transitive Dependency๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๋กœ ์˜์กดํ™”ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹Œ, ๋‘˜ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์ถ”์ƒ๋ ˆ๋ฒจ์„ ํ†ตํ•ด ์˜์กดํ•ด์•ผ ํ•  ๊ฒƒ์„ ๋งํ•˜๊ณ  ์žˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด์„œ ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ์€ ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ๋กœ์˜ ์˜์กด์„ฑ์—์„œ ๋ฒ—์–ด๋‚˜ ๊ทธ ์ž์ฒด๋กœ ์žฌ์‚ฌ์šฉ๋˜๊ณ  ํ™•์žฅ์„ฑ๋„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ ์šฉ์‚ฌ๋ก€

  1. ํ†ต์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ
  2. ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ, ์ฝœ๋ฐฑ ๊ทธ๋ฆฌ๊ณ  JMS ๋ชจ๋ธ

 

์ถœ์ฒ˜


๋ฐ˜์‘ํ˜•