Skip to content

Stand-Alone11/practice-with-Refactoring2.0

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

50 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

practice-with-Refactoring2.0

practice with Refactoring2.0 written by Martin Fowler

๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•ด์•ผํ•˜๋Š” ์ด์œ  - ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ

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

Chap 1. ์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ

๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ์˜ ์˜ˆ์‹œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ด๋ค„์ ธ์žˆ๋‹ค.
์ฝ”ํ‹€๋ฆฐ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ” ์—ฐ์Šตํ•œ๋‹ค.
์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์„ ๊ธฐ๋กํ•œ๋‹ค.

todo

๋ฆฌํŒฉํ† ๋ง์— ์•ž์„œ ๋ฐ˜๋“œ์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•œ๋‹ค.

  • kotlin์„ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ธ kotest๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ค€๋น„
  • ๊ฒฐ๊ณผ ์ŠคํŠธ๋ง์„ ๋น„๊ตํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•จ

๊ฐ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์˜ ๋ชฉ์ ์„ ์ƒ๊ฐํ•˜๋ฉฐ ์ง„ํ–‰ํ•œ๋‹ค.

thinking & opinion

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

Chap 2. ๋ฆฌํŒฉํ„ฐ๋ง ์›์น™ - .md only

์ •์˜

์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘*์€ ๊ทธ๋ž˜๋„ ์œ ์ง€ํ•œ ์ฑ„, ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋ฒ• ํ˜น์€ ๋ณ€๊ฒฝํ•˜๊ธฐ

๊ฒ‰๋ณด๊ธฐ ๋™์ž‘: ๋ฆฌํŒฉํ„ฐ๋ง ์ „๊ณผ ํ›„์˜ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์€ ๊ฒฐ๊ณผ ํ˜น์€ ๋™์ž‘์„ ํ•ด์•ผํ•จ

๋ฆฌํŒฉํ„ฐ๋ง์€ ์ •์˜์— ๋”ฐ๋ผ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„, ์ž‘์€ ๋ฆฌํŒฉํ„ฐ๋ง ๋‹จ๊ณ„๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ ํฐ ๋ณ€ํ™”๋ฅผ ์ด๋Œ์–ด ๋‚ธ๋‹ค.

  • ๋ฆฌํŒฉํ„ฐ๋ง์€ ๋ฒ„๊ทธ ํ”ฝ์Šค๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฆฌํŒฉํ„ฐ๋ง์€ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.

๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š” ์ด์œ 

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

์–ธ์ œ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š”๊ฐ€?

  1. ๊ทธ๋ƒฅ ์ฝ”๋”ฉํ•œ๋‹ค.
  2. ๋น„์Šทํ•œ ์ผ์„ ๋‘ ๋ฒˆ์งธ๋กœ ํ•˜๊ฒŒ๋˜์–ด๋„ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค.
  3. 3 strike out. ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜์ž!

thinking & opinion

  • ๋ฆฌํŒฉํ„ฐ๋ง์€ ๋”ฐ๋กœ ์‹œ๊ฐ„์„ ๋‚ด์„œ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ข‹์€ ์Šต๊ด€์ฒ˜๋Ÿผ ์ˆ˜์‹œ๋กœ ํ•ด์•ผํ•œ๋‹ค.
  • ์•ž์„œ ์ปค๋ฐ‹์„ ์ž˜๊ฒŒ ๋‚˜๋ˆ  ๋ฉ”์„ธ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ท€์ฐฎ๊ณ  ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ์†Œ์š”๋˜์ง€๋งŒ ๊ฒฐ๊ตญ ์ƒ์‚ฐ์„ฑ์ด ์ข‹์•„์ง„๋‹ค.
  • ์–ธ์ œ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ๊ฐ์ด ์•ˆ์žกํžŒ๋‹ค.

Chap 3. ๋ฆฌํŒฉํ„ฐ๋ง ๋Œ€์ƒ ์„ ์ •ํ•˜๊ธฐ - .md only

์ˆ™๋ จ๋œ ๊ฐœ๋ฐœ์ž์˜ ์ง๊ด€๋งŒํผ ์ •ํ™•ํ•œ ๊ธฐ์ค€์€ ์—†๋‹ค!!

๊ฐ์ž ๊ฒฝํ—˜์„ ํ†ตํ•ด ๊ฐ์„ ํ‚ค์›Œ์•ผ ํ•œ๋‹ค.

์ด์ƒํ•œ ์ด๋ฆ„

์ฝ”๋“œ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ์ด๋ฆ„์ด๋‹ค.
์ด๋ฆ„๋งŒ ๋ณด๊ณ ๋„ ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋“ฑ์ด ํ•˜๋Š” ์ผ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋งˆ๋•…ํ•œ ์ด๋ฆ„์ด ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„ค๊ณ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์ค‘๋ณต ์ฝ”๋“œ

๊ฐ™์€ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ํ†ตํ•ฉํ•˜์—ฌ ๋” ๋‚˜์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (chap2์˜ 3strike out)
๋‹ค๋งŒ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์— ์„œ๋กœ ์ฐจ์ด์ ์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ผผ๊ผผํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ณ  ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ธด ํ•จ์ˆ˜

ํ•จ์ˆ˜๊ฐ€ ๊ธธ์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ํ•จ์ˆ˜๋ฅผ ์งง๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ด, ๊ณต์œ , ์„ ํƒํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.
์งง์€ ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ์—๋Š” ๋ถ€๋‹ด์ด ๋˜์ง€๋งŒ, ๋ช…ํ™•ํ•œ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋„ค์ด๋ฐ์„ ํ†ตํ•ด ์ด๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก

๊ณผ๊ฑฐ์—๋Š” ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ธฐ์œ„ํ•ด ์ „๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค(?)
๊ทธ๋Ÿฌ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์ „์—ญ ๋ฐ์ดํ„ฐ

