๐Ÿ“• [Object] 5์žฅ. ์ฑ…์ž„ ํ• ๋‹นํ•˜๊ธฐ

๋ฐ•์ƒ๋ฏผยท2024๋…„ 2์›” 29์ผ

Book

๋ชฉ๋ก ๋ณด๊ธฐ
11/22
post-thumbnail

โญ๏ธ ์ฑ…์ž„ ์ฃผ๋„ ์„ค๊ณ„๋ฅผ ํ–ฅํ•ด

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„์—์„œ ์ฑ…์ž„ ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ์›์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํ–‰๋™์„ ๋จผ์ € ๊ฒฐ์ •ํ•˜๋ผ.
  • ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ ์•ˆ์—์„œ ์ฑ…์ž„์„ ๊ฒฐ์ •ํ•˜๋ผ.

๐Ÿ“Œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํ–‰๋™์„ ๋จผ์ € ๊ฒฐ์ •ํ•˜๋ผ

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

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ ์ ˆํ•œ ๊ฐ์ฒด์—๊ฒŒ ์ ์ ˆํ•œ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋Š” ๋Šฅ๋ ฅ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ์ฒด์—๊ฒŒ ์–ด๋–ค ์ฑ…์ž„์„ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
ํ•ด๊ฒฐ์˜ ์‹ค๋งˆ๋ฆฌ๋ฅผ ํ˜‘๋ ฅ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๋ฌธ๋งฅ ์•ˆ์—์„œ ์ฑ…์ž„์„ ๊ฒฐ์ •ํ•˜๋ผ

๊ฐ์ฒด์—๊ฒŒ ํ• ๋‹น๋œ ์ฑ…์ž„์˜ ํ’ˆ์งˆ์€ ํ˜‘๋ ฅ์— ์ ํ•ฉํ•œ ์ •๋„๋กœ ๊ฒฐ์ •๋œ๋‹ค.
๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์˜๋„์— ์ ํ•ฉํ•œ ์ฑ…์ž„์„ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค. ํ˜‘๋ ฅ์— ์ ํ•ฉํ•œ ์ฑ…์ž„์„ ์ˆ˜ํ™•ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•œ ํ›„์— ๋ฉ”์‹œ์ง€๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ ํ›„์— ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.
๊ฐ์ฒด๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

๋ฉ”์‹œ์ง€๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
๋ฉ”์‹œ์ง€๋ฅผ ๋จผ์ € ํ‘œํ˜„ํ•˜๋ฉด, ์ˆ˜์‹ ์ž์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ๊ฐ€์ •์—์„œ๋„ ์ž์œ ๋กœ์›Œ์ง„๋‹ค. (๊น”๋”ํ•œ ์บก์Аํ™”)

๐Ÿ“Œ ์ฑ…์ž„ ์ฃผ๋„ ์„ค๊ณ„

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

โญ๏ธ ์ฑ…์ž„ ํ• ๋‹น์„ ์œ„ํ•œ GRASP ํŒจํ„ด

GRASP(General Responsibility Assign Software Pattern) ํŒจํ„ด์€ ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹นํ•  ๋•Œ ์ง€์นจ์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ๋Š” ์›์น™๋“ค์˜ ์ง‘ํ•ฉ์„ ํŒจํ„ด ํ˜•์‹์œผ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ ๋„๋ฉ”์ธ ๊ฐœ๋…์—์„œ ์ถœ๋ฐœํ•˜๊ธฐ

์ฑ…์ž„ ํ• ๋‹น ์‹œ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋„๋ฉ”์ธ ๊ฐœ๋…์ด๋‹ค.

  • ๋„๋ฉ”์ธ: ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ


์œ„ ๊ทธ๋ฆผ์€ ํ•˜๋‚˜์˜ ์˜ํ™”๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ์ƒ์˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ƒ์˜์€ ์—ฌ๋Ÿฌ๋ฒˆ ์˜ˆ์•ฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ• ์ธ ์ •์ฑ…๊ณผ ํ• ์ธ ์กฐ๊ฑด์€ ๊ฐ๊ฐ 2๊ฐœ์ด๋ฉฐ, ํ• ์ธ ์กฐ๊ฑด์€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ• ์ธ ์ •์ฑ…์€ ํ•˜๋‚˜๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์„ค๊ณ„ ์‹œ์ž‘ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐœ๋…๋“ค์˜ ์˜๋ฏธ๋‚˜ ๊ด€๊ณ„๊ฐ€ ์™„๋ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์ถœ๋ฐœ์ ์ด ํ•„์š”ํ•  ๋ฟ์ด๋‹ค.
๋„๋ฉ”์ธ ๊ฐœ๋…๊ณผ ๊ด€๊ณ„๋Š” ๊ตฌํ˜„์˜ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค.

๐Ÿ“Œ ์ •๋ณด ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ

์ฑ…์ž„ ์ฃผ๋„ ์„ค๊ณ„ ๋ฐฉ์‹์˜ ์ฒซ ๋‹จ๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๊ณตํ•ด์•ผ ํ•˜๋А ๊ธฐ๋Šฅ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฑ…์ž„์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ์ฑ…์ž„์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฑ…์ž„์งˆ ์ฒซ๋ฒˆ์งธ ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ

  • ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•  ๊ฐ์ฒด๋Š” ๋ฌด์—‡์„ ์›ํ•˜๋Š”๊ฐ€?

ํ˜‘๋ ฅ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฏธ์ •์ด์ง€๋งŒ ์ด ๊ฐ์ฒด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ด ๋ณด์ธ๋‹ค. ๋ฐ”๋กœ ์˜ํ™”๋ฅผ ์˜ˆ๋งคํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ˜‘๋ ฅ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฏธ์ •์ด์ง€๋งŒ ์ด ๊ฐ์ฒด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•˜๋‹ค.

๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ

  • ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ ํ•ฉํ•œ ๊ฐ์ฒด๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€?

์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒํƒœ์™€ ํ–‰๋™์„ ํ†ตํ•ฉํ•œ ์บก์Аํ™”์˜ ๋‹จ์œ„๋ผ๋Š” ์‚ฌ์‹ค์— ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹ค์•„๋Š” ์ฒซ ๋ฒˆ์งธ ์›์น™์€ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•  ์ •๋ณด๋ฅผ ์•Œ ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์—๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค. GRASP์—์„œ๋Š” INFORMATION EXPERT(์ •๋ณด ์ „๋ฌธ๊ฐ€) ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
INFORMATION EXPERT ํŒจํ„ด์€ ๊ฐ์ฒด๊ฐ€ ์ž์œจ์ ์ธ ์กด์žฌ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œํ‚จ๋‹ค.

์ •๋ณด๋ฅผ ์•Œ๊ณ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ์ด ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ• ์ง€ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.์ •๋ณด์™€ ํ–‰๋™์ด ๊ฐ€๊นŒ์šด๋ฐ ๋ญ‰์ณ ์บก์Аํ™”๊ฐ€ ์œ ์ง€๋˜๋ฉฐ, ์ •๋ณด๋ณ„๋กœ ์ฑ…์ž„์ด ๋ถ„์‚ฐ๋˜์–ด ์‘์ง‘๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค.๋˜ํ•œ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.

์•Œ๊ณ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ผญ ํ•„๋“œ(์ €์ž๋œ ๋ฐ์ดํ„ฐ)์ผ ํ•„์š”๋Š” ์—†๋‹ค. ์ •๋ณด๋Š” ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์•Œ๊ฑฐ๋‚˜ ๊ณ„์‚ฐํ•ด์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์˜์€ ์ƒ์˜ ์ˆœ๋ฒˆ, ์ƒ์˜ ์‹œ๊ฐ„, ์˜ํ™” ์ •๋ณด ๋“ฑ์˜ ๊ฐ€์žฅ ๋งŽ์€ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.


์ƒ์˜์€ ์˜ํ™” ๊ฐ€๊ฒฉ์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—(์บก์Аํ™”) ๊ณ„์‚ฐ์„ ์š”์ฒญํ•œ๋‹ค.


์˜ํ™”๋Š” ํ• ์ธ ์—ฌ๋ถ€ ํŒ๋‹จ์„ ๋ชปํ•˜๋ฏ€๋กœ ํ• ์ธ ์—ฌ๋ถ€ ํŒ๋‹จ์„ ์š”์ฒญํ•œ๋‹ค.


์˜ํ™”๋Š” ํ• ์ธ ์ •์ฑ…์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ• ์ธ ์ •์ฑ…์— ๋”ฐ๋ผ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“Œ ๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„