์ „์—ญ ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ, ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ , ๊ฐ’์ด ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Š” ๋ฒ„๊ทธ์˜ ์›์ธ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์ ์„ ๋†“์น˜๋ฉด ๋ฐœ์ƒํ•œ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฐ์ดํ„ฐ๋Š” ๋ถˆ๋ณ€์ด๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐœ๋…์„ ๊ฐ–๋Š”๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋’ค์—‰ํ‚จ ๋ณ€๊ฒฝ

์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ถ€๋“œ๋Ÿฌ์›Œ์•ผ ํ•œ๋‹ค. ์ฆ‰ ์ˆ˜์ •์— ์šฉ์ดํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋Š” ๋”ฑ ํ•œ ๊ตฐ๋ฐ๋ฅผ ์ฐพ์•„ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์ถ”๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์ด ์ œ๋Œ€๋กœ ์ง€์ผœ์ง€์ง€ ์•Š์„ ๋•Œ ๋’ค์—‰ํ‚จ ๋ณ€๊ฒฝ์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ด ์–ด๋–ค ์ด์œ ๋“ค๋กœ ์ธํ•ด ๊ณ„์† ๋ณ€๊ฒฝ๋˜๋Š” ์ผ์ด ๋งŽ์•„์งˆ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

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

์‚ฐํƒ„์ด ์ˆ˜์ˆ 

์‚ฐํƒ„์ด ์ˆ˜์ˆ ์€ ๋’ค์—‰ํ‚จ ๋ณ€๊ฒฝ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์ž์ž˜ํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋งŽ์„ ๋•Œ์ด๋‹ค. ๋ณ€๊ฒฝํ•  ๋ถ€๋ถ„์ด ์ฝ”๋“œ ์ „๋ฐ˜์— ์žˆ๋‹ค๋ฉด ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ๋†“์น  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ธฐ๋Šฅ ํŽธ์• 

ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋“ˆํ™”๋Š” ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋’ค, ๊ฐ ์˜์—ญ ๋‚ด์—์„œ ์ƒํ˜ธ์ž‘์šฉ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ณ  ๋‹ค๋ฅธ ์˜์—ญ ์‚ฌ์ด์—์„œ์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ฐœ๋…์ด ์–ด๊ธ‹๋‚  ๋•Œ, ๊ธฐ๋Šฅ ํŽธ์• ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

  • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ, ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ
    • ์™ธ๋ถ€ ๊ฐ์ฒด์˜ ์—ฌ๋Ÿฌ ๊ฒŒํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ๊ทผ์ฒ˜๋กœ ์˜ฎ๊ธด๋‹ค.
    • ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋ถ„์—์„œ ์ด๋Ÿฐ ์„ฑํ–ฅ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์ผ๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ์˜ฎ๊ธด๋‹ค.

๋ฐ์ดํ„ฐ ๋ญ‰์น˜

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

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๊ธฐ๋ณธํ˜• ์ง‘์ฐฉ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธํ˜• ์‚ฌ์šฉ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ๋‹ค. ์ž์‹ ์˜ ๋ฌธ์ œ์— ๋งž๋Š” ๊ฐ์ฒด(ํ™”ํ, ์ขŒํ‘œ, ๊ตฌ๊ฐ„ ๋“ฑ)๋กœ ๋ฐ”๊พธ์ž. ํŠนํžˆ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ์—์„œ ๋งŽ์ด ์ผ์–ด๋‚œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋ฐ˜๋ณต๋˜๋Š” switch ๋ฌธ

์ค‘๋ณต๋œ switch ๋ฌธ์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ๋Š” ์กฐ๊ฑด์ ˆ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค, ๋‚˜๋จธ์ง€ switch ๋ฌธ๋„ ์ˆ˜์ •์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘๋ณต๋œ switch, if-else ๋ฌธ์— ์ง‘์ค‘ํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋ฐ˜๋ณต๋ฌธ

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

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์„ฑ์˜ ์—†๋Š” ์š”์†Œ

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

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์ถ”์ธก์„ฑ ์ผ๋ฐ˜ํ™”

YAGNI์— ์–ด๊ธ‹๋‚˜๋Š” ์ง€๊ธˆ ๋‹น์žฅ ํ•„์š”์—†๋Š” ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ ์‚ญ์ œํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์ž„์‹œ ํ•„๋“œ

๊ฐ€๋” ํŠน์ • ์ƒํ™ฉ์—์„œ ๊ฐ’์ด ํ• ๋‹น๋˜๋Š” ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ๋•, ๋‹น์—ฐํžˆ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ์„ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„์‹œ ํ•„๋“œ๋ฅผ ๊ฐ–๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋ฉ”์„ธ์ง€ ์ฒด์ธ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ณผ์ •์„ ์—ฐ์‡„์ ์œผ๋กœ ์ง„ํ–‰ํ•  ๋•Œ, ๊ธด ๋ฉ”์„ธ์ง€ ์ฒด์ธ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ์ฒด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ์— ์ข…์†*๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

[์˜ˆ์‹œ]

val managerName = aPerson.department.manager.name //์–ด๋–ค ์‚ฌ๋žŒ์ด ์†ํ•ด์žˆ๋Š” ๋ถ€์„œ์˜ ๋งค๋‹ˆ์ € ์ด๋ฆ„์„ ๋ฐ˜ํ™˜

๋งค๋‹ˆ์ € ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒํ„ฐ ํ•จ์ˆ˜๋Š” ์‚ฌ๋žŒ, ๋ถ€์„œ, ๋งค๋‹ˆ์ € ๋“ฑ ์–ด๋Š ๊ณณ์—์„œ๋“  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰ ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— ์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

val managerName = aPerson.department.managerName //manager ์ˆจ๊น€
val managerName = aPerson.manager.name // department ์ˆจ๊น€
val managerName = aPerson.managerName //manager, department ์ˆจ๊น€