์„ค๊ณ„๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ํ™œ๋™์ด๋‹ค.
๋ช‡ ๊ฐ€์ง€ ์„ค๊ณ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ INFORMATION EXPERT ํŒจํ„ด ์ด์™ธ์˜ ๋‹ค๋ฅธ ์ฑ…์ž„ ํ• ๋‹น ํŒจํ„ด๋“ค์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ƒ์˜์ด ์ง์ ‘ ํ• ์ธ์กฐ๊ฑด์ด๋ž‘ ํ˜‘๋ ฅํ•œ๋‹ค๋ฉด?

LOW COPLING ํŒจํ„ด
์„ค๊ณ„์˜ ์ „์ฒด์ ์ธ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๊ฒŒ ์œ ์ง€๋˜๋„๋ก ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ.
์ƒ์˜์ด 2๊ฐœ์™€ ํ˜‘๋ ฅํ•˜๋Š” ๋‘๋ฒˆ์งธ ๊ตฌ์กฐ๋Š” ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ ์ข‹์ง€ ์•‰์€ ์„ค๊ณ„์ด๋‹ค.

HIGH COHESION ํŒจํ„ด
๋†’์€ ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ.
๋‘๋ฒˆ์งธ ๊ตฌ์กฐ๋Š” Screen์—๊ฒŒ ์˜ํ™” ์š”๊ธˆ ๊ณ„์‚ฐ ์ฑ…์ž„์ด ๋ถ„์‚ฐ๋œ๋‹ค. ์ฆ‰ Screen์˜ ์ฑ…์ž„์ด ๋Š˜์–ด๋‚œ๋‹ค.
์ด๋Š” ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ์—ฌ์ง€๋„ ์ฆ๊ฐ€ํ•œ๋‹ค.
์ฒซ๋ฒˆ์งธ ๊ตฌ์กฐ์—์„œ Movie์˜ ์ฑ…์ž„์€ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ• ์ธ์กฐ๊ฑด๊ณผ์˜ ํ˜‘๋ ฅ์€ ์‘์ง‘๋„ ๋†’์€ ์„ค๊ณ„์ด๋‹ค.

๐Ÿ“Œ ์ฐฝ์กฐ์ž ๊ฐ์ฒด์—๊ฒŒ ๊ฐ์ฒด ์ƒ์„ฑ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ

GRASP์˜ CREATOR(์ฐฝ์กฐ์ž) ํŒจํ„ด์€ ์ด ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ…์ž„ ํ• ๋‹น ํŒจํ„ด์œผ๋กœ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ฑ…์ž„์„ ์–ด๋–ค ๊ฐ์ฒด์—๊ฒŒ ํ• ๋‹นํ• ์ง€์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•œ๋‹ค.

CREATOR ํŒจํ„ด
์•„๋ž˜ ์กฐ๊ฑด์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋งŒ์กฑํ•˜๋Š” B์—๊ฒŒ ๊ฐ์ฒด ์ƒ์„ฑ ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ.

  • B๊ฐ€ A ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•œ๋‹ค
  • B๊ฐ€ A ๊ฐ์ฒด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค
  • B๊ฐ€ A ๊ฐ์ฒด๋ฅผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค
  • B๊ฐ€ A ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(์ด ๊ฒฝ์šฐ B๋Š” A์— ๋Œ€ํ•œ ์ •๋ณด ์ „๋ฌธ๊ฐ€๋‹ค)

์—ฐ๊ด€์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐ์ฒด์— ์ƒ์„ฑ ์ฑ…์ž„์„ ๋งก๊ธด๋‹ค. ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด๋ฏธ ๊ฒฐํ•ฉ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Screening์€ Reservation์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ฐ€์žฅ ๋งŽ์€ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค. (์ •๋ณด ์ „๋ฌธ๊ฐ€)

๐Ÿ“Œ DiscountCondition ๊ฐœ์„ ํ•˜๊ธฐ

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•œ ํด๋ž˜์Šค๋ž€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค์ด๋‹ค.

public class DiscountCondition {
    private DiscountConditionType type;
    private int sequence;
    private DayOfWeek dayOfWeek;
    private LocalTime startTime;
    private LocalTime endTime;

    public boolean isSatisfiedBy(Screening screening) {
        if (type == DiscountConditionType.PERIOD) {
            return isSatisfiedByPeriod(screening);
        }

        return isSatisfiedBySequence(screening);
    }

    private boolean isSatisfiedByPeriod(Screening screening) {
        return dayOfWeek.equals(screening.getWhenScreened().getDayOfWeek()) &&
                startTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0 &&
                endTime.compareTo(screening.getWhenScreened().toLocalTime()) <= 0;
    }

    private boolean isSatisfiedBySequence(Screening screening) {
        return sequence == screening.getSequence();
    }
}

DiscountCondition์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ํ• ์ธ ์กฐ๊ฑด ์ถ”๊ฐ€
    • issatisfiedBy ๋ฉ”์„œ๋“œ ์•ˆ if~else ๊ตฌ๋ฌธ ์ˆ˜์ •
    • DiscountCondition์— ์†์„ฑ ์ถ”๊ฐ€
  • ์ˆœ๋ฒˆ ์กฐ๊ฑด ํŒ๋‹จ ๋กœ์ง ๋ณ€๊ฒฝ

  • isSatisfiedBySequence ๋‚ด๋ถ€ ๊ตฌํ˜„ ์ˆ˜์ •

  • DiscountCondition์˜ sequence ์†์„ฑ ๋ณ€๊ฒฝ

๊ธฐ๊ฐ„ ์กฐ๊ฑด ํŒ๋‹จ ๋กœ์ง ๋ณ€๊ฒฝ

  • isSatisfiedByPeriod ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๊ตฌํ˜„ ์ˆ˜์ •
  • dayOfWeek, startTime, endTime ๋ณ€๊ฒฝ

์ฆ‰, DiscountCondition ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ณ€๊ฒฝ ์ด์œ ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค.
๋ณ€๊ฒฝ์˜ ์ด์œ ์— ๋”ฐ๋ผ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.ย 
์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์ , ์„œ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๋“ค์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

๐Ÿ“Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ์˜ ์ด์œ  ํŒŒ์•…ํ•˜๊ธฐ

์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ์‹œ์ .

  • ์‘์ง‘๋„๊ฐ€ ๋†’์€ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์†์„ฑ์„ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ์ผ๋ถ€๊ฐ€ null๋กœ ๋‚จ๊ฒจ์ง€๋Š” ํด๋ž˜์Šค๋‚˜, ๋‚˜์ค‘์— set๋˜๋Š” ํด๋ž˜์Šค๋Š” ์˜์‹ฌํ•ด๋ณธ๋‹ค.

์œ„์˜ ์‚ฌ๋ก€์—์„œ๋Š” sequence, dayOfWeek, startTime, endTime
-> ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”๋˜๋Š” ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋ฉ”์„œ๋“œ๋“ค์ด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

  • ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋“  ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค
  • ๋ฉ”์„œ๋“œ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์†์„ฑ์— ๋”ฐ๋ผ ๊ทธ๋ฃน์ด ๋‚˜๋‰œ๋‹ค๋ฉด ํด๋ž˜์Šค์˜ ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค

๐Ÿ“Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1: ํƒ€์ž… ๋ถ„๋ฆฌํ•˜๊ธฐ

DiscountCondition์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ˆœ๋ฒˆ ์กฐ๊ฑด๊ณผ ๊ธฐ๊ฐ„ ์กฐ๊ฑด์ด๋ผ๋Š” ๋‘๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํƒ€์ž…์ด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์•ˆ์— ๊ณต์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‘ ํƒ€์ž…์„ SequenceCondition, PeriodCondition ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • sequence ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ => SequenceCondition ์ด๋™
  • dayOfWeek, startTime, endTime => PeriodCondition ์ด๋™

๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค.


์ด์ œ Movie๋Š” ๋‘ ํด๋ž˜์Šค์™€ ํ˜‘๋ ฅํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€

  • ์•„๋Š” ํด๋ž˜์Šค๊ฐ€ 2๊ฐœ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง
  • ๋ชฉ๋ก ๋ณ„๋กœ ๋„ฃ๋Š” ๋กœ์ง์ด ํ•„์š”ํ•ด ๊ตฌํ˜„์ด ๊ท€์ฐฎ์•„์ง