๊ฒฐ๊ตญ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์€ ๋งค๋‹ˆ์ € ์ด๋ฆ„์ด๋ฏ€๋กœ aPerson์„ ์ „๋‹ฌ๋ฐ›์•„ ๋งค๋‹ˆ์ € ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ์— ์ข…์†

์œ„ ์˜ˆ์‹œ์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ค ์‚ฌ๋žŒ์ด ์†ํ•œ ๋ถ€์„œ์˜ ๋งค๋‹ˆ์ € ์ด๋ฆ„์„ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ, ๊ธด ๋ฉ”์‹œ์ง€ ์ฒด์ธ์„ ํ†ตํ•ด ์ ‘๊ทผํ•œ๋‹ค. ์ด๋•Œ aPerson, department, manager ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€๋‹ค๋ฉด managerName์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์ˆ˜์ •๋ผ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ์ฒด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ์— ์ข…์†๋˜์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

  • ์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ
    • ๋ฉ”์‹œ์ง€ ์ฒด์ธ์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ค‘๊ฐ„ ๊ฐ์ฒด ๋ชจ๋‘ ์ค‘๊ฐœ์ž*๊ฐ€ ๋˜๊ธฐ ์‰ฝ๋‹ค.
  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ, ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ
    • ์ตœ์ข… ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋นผ๋‚ธ ํ›„, ๋ฉ”์„ธ์ง€ ์ฒด์ธ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์ค‘๊ฐœ์ž

์บก์Šํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์œ„์ž„์ด ์ž์ฃผ ํ™œ์šฉ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์ž„์ด ์ง€๋‚˜์น˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ์–ด๋–ค ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„์ž„ํ•œ๋‹ค๋ฉด, ๊ทธ ํด๋ž˜์Šค๋Š” ๊ป๋ฐ๊ธฐ์ผ ๋ฟ์ด๋‹ค. ์‚ฌ์žฅ ํด๋ž˜์Šค์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ผ์„ ๋น„์„œ ํด๋ž˜์Šค๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด ์‚ฌ์žฅ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ ๋น„์„œ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋‚ด๋ถ€์ž ๊ฑฐ๋ž˜

๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ์‘์ง‘๋„๋ฅผ ๋†’ํžˆ๊ณ , ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ์ด ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ์€ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ  ํˆฌ๋ช…ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ์ด ์ง‘์ค‘๋˜๋ฉด ํ•„๋“œ ์ˆ˜๊ฐ€ ์ƒ๋‹นํžˆ ๋Š˜์–ด๋‚œ๋‹ค. ํ•„๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‰ฝ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๋Ÿ‰์ด ๋„ˆ๋ฌด ๋งŽ์€ ํด๋ž˜์Šค๋„ ์ค‘๋ณต ์ฝ”๋“œ์™€ ํ˜ผ๋™์„ ์•ผ๊ธฐํ•  ์—ฌ์ง€๊ฐ€ ๋งŽ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€์•ˆ ํด๋ž˜์Šค๋“ค

์ž์œ ๋กœ์šด ํด๋ž˜์Šค ๊ต์ฒด๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํฐ ์žฅ์ ์ด๋‹ค. ๋‹จ, ๊ต์ฒดํ•  ํด๋ž˜์Šค๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

๋ฐ์ดํ„ฐ ํด๋ž˜์Šค

๋ฐ์ดํ„ฐ ํ•„๋“œ์™€ ๊ฒŒํ„ฐ ์„ธํ„ฐ๋กœ ์ด๋ค„์ง„ ํด๋ž˜์Šค์ด๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ๋„(์ฃผ๋กœ DTO)๋กœ ์‚ฌ์šฉ๋˜๋‹ค ๋ณด๋‹ˆ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ํ•จ๋ถ€๋กœ ๋‹ค๋ฃฌ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์บก์Šํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

  • ๋ ˆ์ฝ”๋“œ ์บก์Šํ™” ํ•˜๊ธฐ
    • public ํ•„๋“œ๋ฅผ ์บก์Šํ™” ํ•œ๋‹ค.
  • ์„ธํ„ฐ ์ œ๊ฑฐํ•˜๊ธฐ
    • ๋ถˆ๋ณ€ ํ•„๋“œ๋Š” ์„ธํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” val์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ, ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ
    • ๊ฒŒํ„ฐ ์„ธํ„ฐ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ๋‹ค. (์‚ฌ๊ฐํ˜•์˜ ๋ฉด์ ์„ ์ง์ ‘ ๊ตฌํ•˜๋Š” ๊ฒƒ -> area๋ฅผ ๋ฐ›๋Š” ๊ฒƒ)
    • ๋ฉ”์„œ๋“œ๋ฅผ ํ†ต์งธ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์–ด๋ ค์šฐ๋ฉด ์ผ๋ถ€๋ถ„๋งŒ ์ถ”์ถœํ•ด์„œ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ƒ์† ํฌ๊ธฐ

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

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

์ฃผ์„

์ฃผ์„์€ ๋ณดํ†ต ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ๋„์›€์„ ์ค€๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ์กฐ๊ฐ€ ์ข‹์ง€ ์•Š์•„ ๋ชจ๋“  ์„ค๋ช…์„ ์ฃผ์„์œผ๋กœ ๋•Œ์šฐ๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๊ตฌ์กฐ๋งŒ ๋ฐ”๊พผ๋‹ค๋ฉด ์ฃผ์„์„ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋ฒ•

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

thinking & opinion

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

chap 6. ๊ธฐ๋ณธ์ ์ธ ๋ฆฌํŒฉํ„ฐ๋ง

6.1

ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ <---> ํ•จ์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

๋ชฉ์ ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ํ•˜๋Š” ์ผ์„ ํŒŒ์•…ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์•Œ๋งž์€ ์ด๋ฆ„์„ ์ •ํ•œ๋‹ค. (์ด๋ฆ„์ง“๊ธฐ๊ฐ€ ์ œ์ผ ์–ด๋ ต๋‹ค..)