์˜ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ“Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• 2: ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๋ถ„๋ฆฌ

Movie ์ž…์žฅ์—์„œ ๋‘˜์€ ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋™์ผํ•œ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•  ๋ฟ์ด๋‹ค.
์ฆ‰, ๋™์ผ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ํ–‰๋™์ด ์žˆ๋‹ค๋ฉด (if) ํƒ€์ž…์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณ€ํ™”ํ•˜๋Š” ํ–‰๋™์„ ๊ฐ ํƒ€์ž…์˜ ์ฑ…์ž„์œผ๋กœ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ์ฒด์˜ ์•”์‹œ์ ์ธ ํƒ€์ž…์— ๋”ฐ๋ผ ํ–‰๋™์„ ๋ถ„๊ธฐํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•”์‹œ์ ์ธ ํƒ€์ž…์„ ๋ช…์‹œ์  ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๊ณ  ํ–‰๋™์„ ๋‚˜๋ˆ”์œผ๋กœ์จ ์‘์ง‘๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค์‹œ ๋งํ•ด ๊ฐ์ฒด์˜ ํƒ€์ž…์˜ ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ํ–‰๋™์ด ์žˆ๋‹ค๋ฉด ํƒ€์ž…์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณ€ํ™”ํ•˜๋Š” ํ–‰๋™์„ ๊ฐ ํƒ€์ž…์˜ ์ฑ…์ž„์œผ๋กœ ํ• ๋‹นํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. GSASP์—์„œ๋Š” ์ด๋ฅผ POLYMORPHISM(๋‹คํ˜•์„ฑ) ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

POLYMORPHISM ํŒจํ„ด : ํƒ€์ž…๋ณ„ ๋ถ„๋ฆฌ
๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ๋•Œ, ๋ณ€ํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•  ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ฐ ํƒ€์ž…์— ๋‹คํ˜•์ ์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ์ฑ…์ž„์„ ํ• ๋‹นํ•˜๋ผ.
if~else ๋˜๋Š” switch-case๋“ฑ์˜ ์กฐ๊ฑด ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚œ ๊ฒฝ์šฐ ์กฐ๊ฑด ๋…ผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์„œ ํƒ€์ž…์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋Œ€์•ˆ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์กฐ๊ฑด์ ์ธ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งˆ๋ผ.

๐Ÿ“Œ Movie ํด๋ž˜์Šค ๊ฐœ์„ ํ•˜๊ธฐ

Movie ๋˜ํ•œ DiscountDondition๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ธˆ์•ก ํ• ์ธ ์ •์ฑ…๊ณผ ๋น„์œจ ํ• ์ธ ์ •์ฑ…์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์•ˆ์— ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ๋งํ•ด์„œ ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์€ ๊ฒƒ์ด๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์—ญ์‹œ DiscountCondition๊ณผ ๋™์ผํ•˜๋‹ค. ์—ญํ• ์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•ด์„œ ํ˜‘๋ ฅ์„ ๋‹คํ˜•์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
POLYMORPHISM ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํ–‰๋™์„ ํƒ€์ž…๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋‹คํ˜•์„ฑ์˜ ํ˜œํƒ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

public class Movie {
    private String title;
    private Duration runningTime;
    private Money fee;
    private List<DiscountCondition> discountConditions;

    private MovieType movieType;
    private Money discountAmount;
    private double discountPercent;

    public Money calculateMovieFee(Screening screening) {
        if (isDiscountable(screening)) {
            return fee.minus(calculateDiscountAmount());
        }

        return fee;
    }

    private boolean isDiscountable(Screening screening) {
        return discountConditions.stream()
                .anyMatch(condition -> condition.isSatisfiedBy(screening));
    }

    private Money calculateDiscountAmount() {
        switch(movieType) {
            case AMOUNT_DISCOUNT:
                return calculateAmountDiscountAmount();
            case PERCENT_DISCOUNT:
                return calculatePercentDiscountAmount();
            case NONE_DISCOUNT:
                return calculateNoneDiscountAmount();
        }

        throw new IllegalStateException();
    }

    private Money calculateAmountDiscountAmount() {
        return discountAmount;
    }

    private Money calculatePercentDiscountAmount() {
        return fee.times(discountPercent);
    }

    private Money calculateNoneDiscountAmount() {
        return Money.ZERO;
    }
}

calculateDiscountAmoutํ•จ์ˆ˜๋ฅผ ๋ณด๋‹ˆ switch๊ฐ€ ๋ณด์ธ๋‹ค.
์ด๋Š” ๋‘๊ฐ€์ง€ ํ• ์ธ ์ •์ฑ…์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์•ˆ์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
POLYMOPHISM ํŒจํ„ด์œผ๋กœ ํƒ€์ž…์„ ๋ถ„๋ฆฌํ•œ๋‹ค.
PROTECTED VARIATIONS ํŒจํ„ด์„ ์ด์šฉํ•ด Movie๋‚ด์˜ ์†์„ฑ๋“ค์„ ๋ถ„๋ฆฌํ•œ๋‹ค.

๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ์บก์Аํ™”๋ผ ์žˆ๊ณ  ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ์˜ ์ด์œ ๋ฅผ ์˜ค์ง ํ•˜๋‚˜์”ฉ๋งŒ ๊ฐ€์ง„๋‹ค. ๊ฐ ํด๋ž˜์Šค๋Š” ์‘์ง‘๋„๊ฐ€ ๋†’๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ์ตœ๋Œ€ํ•œ ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋ผ ์žˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์ž‘๊ณ  ์˜ค์ง ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฑ…์ž„์€ ์ ์ ˆํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋ผ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์ฑ…์ž„์„ ์ค‘์‹ฌ์œผ๋กœ ํ˜‘๋ ฅ์„ ์„ค๊ณ„ํ•  ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ˜œํƒ์ด๋‹ค.

๊ฒฐ๋ก ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์ฑ…์ž„์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด์—๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ–‰๋™์ด๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๊ธฐ๋ณธ์€ ์ฑ…์ž„๊ณผ ํ˜‘๋ ฅ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ ๋ณ€๊ฒฝ๊ณผ ์œ ์—ฐ์„ฑ

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ€๊ฒฝ์— ๋Œ€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹จ์ˆœํ•˜๊ฒŒ ์„ค๊ณ„
  • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ „์ž๊ฐ€ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์œ ์‚ฌํ•œ ๋ณ€๊ฒฝ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ณต์žก์„ฑ์ด ์ƒ์Šนํ•˜๋”๋ผ๋„ ์œ ์—ฐ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋” ์ข‹๋‹ค.

์œ ์—ฐ์„ฑ์€ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ๋ฌธ์ œ๋‹ค.
์š”์†Œ๋“ค ์‚ฌ์ด์˜ ์˜์กด์„ฑ์˜ ์ •๋„๊ฐ€ ์œ ์—ฐ์„ฑ์˜ ์ •๋„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
์œ ์—ฐ์„ฑ์˜ ์ •๋„์— ๋”ฐ๋ผ ๊ฒฐํ•ฉ๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ–์ถฐ์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋‹ค.

โญ๏ธ ๊ฒฐ๋ก 

์‘์ง‘๋„

  • ํ•œ ๊ฐ์ฒด ๋‚ด์˜ ํ•„๋“œ๋ฅผ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์—์„œ ๋‹ค ์‚ฌ์šฉํ•˜๋‚˜?
    • ์•„๋‹Œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ถ„๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • ๊ฐ์ฒด ๋‚ด ์ดˆ๊ธฐํ™”๋˜๋Š” ์‹œ์ ์ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ„๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋ถ„๋ฆฌ๋ฅผ ์ƒ๊ฐํ•œ๋‹ค. (switch-if, ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ•„๋“œ ๋…ธ์ถœ)

๊ฒฐํ•ฉ๋„ : ์ตœ๋Œ€ํ•œ ์ ์€ ๊ฐ์ฒด๋“ค๊ณผ ํ˜‘๋ ฅํ•˜๋ฉด ์ข‹๋‹ค.
์บก์Аํ™” : ๋‚ด๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์•ˆ๊ณผ ๋ฐ–์—์„œ ์ˆจ๊ฒจ๋ผ. (ํŒŒ๋ผ๋ฏธํ„ฐ, getter, setter)


์ถœ์ฒ˜
์˜ค๋ธŒ์ ํŠธ - ์ฝ”๋“œ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„
https://github.com/eternity-oop/object

0๊ฐœ์˜ ๋Œ“๊ธ€