์ ˆ์ฐจ

  1. ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๋ชฉ์ ์„ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋ฆ„ ์ง“๊ธฐ (how ๋ณด๋‹ค what์— ์ง‘์ค‘)
  2. ์ถ”์ถœํ•  ์ฝ”๋“œ๋ฅผ ์›๋ณธ ํ•จ์ˆ˜์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ํ•จ์ˆ˜๋กœ ์ด๋™
  3. ์ถ”์ถœํ•œ ์ฝ”๋“œ ์ค‘ ์ง€์—ญ๋ณ€์ˆ˜ ์ฐธ์กฐ, ์œ ํšจ๋ฒ”์œ„๋ฅผ ์ฒดํฌํ•œ๋‹ค. ์žˆ์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ
  4. ๋ณ€์ˆ˜, ์œ ํšจ๋ฒ”์œ„๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ์ปดํŒŒ์ผ
  5. ์›๋ณธํ•จ์ˆ˜์—์„œ ์ถ”์ถœํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ
  6. ํ…Œ์ŠคํŠธ
  7. ์ถ”์ถœํ•œ ํ•จ์ˆ˜์™€ ๊ฐ™๊ฑฐ๋‚˜ ๋น„์Šทํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌ, ์žˆ๋‹ค๋ฉด ์ถ”์ถœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ฐ”๊ฟ€์ง€ ๊ฒ€ํ† 

์˜ˆ์‹œ

์œ ํšจ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๋•Œ

// ์›๋ณธ code
fun printOwing(invoice: Invoice) {
  var outstanding = 0
  
  println("**************")
  println("***๊ณ ๊ฐ ์ฑ„๋ฌด***")
  println("**************")
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  // ๋งˆ๊ฐ์ผ(dueDate)์„ ๊ธฐ๋ก
  val today = Clock.today // ์‹œ์Šคํ…œ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ wrapper๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
  
  // ์„ธ๋ถ€ ์‚ฌํ•ญ ์ถœ๋ ฅ
  println("๊ณ ๊ฐ๋ช…: ${invoice.customer}")
  println("์ฑ„๋ฌด์•ก: ${outstanding}")
  println("๋งˆ๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}
// println ์ถ”์ถœ
fun printOwing(invoice: Invoice) {
  var outstanding = 0
  
  printBanner() // <-- ๋ฐฐ๋„ˆ ์ถœ๋ ฅ ์ถ”์ถœ
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  // ๋งˆ๊ฐ์ผ(dueDate)์„ ๊ธฐ๋ก
  val today = Clock.today
  invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
  
  fun printDetails() { // <-- nested method๋กœ ์ถ”์ถœํ•˜์—ฌ invoice์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  	println("๊ณ ๊ฐ๋ช…: ${invoice.customer}")
  	println("์ฑ„๋ฌด์•ก: ${outstanding}")
	  println("๋งˆ๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")  
  }
  
  printDetails()
}

fun printBanner() {
  println("**************")
  println("***๊ณ ๊ฐ ์ฑ„๋ฌด***")
  println("**************")
}

์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ทธ๋ƒฅ ๋„˜๊ธฐ์ž.

// printDetail() ๋ฐ–์œผ๋กœ ์ถ”์ถœ
fun printOwing(invoice: Invoice) {
  var outstanding = 0
  
  printBanner()
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  // ๋งˆ๊ฐ์ผ(dueDate)์„ ๊ธฐ๋ก
  val today = Clock.today
  invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
    
  printDetails(invoice, outstanding)
}

fun(invoice: Invoice, outstanding: Int) { // <-- ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Œ
  println("๊ณ ๊ฐ๋ช…: ${invoice.customer}")
  println("์ฑ„๋ฌด์•ก: ${outstanding}")
	println("๋งˆ๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}

fun printBanner() {
  println("**************")
  println("***๊ณ ๊ฐ ์ฑ„๋ฌด***")
  println("**************")
}
// invoice date ํ• ๋‹น ๋กœ์ง๋„ ์ถ”์ถœ
fun printOwing(invoice: Invoice) {
  var outstanding = 0
  
  printBanner()
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  recordDueDate(invoice) // <-- ๋งˆ๊ฐ์ผ ์„ค์ • ํ•จ์ˆ˜ ์ถ”์ถœ, invoice ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ
  printDetails(invoice, outstanding)
}

fun recordDueDate(invoice: Invoice) {
  val today = Clock.today
  invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30)
}

fun(invoice: Invoice, outstanding: Int) { // <-- ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Œ
  println("๊ณ ๊ฐ๋ช…: ${invoice.customer}")
  println("์ฑ„๋ฌด์•ก: ${outstanding}")
	println("๋งˆ๊ฐ์ผ: ${invoice.dueDate.toLocalDateString()}")
}

fun printBanner() {
  println("**************")
  println("***๊ณ ๊ฐ ์ฑ„๋ฌด***")
  println("**************")
}

์ง€์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ

์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด ๋ณ€์ˆ˜ ์ชผ๊ฐœ๊ธฐ๋กœ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•œ๋‹ค. ์ž„์‹œ ๋ณ€์ˆ˜๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ์ถ”์ถœ ํ•จ์ˆ˜์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๋จ
  • ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์‚ฌ์šฉ๋จ
// 1. ๋ณ€์ˆ˜ ์„ ์–ธ์„ ๋กœ์ง๊ณผ ๊ฐ€๊นŒ์šด ๋ฐ๋กœ ์˜ฎ๊น€
fun printOwing(invoice: Invoice) {
  printBanner()
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  var outstanding = 0 // <-- ๋กœ์ง ๊ทผ์ฒ˜๋กœ ์ด๋™
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  recordDueDate(invoice)
  printDetails(invoice, outstanding)
}
// 2. ์ถ”์ถœ ๋ถ€๋ถ„์„ ์ƒˆ ํ•จ์ˆ˜๋กœ ๋ณต์‚ฌ
fun printOwing(invoice: Invoice) {
  printBanner()
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  var outstanding = 0
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  
  recordDueDate(invoice)
  printDetails(invoice, outstanding)
}

fun calculateOutstanding(invoice: Invoice): Int {
  var outstanding = 0
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  return ourstanding // <-- ์ˆ˜์ •๋œ ๊ฐ’ ๋ฐ˜ํ™˜
}
// 3. outstanding ์„ ์–ธ๊นŒ์ง€ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ํ•„์š” ์—†์Œ
// 4. ์ปดํŒŒ์ผ
// 5. ์ถ”์ถœํ•œ ์ฝ”๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์›๋ž˜ ๋ณ€์ˆ˜์— ์ €์žฅ
// 6. ์ฝ”๋“œ ๋ณ€์ˆ˜๋ช… ๋ฐ”๊พธ๊ธฐ
fun printOwing(invoice: Invoice) {
  printBanner()
  
  // ๋ฏธํ•ด๊ฒฐ ์ฑ„๋ฌด(outstading)์„ ๊ณ„์‚ฐ
  val outstanding = calculateOutstanding() // <-- 5. ๋ฐ˜ํ™˜ ๊ฐ’ ๋ถˆ๋ณ€์œผ๋กœ ์ €์žฅ
  recordDueDate(invoice)
  printDetails(invoice, outstanding)
}

fun calculateOutstanding(invoice: Invoice): Int {
  var result = 0 // <-- 6. ๋ณ€์ˆ˜๋ช… ๋ฐ”๊พธ๊ธฐ
  for(i in invoice.orders) {
    outstanding += i.amout
  }
  return result
}

๋ฐ˜ํ™˜ํ•  ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด?

  • ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋“ค๋กœ ์ชผ๊ฐœ๊ธฐ ์ถ”์ฒœ
  • ๋ ˆ์ฝ”๋“œ๋กœ ๋ฌถ์–ด ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์งˆ์˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ ์ ์šฉ ํ˜น์€ ๋ณ€์ˆ˜ ์ชผ๊ฐœ๊ธฐ ์ ์šฉ
  • ์›๋ž˜ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„ ๋ฐ–์œผ๋กœ ์ถ”์ถœํ•ด๋ณด๋ฉด ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ถ”์ถœํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

6.5

ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

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

์—ฐ๊ฒฐ๋ถ€์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋ฆ„์ด๋‹ค. ์ฝ”๋“œ ๊ทธ ์ž์ฒด๋กœ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๊ณ  ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

์ด๋ฆ„์ง“๊ธฐ Tip: ์ฃผ์„์œผ๋กœ ํ•จ์ˆ˜์˜ ๋ชฉ์ ์„ ์„ค๋ช…ํ•ด๋ณด๋ฉด ์•Œ๋งž์€ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜ํ•œ ์ค‘์š”ํ•˜๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋งฅ(์ƒํ™ฉ)์„ ์„ค์ •ํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ํ™œ์šฉ์˜ ๋ฒ”์œ„๋„ ๋‹ฌ๋ผ์ง„๋‹ค. ์ ์ ˆํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ํƒ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ๊ฒฐํ•ฉ์„ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์ ˆํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ํƒ์—๋Š” ์ •๋‹ต์ด ์—†๊ณ  ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์˜ ๋ณ€ํ™”, ์ฝ”๋“œ ๋กœ์ง์— ๋Œ€ํ•œ ์ดํ•ด์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•ด์•ผํ•œ๋‹ค.

์ ˆ์ฐจ

๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ - ๋‹จ๋ฒˆ์— ์ˆ˜์ •

  1. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ๋ฐ”๊พผ๋‹ค.
  3. ๊ธฐ์กด ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฐพ์•„ ๋ฐ”๊พผ๋‹ค. (IDE ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์ถ”์ฒœ)
  4. ํ…Œ์ŠคํŠธ

์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ - ์ ์ง„์  ์ˆ˜์ •

  1. ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์ ์ ˆํžˆ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ ์ ˆํžˆ๊ฐ€ ๊ฐ€์žฅ ์–ด๋ ต๋‹ค.
  2. ๋ณธ๋ฌธ์„ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค.
  3. ์ถ”์ถœํ•œ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. ํ…Œ์ŠคํŠธ
  5. ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ•œ๋‹ค.
  6. ์ด๋ฆ„์„ ์ž„์‹œ๋กœ ๋ถ™์—ฌ๋‘์—ˆ์œผ๋ฉด ์›๋ž˜ ์ด๋ฆ„์œผ๋กœ ์ˆ˜์ •ํ•œ๋‹ค.
  7. ํ…Œ์ŠคํŠธ

์˜ˆ์‹œ

ํ•จ์ˆ˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ - ๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ

// ์›๋ณธ code
fun circum(radius: Double): Double {
  return 2 * Math.PI * radius
}
fun circumference(radius: Double): Double { // <-- ์ด๋ฆ„ ๋ณ€๊ฒฝ
  return 2 * Math.PI * radius
}

ํ•จ์ˆ˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ

fun circum(radius: Double): Double { // <-- ์›๋ž˜ ํ•จ์ˆ˜๋Š” ๋†”๋‘๊ณ  ๋ฆฌํŒฉํ„ฐ๋งํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  return circumference(radius)
}

fun circumference(radius: Double): Double {
  return 2 * Math.PI * radius
}

ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋Š” ๊ณต๊ฐœ๋œ API๋ฅผ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๊ธฐ์— ์ข‹๋‹ค. ๊ธฐ์กด ํ•จ์ˆ˜์˜ ๊ป๋ฐ๊ธฐ๋Š” ์‚ด๋ ค๋‘๊ณ  ๋‚ด๋ถ€๋งŒ ๋ฐ”๊ฟ” ์ ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ์กด ํ•จ์ˆ˜๋Š” deprecated๋ฅผ ๊ณ ์ง€ํ•˜๊ณ  ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด ์ด์ „ ํ•จ์ˆ˜๋Š” ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค.(๊ฒŒ์œผ๋ฅธ ํด๋ผ์ด์–ธํŠธ๋กœ ์ธํ•ด ์ง€์šฐ์ง€ ๋ชป ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.)

๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ

// ์›๋ณธ code
fun addReservation(customer: Customer) {
  this._reservations.add(customer)
}

์š”๊ตฌ์‚ฌํ•ญ: ์šฐ์„ ์ˆœ์œ„ ํ์— customer๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

// 2. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ์ถ”์ถœ
fun addReservation(customer: Customer) {
  this.zz_addReservation(customer) // <-- ์ž„์‹œ ์ด๋ฆ„
}

fun zz_addReservation(customer: Customer) {
  this._resulvations.add(customer)
}
// 3. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€
fun addReservation(customer: Customer) {
  this.zz_addReservation(customer, false)
}

fun zz_addReservation(customer: Customer, isPriority: Boolean) {
  this._resulvations.add(customer)
}

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์†์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

//์›๋ณธ code ๊ณ ๊ฐ์ด NewEngland ์ฃผ์— ์‚ด๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜
fun inNewEngland(aCustomer: Customer): Boolean {
  return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(aCustomer.address.state)
}
// 1. ๋ณ€์ˆ˜ ์ถ”์ถœ
// 2. ํ•จ์ˆ˜ ์ถ”์ถœ
fun inNewEngland(aCustomer: Customer): Boolean {
 val stateCode = aCustomer.address.state // <-- 1. ๋ณ€์ˆ˜ ์ถ”์ถœ
  return xxNewInNewEngland(stateCode)
}

fun xxNewInNewEngland(stateCode: String): Boolean { // <-- 2. ํ•จ์ˆ˜ ์ถ”์ถœ, ์ž„์‹œ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ
  return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(stateCode)
}
fun inNewEngland(aCustomer: Customer): Boolean {
  return xxNewInNewEngland(aCustomer.address.state) // <-- ์ถ”์ถœํ•œ ์ž„์‹œ ๋ณ€์ˆ˜ ์ธ๋ผ์ธ
}
// ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ
val newEnglanders = somCustomers.filter{ c -> xxNewInNewEngland(c.address.state)} // <-- ํ•จ์ˆ˜ ์ธ๋ผ์ธ

val newEnglanders = somCustomers.filter{ c -> inNewEngland(c.address.state)} // <-- ํ•จ์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ

fun inNewEngland(stateCode: String): Boolean { // <-- ํ•จ์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ
  return listOf("MA", "CT", "ME", "VT", "NH", "RI").contains(stateCode)
}

6.7

๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

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

์ ˆ์ฐจ

  1. ํญ๋„“๊ฒŒ ์“ฐ์ด๋Š” ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.
  2. ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์„ ๋ชจ๋‘ ์ฐพ์•„ ํ•˜๋‚˜์”ฉ ๋ณ€๊ฒฝํ•œ๋‹ค.
    • ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ฒ ์ด์Šค์—์„œ๋„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๋ฉด ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.
  3. ํ…Œ์ŠคํŠธ

์˜ˆ์‹œ

ํ•จ์ˆ˜ ๋ฐ–์—์„œ๋„ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ์˜ˆ์‹œ (์ด ์™ธ์—๋Š” ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๋‹ค.)

// ์›๋ณธ code
var tpHd = "untitled"

// ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ธฐ๋งŒํ•˜๋Š” ์ฝ”๋“œ
var result += "<h1>${tpHd}</h1>"

// ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ
tpHd = "anotherString"
// 1. ๋ณ€์ˆ˜ ์บก์Šํ™” ํ•˜๊ธฐ
fun title(): String = tpHd
fun setTitle(arg: String) {
  tpHd = arg
}

setTitle("anotherString")
result += "<h1>${title()}</h1>"

// ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •

var _title = "untitled" // <-- ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •

fun title(): String = _title // <-- ์ˆ˜์ •๋œ ๋ณ€์ˆ˜๋ช… ์ ์šฉ
fun setTitle(arg: String) {
  _title = arg // <-- ์ˆ˜์ •๋œ ๋ณ€์ˆ˜๋ช… ์ ์šฉ
}

chap 7. ์บก์Šํ™”

7.4

์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์งˆ์˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฒฐ๊ด๊ฐ’์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ์‰ฌ์›Œ์ง€๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž„์‹œ ๋ณ€์ˆ˜๋ณด๋‹ค๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

์ ˆ์ฐจ

  1. ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ๊ฐ’์ด ํ™•์‹คํžˆ ๊ฒฐ์ •๋˜๋Š”์ง€, ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค.
  3. ํ…Œ์ŠคํŠธ
  4. ๋ณ€์ˆ˜ ๋Œ€์ž…๋ฌธ์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค.
    • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉด ์ผ๋‹จ ์ž„์‹œ ์ด๋ฆ„์„ ์ง“๋Š”๋‹ค.
    • ์ถ”์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ์งˆ์˜ ํ•จ์ˆ˜์™€ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ๋Œ€์ฒ˜ํ•œ๋‹ค.
  5. ํ…Œ์ŠคํŠธ
  6. ๋ณ€์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ๋กœ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์˜ˆ์‹œ

class Order(quantity: Int, item: Item) {
  fun getPrice(): Double {
    var basePrice = quantity * item.price // ์ž„์‹œ ๋ณ€์ˆ˜
    var discountFactor = 0.98D // ์ž„์‹œ ๋ณ€์ˆ˜
    
    if(basePrice > 1000) discountFactor -= 0.03
    return basePrice * discountFactor
  }
}
class Order(quantity: Int, item: Item) {
  fun getPrice(): Double {
    val basePrice = quantity * item.price // ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋ฐ”๊พผ ๋’ค ํ…Œ์ŠคํŠธ, ๋งŒ์•ฝ ์ด ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ
    var discountFactor = 0.98D
    
    if(basePrice > 1000) discountFactor -= 0.03
    return basePrice * discountFactor
  }
}
class Order(quantity: Int, item: Item) {
  fun getPrice(): Double {
    val basePrice = getBasePrice() // <-- ์ถ”์ถœํ•œ ํ•จ์ˆ˜ ๋Œ€์ž…
    var discountFactor = 0.98D
    
    if(basePrice > 1000) discountFactor -= 0.03
    return basePrice * discountFactor
  }
  
  fun getBasePrice(): Int { // ํ•จ์ˆ˜๋กœ ์ถ”์ถœ
    return quantity * item.price
  }
}
class Order(quantity: Int, item: Item) {
  fun getPrice(): Double {
    //val basePrice = getBasePrice()     basePrice๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์— getBasePrice()๋กœ ๋Œ€์ฒด
    
    //if(getBasePrice() > 1000) discountFactor -= 0.03
    return getBasePrice() * getDiscountFactor() // discountFactor๋ฅผ ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด
  }
  
  fun getBasePrice(): Int {
    return quantity * item.price
  }
  
  fun getDiscountFactor() { // ํ•จ์ˆ˜๋กœ ์ถ”์ถœ
    var discountFactor = 0.98D
    if(getBasePrice() > 1000) discountFactor -= 0.03
    return getBasePrice() * discountFactor
  }
}

chap 8. ๊ธฐ๋Šฅ ์ด๋™

8.6

๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ์„œ๋กœ ๊ฐ€๊นŒ์ด์— ๋‘๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ˆ˜์›”ํ•˜๋‹ค. ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œ๋ฅผ ํ†ตํ•ด ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ๋ชจ์•„๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ๋Š” ๋ณดํ†ต ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ์— ์•ž์„œ ์„ ํ–‰๋œ๋‹ค

์ ˆ์ฐจ

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

์˜ˆ์‹œ

์ฝ”๋“œ๋ฅผ ์Šฌ๋ผ์ด๋“œ ์‹œํ‚ค๋ ค๋ฉด ๋ฌด์—‡์„ ์Šฌ๋ผ์ด๋“œํ• ์ง€, ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์ฒดํฌํ•œ๋‹ค. ์Šฌ๋ผ์ด๋“œํ•  ์ฝ”๋“œ ์ž์ฒด์™€ ๊ทธ ์ฝ”๋“œ๊ฐ€ ๊ฑด๋„ˆ ๋›ฐ์–ด์•ผํ•  ์ฝ”๋“œ ๋ชจ๋‘ ์‚ดํŽด์•ผํ•œ๋‹ค. ์ฝ”๋“œ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.

val pricingPlan = retrievePricingPlan()
val order = retreiveOrder() // <-- order๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” val units = .. ์œ„๋กœ ์ด๋™
val baseCharge = pricingPlan.base
var charge = 0 
val chargePerUnit = pricingPlan.unit
val units = order.units
var discount = 0 // <-- discount๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” discount = .. ์œ„๋กœ ์ด๋™
charge = baseCharge + units * chargePerUnit
var discountableUnits = Math.max(units - pricingPlan.discountThreshold, 0)
discount = discountable * pricingPlan.discountFactor
if(order.isRepeat) discount += 20
charge = charge - discount
chargeOrder(charge)

order์— ํ• ๋‹นํ•˜๋Š” retreiveOrder() ์ฝ”๋“œ ๋‚ด๋ถ€๋„ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์งˆ์˜ ํ•จ์ˆ˜๋ฅผ ์ž˜ ๋งŒ๋“ค์–ด ๋†จ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ์ฝ”๋“œ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

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

์˜ˆ์‹œ: ์กฐ๊ฑด๋ฌธ์ด ์žˆ์„ ๋•Œ ์Šฌ๋ผ์ด๋“œ

์กฐ๊ฑด๋ฌธ ๋ฐ–์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•˜๋ฉด ์ค‘๋ณต ๋กœ์ง์ด ์ œ๊ฑฐ๋  ๊ฒƒ์ด๊ณ  ์กฐ๊ฑด๋ฌธ ์•ˆ์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•˜๋ฉด ๋กœ์ง์ด ์ค‘๋ณต๋  ๊ฒƒ์ด๋‹ค.

var result = null
if(availableResources.length == 0) {
  result = createResource()
  allocatedResouces.push(result!!) // ์ค‘๋ณต๋กœ์ง
} else {
  result = availableResources.pop()
  allocatedResources.push(result!!) // ์ค‘๋ณต๋กœ์ง
}
return result
var result = null
if(availableResources.length == 0) {
  result = createResource()
} else {
  result = availableResources.pop()
}
allocatedResources.push(result!!) // ์กฐ๊ฑด๋ฌธ ๋ฐ–์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•˜์—ฌ ์ค‘๋ณต๋กœ์ง์ด ํ•ฉ์ณ์ง
return result

chap 9. ๋ฐ์ดํ„ฐ ์กฐ์งํ™”

9.2

ํ•„๋“œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

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

์ ˆ์ฐจ

  1. ๋ ˆ์ฝ”๋“œ์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ์ ์ด๋ผ๋ฉด ํ•„๋“œ์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • ํ›„ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๋‹ค์Œ ์ ˆ์ฐจ๋Š” ํ•„์š” ์—†๋‹ค.
  2. ๋ ˆ์ฝ”๋“œ๊ฐ€ ์บก์Šํ™” ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์บก์Šํ™”ํ•œ๋‹ค.
  3. ์บก์Šํ™”๋œ ๊ฐ์ฒด ๋‚ด๋ถ€์˜ private ํ•„๋“œ๋ช…์„ ๋ฐ”๊พธ๊ณ  ๊ทธ์— ๋งž๊ฒŒ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝํ•œ๋‹ค.
  4. ํ…Œ์ŠคํŠธ
  5. ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•„๋“œ๊ฐ€ ๊ฒน์น˜๋ฉด ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  6. ์ ‘๊ทผ์ž๋“ค์˜ ์ด๋ฆ„๋„ ๋ณ€๊ฒฝํ•œ๋‹ค.

์˜ˆ์‹œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ต๋ช… ๊ฐ์ฒด๋ฅผ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. dynamic์ด ์žˆ์ง€๋งŒ jvm์„ ์œ„ํ•œ ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ data class๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

//์›๋ณธ ์ฝ”๋“œ js
const organization = {name: "์• ํฌ๋ฏธ ๊ตฌ์Šค๋ฒ ๋ฆฌ", country: "GB"};

data class Organization(val data: Person) {
  var _name: String = data.name
  // ์ž๋ฐ”๋กœ ๋ฐ”๋€Œ๋ฉด
   @NotNull
   private final String _name;
   @NotNull
   private final String _country;

   @NotNull
   public final String get_name() {
      return this._name;
   }

   @NotNull
   public final String get_country() {
      return this._country;
   }
// ์ž๋ฐ” ๋
  var _country: String = data.country
}
//ํ•„๋“œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ
data class Organization(val data: Person) {
  private var _title: String = data.name // <-- ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ
  private var _country: String = data.country
}

kotlin์€ ํƒ€์ž… ์–ธ์–ด์ด๋ฏ€๋กœ ํ•„๋“œ ์ด๋ฆ„์€ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด๋ฏธ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ js ๋ณด๋‹ค ํ›จ์”ฌ ํœด๋จผ์—๋Ÿฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

chap 12. ์ƒ์† ๋‹ค๋ฃจ๊ธฐ

12.1

๋ฉ”์„œ๋“œ ์˜ฌ๋ฆฌ๊ธฐ <---> ๋ฉ”์„œ๋“œ ๋‚ด๋ฆฌ๊ธฐ

๋ฐฐ๊ฒฝ

์ค‘๋ณต์ฝ”๋“œ๋Š” ํ•œ์ชฝ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํ•œ์ชฝ์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.

๋ฉ”์„œ๋“œ ์˜ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ์„ ํ–‰ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํ•˜๋ฉด ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ ํ›„ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์† ๊ณ„์ธต์˜ ์œ„๋กœ ์˜ฌ๋ฆฐ๋‹ค. ๋ฐ˜๋ฉด ๋ฉ”์„œ๋“œ ์˜ฌ๋ฆฌ๊ธฐ๋ฅผ ์ ์šฉํ•˜๊ธฐ ๊ฐ€์žฅ ๋ณต์žกํ•œ ์ƒํ™ฉ์€ ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ์—์„œ ์„œ๋ธŒํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ด๋Ÿด ๋•, ๋จผ์ € ํ•„๋“œ๋ฅผ ์Šˆํผํด๋ž˜์Šค๋กœ ์˜ฌ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ์˜ฌ๋ฆฐ๋‹ค.

์ ˆ์ฐจ

  1. ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ์ง€ ํ™•์ธ, ์ผ์€ ๊ฐ™์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค.
  2. ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์™€ ์ฐธ์กฐํ•˜๋Š” ํ•„๋“œ๋“ค์„ ์Šˆํผํด๋ž˜์Šค์—์„œ๋„ ํ˜ธ์ถœ, ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋กœ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  4. ์Šˆํผํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋Œ€์ƒ ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ์„ ๋„ฃ๋Š”๋‹ค.
  5. ์ •์  ๊ฒ€์‚ฌ ์ˆ˜ํ–‰
  6. ์„œ๋ธŒํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  7. ํ…Œ์ŠคํŠธ
  8. ๋ชจ๋“  ์„œ๋ธŒํด๋ž˜์Šค์— 6, 7๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์˜ˆ์‹œ

class Employee : Party() {
  val monthlyCost = 10
  fun annualCost() : Int = monthlyCost * 12
}

class Department : Party() {
  val monthlyCost = 20
  fun totalAnnualCost() : Int = monthlyCost * 12
}

๋‘ ํด๋ž˜์Šค์—์„œ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•˜๋‹ค. ๋‘ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋กœ ์ด๋ฆ„์„ ํ†ต์ผํ•œ๋‹ค.

์„œ๋ธŒํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์˜ ์ด๋ฆ„์„ ๋ณต์‚ฌํ•ด ์Šˆํผํด๋ž˜์Šค์— ๋„ฃ๋Š”๋‹ค. ์ด๋•Œ ์ฝ”ํ‹€๋ฆฐ์€ ์ •์  ์–ธ์–ด์ด๋ฏ€๋กœ ์Šˆํผ ํด๋ž˜์Šค๋Š” open ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , open function์ด ์•„๋‹ˆ๋ฉด ์ปดํŒŒ์ผ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ๋ฒˆ์— ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค.

open class Party {
  val monthlyCost = 10
  fun annualCost(): Int = monthlyCost * 12 // <-- ์Šˆํผํด๋ž˜์Šค๋กœ open ํ‚ค์›Œ๋“œ ์—†์ด ์˜ฌ๋ฆฌ๋ฉด ์„œ๋ธŒํด๋ž˜์Šค์—์„  override ๋ถˆ๊ฐ€
}
class Employee : Party() {
  val monthlyCost = 10
  fun annualCost() : Int = monthlyCost * 12 // ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ๋ฐœ์ƒ
}

class Department : Party() {
  override val monthlyCost = 20
  fun annualCost() : Int = monthlyCost * 12 // <-- ํ•จ์ˆ˜ ์ด๋ฆ„ ๋งž์ถ”๊ธฐ
}

About

practice with Refactoring2.0 written by Martin Fowler

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages