Skip to content

Latest commit

ย 

History

History
3439 lines (2623 loc) ยท 107 KB

README.md

File metadata and controls

3439 lines (2623 loc) ยท 107 KB

์ฑ… ์†Œ๊ฐœ

๋ฆฌํŒฉํ„ฐ๋ง, ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ

๋ฆฌํŒฉํ„ฐ๋ง

๋ชฉ์ฐจ

1. ๋ฆฌํŒฉํ„ฐ๋ง ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ

p.26 ์˜ˆ์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ณธ ์ˆ˜๊ฐ

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

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

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

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

2.1 ๋ฆฌํŒฉํ„ฐ๋ง์ •์˜

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

2.2 ๋‘ ๊ฐœ์˜ ๋ชจ์ž

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

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

  1. ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„๊ฐ€ ์ข‹์•„์ง„๋‹ค

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

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

    • ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๋ง์€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ ์‰ฝ๋‹ค๋Š” ๋ง์ด๊ธฐ๋„ ํ•˜๋‹ค
    • ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ๊นŠ์ด ํŒŒ์•…ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ƒˆ๋กœ ๊นจ๋‹ฌ์€ ๊ฒƒ์„ ๊ณง๋ฐ”๋กœ ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•˜๊ฒŒ ๋œ๋‹ค
  4. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค

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

2.4 ์–ธ์ œ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ ํ•˜๋‚˜?

  1. ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๋‹จ๊ณ„

    • ์ข‹์€ ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑ
    • ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง)
    • 3์˜ ๋ฒ•์น™: ๋น„์Šทํ•œ ์ผ์„ ์„ธ ๋ฒˆ์จฐ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค
    • ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ > ์ข‹์€ ๋ฌธ์„œํ™”
    • ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ > ์žฌ์‚ฌ์šฉ์„ฑ, ๋ชจ๋“ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
  2. ํ”„๋กœ์ ํŠธ ์œ ์ง€๋ณด์ˆ˜ ๋‹จ๊ณ„

    • ๋ฒ„๊ทธ๋ฆ„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
    • ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ, ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ (๋ฆฌํŒฉํ† ๋ง)
  3. ์˜ค๋ž˜๋œ(๋ ˆ๊ฑฐ์‹œ) ํ”„๋กœ์ ํŠธ

    • (๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ๊ธฐ๋Šฅ์ถ”๊ฐ€์‹œ์—๋งŒ) ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋ชจ๋“ˆ/์ฝ”๋“œ ํ•œ์ •์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
    • ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์ฝ”๋“œ ์ˆ˜์ • ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
    • ๋•Œ๋กœ๋Š” ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ „๋žต์„ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•œ๋‹ค

2.5 ๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ณ ๋ คํ•  ๋ฌธ์ œ

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

2.6 ๋ฆฌํŒฉํ„ฐ๋ง, ์•„ํ‚คํ…์ฒ˜, ์• ๊ทธ๋‹ˆ

  • ์• ๊ทธ๋‹ˆ: You Ainโ€™t Gonna Need It
  • ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์— ์ง‘์ฐฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์šฐ์„ ์ ์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค
  • ์ง€๋‚˜์น˜๊ฒŒ ๋ฏธ๋ž˜์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค

2.7 ๋ฆฌํŒฉํ„ฐ๋ง๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค

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

2.8 ๋ฆฌํŒฉํ„ฐ๋ง๊ณผ ์„ฑ๋Šฅ

  • โ€˜์ง๊ด€์ ์ธ ์„ค๊ณ„ vs ์„ฑ๋Šฅโ€™์€ ์ค‘์š”ํ•œ ์ฃผ์ œ๋‹ค

  • ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฑด ์‚ฌ์‹ค์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ์™€ ๋™์‹œ์— ์„ฑ๋Šฅ์„ ํŠœ๋‹ํ•˜๊ธฐ๋Š” ๋” ์‰ฌ์›Œ์ง„๋‹ค

  • ๋จผ์ € ํŠœ๋‹ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์›ํ•˜๋Š” ์†๋„๊ฐ€ ๋‚˜๊ฒŒ๋” ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

  • ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋‹จ๊ณ„๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ์˜ ๊ตฌ์ฒด์ ์ธ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์„ ํŠœ๋‹ํ•œ๋‹ค

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

3. ์ฝ”๋“œ์—์„œ ๋‚˜๋Š” ์•…์ทจ

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

3.1 ๊ธฐ์ดํ•œ ์ด๋ฆ„

  • ์ฝ”๋“œ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ โ€˜์ด๋ฆ„โ€™์ด๋‹ค

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

  • ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” ๋‹จ์ˆœํžˆ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ์—ฐ์Šต์ด ์•„๋‹ˆ๋‹ค. ๋งˆ๋•…ํ•œ ์ด๋ฆ„์ด ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„ค๊ณ„์— ๋” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์ˆจ์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค

  • ๊ทธ๋ž˜์„œ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ด๋ฆ„์„ ์ž˜ ์ •๋ฆฌํ•˜๋‹ค ๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์งˆ ๋•Œ๊ฐ€ ๋งŽ๋‹ค

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

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

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

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

  • ๋˜‘๊ฐ™์€ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜์—ฌ ๋” ๋‚˜์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

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

  • ๋ฉ”์„œ๋“œ ์˜ฌ๋ฆฌ๊ธฐ

3.3 ๊ธด ํ•จ์ˆ˜

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

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

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

  • ์ ๊ทน์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ชผ๊ฐœ์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์žฅ ๋ฐฉ์‹์ด ์•„๋‹Œ **โ€˜์˜๋„โ€™**๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ์ง“๋Š”๋‹ค

  • ์›๋ž˜ ์ฝ”๋“œ๋ณด๋‹ค ๊ธธ์–ด์ง€๋”๋ผ๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘๋Š”๋‹ค. โ€˜๋ฌด์—‡์„ ํ•˜๋Š”์ง€โ€™๋ฅผ ์ฝ”๋“œ๊ฐ€ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ์ง€ ๋ชปํ•  ์ˆ˜๋ก ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ๊ฒŒ ์œ ๋ฆฌํ•˜๋‹ค

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

  • ๊ฐ์ฒด ํ†ต์งธ๋กœ ๋„˜๊ธฐ๊ธฐ

  • ํ•จ์ˆ˜๋ฅผ ๋ช…๋ น์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

  • ์กฐ๊ฑด๋ฌธ ๋ถ„ํ•ดํ•˜๊ธฐ

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

  • ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

  • ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์ด ๊ธธ์–ด์ง€๋ฉด ๊ทธ ์ž์ฒด๋กœ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ๋งŽ๋‹ค

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

  • ๊ฐ์ฒด ํ†ต์งธ๋กœ ๋„˜๊ธฐ๊ธฐ

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

  • ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜ ์ œ๊ฑฐํ•˜๊ธฐ

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ

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

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

  • ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ

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

  • ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๊ธฐ

  • ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ

  • ๋ณ€์ˆ˜ ์ชผ๊ฐœ๊ธฐ

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

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

  • ์งˆ์˜ ํ•จ์ˆ˜์™€ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ๋ถ„๋ฆฌํ•˜๊ธฐ

  • ์„ธํ„ฐ ์ œ๊ฑฐํ•˜๊ธฐ

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

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋ฌถ๊ธฐ

  • ์ฐธ์กฐ๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

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

  • ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋Š” ์‹œ์Šคํ…œ์—์„œ ๊ณ ์ณ์•ผ ํ•  ๋”ฑ ํ•œ ๊ตฐ๋ฐ๋ฅผ ์ฐพ์•„์„œ ๊ทธ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค

  • ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋’ค์—‰ํ‚จ ๋ณ€๊ฒฝ๊ณผ ์‚ฐํƒ„์ด ์ˆ˜์ˆ  ์ค‘ํ•˜๋‚˜๊ฐ€ ํ’๊ธด๋‹ค

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

  • ์ง€์›ํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ์„ธ ๊ฐœ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๋ฉด ใ…๋’ค์—‰ํ‚จ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค

  • ๋‹จ๊ณ„ ์ชผ๊ฐœ๊ธฐ

  • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

  • ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ

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

  • ์ด ๋ƒ„์ƒˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์ž์ž˜ํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ๋งŽ์„ ๋•Œ ํ’๊ธด๋‹ค

  • ๋ณ€๊ฒฝํ•  ๋ถ€๋ถ„์ด ์ฝ”๋“œ ์ „๋ฐ˜์— ํผ์ ธ์žˆ๋‹ค๋ฉด ์ฐพ๊ธฐ๋„ ์–ด๋ ต๊ณ  ๊ผญ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ณณ์„ ์ง€๋‚˜์น˜๊ธฐ ์‰ฝ๋‹ค

  • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ

  • ํ•„๋“œ ์˜ฎ๊ธฐ๊ธฐ

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋ฌถ๊ธฐ

  • ๋‹จ๊ณ„ ์ชผ๊ฐœ๊ธฐ

  • ํ•จ์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

  • ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ

3.9 ๊ธฐ๋Šฅ ํŽธ์• 

  • ํ”„๋กœ๊ทธ๋žจ์„ ๋ชจ๋“ˆํ™”ํ•  ๋•Œ๋Š” ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ์˜์—ญ**(์Šค์ฝ”ํ”„)์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค ์˜์—ญ(์Šค์ฝ”ํ”„)** ์•ˆ์—์„œ ์ด๋ค„์ง€๋Š” ์ƒํ˜ธ์ž‘์šฉ์€ ์ตœ๋Œ€ํ•œ ๋Š˜๋ฆฌ๊ณ  ์˜์—ญ **(์Šค์ฝ”ํ”„)**์‚ฌ์ด์—์„œ ์ด๋ค„์ง€๋Š” ์ƒํ˜ธ์ž‘์šฉ์€ ์ตœ์†Œ๋กœ ์ค„์ด๋Š” ๋ฐ ์ฃผ๋ ฅํ•œ๋‹ค

  • ๊ธฐ๋Šฅ ํŽธ์• ๋Š” ํ”ํžˆ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์ž๊ธฐ๊ฐ€ ์†ํ•œ ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ผ์ด ๋”๋งŽ์„ ๋•Œ ํ’๊ธฐ๋Š” ๋ƒ„์ƒˆ๋‹ค

  • ์‹คํ–‰ ๊ณผ์ •์—์„œ ์™ธ๋ถ€ ๊ฐ์ฒด์˜ ๊ฒŒํ„ฐ ๋ฉ”์„œ๋“œ ๋Œ€์—ฌ์„ฏ ๊ฐœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Šฅ ํŽธ์•  ํ•จ์ˆ˜์— ํ•ด๋‹นํ•œ๋‹ค

  • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ

  • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

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

  • ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ๋“ค์€ ์–ด๋ฆฐ์•„์ด ๊ฐ™์€ ๋ฉด์ด ์žˆ๋‹ค. ์–ด์šธ๋ ค ๋…ธ๋Š” ๊ฑธ ์ข‹์•„ํ•œ๋‹ค

  • ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์„œ๋„ˆ ๊ฐœ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ•ญ์ƒ ํ•จ๊ป˜ ๋ญ‰์ณ๋‹ค๋‹ˆ๋Š” ๋ชจ์Šต์„ ๋ชฉ๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๊ฐ์ฒด๋ฅผ ํ†ต์งธ๋กœ ๋„˜๊ฒจ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค

  • ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

  • ๊ฐ์ฒด ํ†ต์งธ๋กœ ๋„˜๊ธฐ๊ธฐ

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

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

  • ์ „ํ™” ๋ฒˆํ˜ธ๋ฅผ ๋‹จ์ˆœํžˆ ๋ฌธ์ž ์ง‘ํ•ฉ์œผ๋กœ๋งŒ ํ‘œํ˜„ํ•˜๊ธฐ์—๋Š” ์•„์‰ฌ์›€์ด ๋งŽ๋‹ค. ์ตœ์†Œํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ์ผ๊ด€๋œ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋„ ๊ฐ–์ถฐ์•ผ ํ•œ๋‹ค

  • ๊ธฐ๋ณธํ˜•์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๊ธฐ

  • ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ

  • ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

  • ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

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

  • ์ด ์ฑ…์œผ ์ดˆํŒ์—๋Š” โ€œswitch๋ฌธโ€์ด๋ž€ ๋ƒ„์ƒˆ๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ์‚ฌ๋žŒ๋“ค์ด ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•˜๋„๋ก ์ „ํ™˜์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

  • ๋‹จ์ˆœํžˆ switch๋ฌธ์„ ์ผ๋‹ค๊ณ  ํ•ด์„œ ์ž๋™์œผ๋กœ ๊ฒ€ํ†  ๋Œ€์ƒ์€ ๋˜์ง€ ์•Š๋Š” ์„ธ์ƒ์ด ๋˜์—ˆ๋‹ค

  • ๊ทธ๋Ÿฌ๋‹ˆ ์ด์ œ๋Š” ๋˜‘๊ฐ™์€ ์กฐ๊ฑด๋ถ€ ๋กœ์ง(switch/case๋ฌธ์ด๋‚˜ ๊ธธ๊ฒŒ ๋‚˜์—ด๋œ if/else๋ฌธ)์ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐ˜๋ณตํ•ด ๋“ฑ์žฅํ•˜๋Š” ์ฝ”๋“œ์— ์ง‘์ค‘ํ•ด๋ณด์ž

  • ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

3.13 ๋ฐ˜๋ณต๋ฌธ

  • ๋ฐ˜๋ณต๋ฌธ์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

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

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

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

  • ํ•จ์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

  • ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ

  • ๊ณ„์ธต ํ•ฉ์น˜๊ธฐ

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

  • ์ถ”์ธก์„ฑ ์ผ๋ฐ˜ํ™”๋Š” โ€˜๋‚˜์ค‘์— ํ•„์š”ํ•  ๊ฑฐ์•ผโ€™๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ๋‹น์žฅ์€ ํ•„์š” ์—†๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ›„ํ‚น ํฌ์ธํŠธ์™€ ํŠน์ด ์ผ€์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋กœ์ง์œผ๋กœ ์ž‘์„ฑํ•ด๋‘” ์ฝ”๋“œ์—์„œ ํ’๊ธฐ๋Š” ๋ƒ„์ƒˆ์ด๋‹ค

  • ๋ฏธ๋ž ๋ฅผ ๋Œ€๋น„ํ•ด ์ž‘์„ฑํ•œ ๋ถ€๋ถ„์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‹คํ–‰์ด์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋Š”๋‹ค๋ฉด ์“ธ๋ฐ์—†๋Š” ๋‚ญ๋น„์ผ ๋ฟ์ด๋‹ค

  • ๊ณ„์ธต ํ•ฉ์น˜๊ธฐ

  • ํ•จ์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

  • ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ

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

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

3.17 ๋ฉ”์‹œ์ง€ ์ฒด์ธ

3.18 ์ค‘๊ฐœ์ž

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

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

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

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

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

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

3.24 ์ฃผ์„

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

4. ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•ํ•˜๊ธฐ

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

4.1 ์ž๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€์น˜

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

Mocha Test ์‹œ์— import, export ์‚ฌ์šฉํ•˜๊ธฐ

  • https://stackoverflow.com/questions/60227314/how-to-test-es6-modules-these-with-import-with-mocha/69386358#69386358

    ๊ฐœ์š”

    1. babel ๊ด€๋ จ ํŒจํ‚ค์ง€ ์„ค์น˜

    yarn add @babel/cli @babel/core @babel/preset-env @babel/register --dev
    
    • @babel/cli :ย ๋งํฌ
      • ๋ช…๋ น์ค„์—์„œ ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CLI
    • @babel/core :ย ๋งํฌ
      • babel์—์„œ ์‚ฌ์šฉํ•˜๋Š” core lib์ž…๋‹ˆ๋‹ค
    • @babel/preset-env :ย ๋งํฌ
      • ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๊ตฌ๋ฌธ ๋ณ€ํ™˜์„ ์šฐ๋ฆฌ๊ฐ€ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ์ตœ์‹  JS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

    babel ๊ตฌ์„ฑ

    • .babelrc๋ฅผ ํ”„๋กœ์ ํŠธ root ์œ„์น˜์— ์ƒ์„ฑ ํ›„ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”
    {
    	"presets" : ["@babel/preset-env"]
    }
    

    package.json

    • package.json์˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ mocha์— --require ์˜ต์…˜์„ ํ†ตํ•ด ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ ์–ด์ค๋‹ˆ๋‹ค
    {
      "name": "chapter4",
      "version": "1.0.0",
      "description": "",
      "main": "asia.js",
      "scripts": {
        "test": "mocha --require @babel/register",
        "test_recursive": "mocha --recursive --require @babel/register './test/**/*.js'"
      },
      "author": "junhee lee",
      "license": "ISC",
      "devDependencies": {
        "@babel/cli": "^7.18.6",
        "@babel/core": "^7.18.6",
        "@babel/preset-env": "^7.18.6",
        "@babel/register": "^7.18.6",
        "chai": "^4.3.6",
        "mocha": "^10.0.0"
      }
    }
์„ฑ๊ณต success image
์‹คํŒจ success image
์ „์ฒด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

ํด๋” ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ œ๊ฐ€ ๊ตฌ์„ฑํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ฒจ๋ถ€ํ•ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค

  • ๋‚˜์˜ ํด๋” ๊ตฌ์กฐ
success image
const { expect } = require("chai");
const { Province, sampleProvinceData } = require("../sample");

describe("province", function () {
  let asia;
  this.beforeEach(function () {
    asia = new Province(sampleProvinceData());
  });
  it("shortfall", function () {
    // expect(asia.shortfall, 5);
    expect(asia.shortfall).equal(5);
  });

  it("profit", function () {
    expect(asia.profit).equal(230);
  });

  it("change production", function () {
    asia.producers[0].production = 20;
    expect(asia.shortfall).equal(-6);
    expect(asia.profit).equal(292);
  });

  it("zero demand", function () {
    // ์ˆ˜์š”๊ฐ€ ์—†๋‹ค
    asia.demand = 0;
    expect(asia.shortfall).equal(-25);
    expect(asia.profit).equal(0);
  });

  it("negative demand", () => {
    // ์ˆ˜์š”๊ฐ€ ๋งˆ์ด๋„ˆ์Šค
    asia.demand = -1;
    expect(asia.shortfall).equal(-26);
    expect(asia.profit).equal(-10);
  });

  it("empty string demand", () => {
    // ์ˆ˜์š” ์ž…๋ ฅ๋ž€์ด ๋น„์–ด์žˆ์„ ๋•Œ - UI ๋กœ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์„ ์ทจํ•˜๊ณ  ์žˆ์„ ๋•Œ, ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ
    asia.demand = "";
    expect(asia.shortfall).NaN;
    expect(asia.profit).NaN;
  });
});

describe("no producers", function () {
  // ์ƒ์‚ฐ์ž๊ฐ€ ์—†๋‹ค.
  let noProducers;
  this.beforeEach(function () {
    const data = {
      name: "No producers",
      producers: [],
      demand: 30,
      price: 20,
    };
    noProducers = new Province(data);
  });

  it("shortfall", function () {
    expect(noProducers.shortfall).equal(30);
  });

  it("profit", function () {
    expect(noProducers.profit).equal(0);
  });
});

describe("string for producers", () => {
  it("", () => {
    const data = {
      name: "String producers",
      producers: "",
      demand: 30,
      price: 20,
    };
    const prov = new Province(data);
    expect(prov.shortfall).equal(0);
  });
});

4.3 ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธํ•  ์ƒ˜ํ”Œ ์ฝ”๋“œ
function sampleProvinceData() {
  return {
    name: "Asia",
    producers: [
      { name: "Byzantium", cost: 10, production: 9 },
      { name: "Attalia", cost: 12, production: 10 },
      { name: "Sinope", cost: 10, production: 6 },
    ],
    demand: 30,
    price: 20,
  };
}

/**
 * ์ง€์—ญ ์ „์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค
 * ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ž๋“ค์ด ๋‹ด๊ฒจ ์žˆ๋‹ค
 * */
class Province {
  constructor(doc) {
    this._name = doc.name;
    this._producers = [];
    this._totalProduction = 0;
    this._demand = doc.demand;
    this._price = doc.price;
    doc.producers.forEach((d) => this.addProducer(new Producer(this, d)));
  }

  addProducer(arg) {
    this._producers.push(arg);
    this._totalProduction += arg.production;
  }

  get name() {
    return this._name;
  }
  get producers() {
    return this._producers.slice();
  }
  get totalProduction() {
    return this._totalProduction;
  }
  set totalProduction(arg) {
    this._totalProduction = arg;
  }
  get demand() {
    return this._demand;
  }
  set demand(arg) {
    this._demand = parseInt(arg);
  } // ์ˆซ์ž๋กœ ํŒŒ์‹ฑํ•ด ์ €์žฅ
  get price() {
    return this._price;
  }
  set price(arg) {
    this._price = parseInt(arg);
  } // ์ˆซ์ž๋กœ ํŒŒ์‹ฑํ•ด ์ €์žฅ

  // ์ƒ์ƒ ๋ถ€์กฑ๋ถ„์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ
  get shortfall() {
    return this._demand - this.totalProduction;
  }

  // ์ˆ˜์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ
  get profit() {
    return this.demandValue - this.demandCost;
  }

  get demandValue() {
    return this.satisfiedDemand * this.price;
  }

  get satisfiedDemand() {
    return Math.min(this._demand, this.totalProduction);
  }

  get demandCost() {
    let remainingDemand = this.demand;
    let result = 0;
    this.producers
      .sort((a, b) => a.cost - b.cost)
      .forEach((p) => {
        const contribution = Math.min(remainingDemand, p.production);
        remainingDemand -= contribution;
        result += contribution * p.cost;
      });
    return result;
  }
}

/**
 * ์ƒ์‚ฐ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค
 * ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์“ฐ์ธ๋‹ค
 *   */
class Producer {
  constructor(aProvince, data) {
    this._province = aProvince;
    this._cost = data.cost;
    this._name = data.name;
    this._production = data.production || 0;
  }

  get name() {
    return this._name;
  }

  get cost() {
    return this._cost;
  }

  set cost(arg) {
    this._cost = parseInt(arg);
  }

  get production() {
    return this._production;
  }

  set production(amountStr) {
    const amount = parseInt(amountStr);
    const newProduction = Number.isNaN(amount) ? 0 : amount;
    this._province.totalProduction += newProduction - this._production;
    this._production = newProduction;
  }
}

module.exports = {
  sampleProvinceData,
  Province,
};
describe("province", function () {
  it("shortfall", function () {
    const asia = new Province(sampleProvinceData()); // 1. ํ”ฝ์Šค์ฒ˜ ์„ค์ •
    assert.equal(asia.shortfall, 5); // 2. ๊ฒ€์ฆ
  });
});
  • ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ์ฒด๋ฅผ ๋œปํ•˜๋Š” ํ”ฝ์Šค์ฒ˜(๊ณ ์ •์žฅ์น˜)๋ฅผ ์„ค์ •ํ•œ๋‹ค

  • ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ํ”ฝ์Šค์ณ์˜ ์†์„ฑ๋“ค์„ ๊ฒ€์ฆํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ์ฃผ์–ด์ง„ ์ดˆ๊นƒ๊ฐ’์— ๊ธฐ์ดˆํ•˜์—ฌ ์ƒ์‚ฐ ๋ถ€์กฑ๋ถ„์„ ์ •ํ™•ํžˆ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

  • ์‹คํŒจํ•ด์•ผ ํ•  ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“ค์ž

get shortfall(){
	return this._demand - this.totalProduction * 2; // ์˜ค๋ฅ˜ ์ฃผ์ž…
}
  • ์ˆ˜์ • ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
  • ๋ชจ์นด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์†Œ์œ„ ์–ด์„œ์…˜(assertion: ๋‹จ์–ธ, ํ™•์–ธ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ํ•˜๋Š” ํ”ฝ์Šค์ฒ˜ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์šฉ ์–ด์„œ์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ์ฐจ์ด(Chai) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค
  • ์œ„์— ์ ์€ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ฐจ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด esm ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ  ์ ์šฉํ•ด๋ณด์ž!

4.5 ํ”ฝ์Šค์ฒ˜ ์ˆ˜์ •ํ•˜๊ธฐ

  • ํ…Œ์ŠคํŠธ์— ๊ด€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค๋ฉด ์ง€๊ธˆ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค
  • ์šฐ๋ฆฌ๊ฐ€ โ€˜์„ค์ •โ€™ํ•œ ํ‘œ์ค€ ํ”ฝ์Šค์ฒ˜๋ฅผ ์ทจํ•ด์„œ, ํ…Œ์ŠคํŠธ๋ฅผ โ€˜์ˆ˜ํ–‰โ€™ํ•˜๊ณ , ์ด ํ”ฝ์Šค์ฒ˜๊ฐ€ ์ผ์„ ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€๋ฅผ โ€˜๊ฒ€์ฆโ€™ํ•œ๋‹ค
  • ์ด๋ฅผ ์„ค์ •-์‹คํ–‰-๊ฒ€์ฆ / ์กฐ๊ฑด-๋ฐœ์ƒ-๊ฒฐ๊ณผ / ์ค€๋น„-์ˆ˜ํ–‰-๋‹จ์–ธ ๋“ฑ์œผ๋กœ ๋ถ€๋ฅธ๋‹ค

4.6 ๊ฒฝ๊ณ„ ์กฐ๊ฑด ๊ฒ€์‚ฌํ•˜๊ธฐ

  • ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋“  ์ผ์ด ์ˆœ์กฐ๋กญ๊ณ  ์‚ฌ์šฉ์ž๋„ ์˜๋„๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ช…, โ€˜๊ฝƒ๊ธธโ€™ ์ƒํ™ฉ์— ์ง‘์ค‘ํ•˜์˜€๋‹ค
  • ํ•˜์ง€๋งŒ ์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ๊ณ„ ์ง€์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ๋„ ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋ฉด ์ข‹๋‹ค (์ปฌ๋ ‰์…˜์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜, ์Œ์ˆ˜์ผ ๋•Œ ๋“ฑ์„ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค)
describe("no producers", function () {
  // ์ƒ์‚ฐ์ž๊ฐ€ ์—†๋‹ค.
  let noProducers;
  this.beforeEach(function () {
    const data = {
      name: "No producers",
      producers: [],
      demand: 30,
      price: 20,
    };
    noProducers = new Province(data);
  });

  it("shortfall", function () {
    expect(noProducers.shortfall).equal(30);
  });

  it("profit", function () {
    expect(noProducers.profit).equal(0);
  });
});

describe("string for producers", () => {
  it("", () => {
    const data = {
      name: "String producers",
      producers: "",
      demand: 30,
      price: 20,
    };
    const prov = new Province(data);
    expect(prov.shortfall).equal(0);
  });
});
  • ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜์š”๊ฐ€ ์Œ์ˆ˜์ผ ๋•Œ ์ˆ˜์ต์ด ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์ด ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ฐ ๊ด€์ ์—์„œ ๋ง์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
  • ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ๊ณ„ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๊ทธ ๋ถ€๋ถ„์„ ์ง‘์ค‘์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ž
  • ๋ชจ๋“  ๋ฒ„๊ทธ๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋Œ€๋‹ค์ˆ˜์˜ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ๋‚ ๋ฆฌ๋Š” ์…ˆ์ด๋‹ค
  • ๊ทธ๋ ‡๋‹ค๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋Š ์ˆ˜์ค€๊นŒ์ง€ ํ•ด์•ผ ํ• ๊นŒ? ํ…Œ์ŠคํŠธ๋Š” ์œ„ํ—˜ํ•œ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
  • ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ณต์žกํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด์ž. ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ๋งŒํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด์ž. ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋“  ๋ฒ„๊ทธ๋ฅผ ๊ฑธ๋Ÿฌ์ฃผ์ง€๋Š” ๋ชปํ• ์ง€๋ผ๋„, ์•ˆ์‹ฌํ•˜๊ณ  ๋ฆฌํŒฉํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ณดํ˜ธ๋ง‰์€ ๋˜์–ด์ค€๋‹ค. ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋”์šฑ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ฒŒ ๋˜์–ด ๋” ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ฒŒ ๋œ๋‹ค
  • ํ•„์ž๋Š” ํ•ญ์ƒ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ถ€ํ„ฐ ๊ฐ–์ถ˜ ๋’ค์— ๋ฆฌํŒฉํ„ฐ๋งํ•˜์ง€๋งŒ, ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š” ๋™์•ˆ์—๋„ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

4.7 ๋๋‚˜์ง€ ์•Š์€ ์—ฌ์ •

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

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

  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์€ ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ์™€ ๋ณ€์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ๋‹ค

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

  • ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งŽ์ด ์“ฐ์ธ๋‹ค

  • ๋ฐ”๊ฟ€ ๋Œ€์ƒ์ด ๋ณ€์ˆ˜๋ผ๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ์™€ ๊ด€๋ จ์ด ๊นŠ๋‹ค

  • ์ž์ฃผ ํ•จ๊ป˜ ๋ญ‰์ณ ๋‹ค๋‹ˆ๋Š” ์ธ์ˆ˜๋“ค์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ๋ฅผ ์ ์šฉํ•ด ๊ฐ์ฒด ํ•˜๋‚˜๋กœ ๋ฌถ์œผ๋ฉด ํŽธ๋ฆฌํ•  ๋•Œ ๊ฐ€ ๋งŽ๋‹ค

  • ํ•จ์ˆ˜ ๊ตฌ์„ฑ๊ณผ ์ด๋ฆ„ ์ง“๊ธฐ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ €์ˆ˜์ค€ ๋ฆฌํŒฉํ„ฐ๋ง์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ผ๋‹จ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด ๋‹ค์‹œ ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค

  • ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ๋•Œ๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ๋ฅผ ์ด์šฉํ•œ๋‹ค

  • ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋ฌถ๊ธฐ๋„ ์žˆ๋Š”๋ฐ, ์ฝ๊ธฐ์ „์šฉ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํŠนํžˆ ์ข‹๋‹ค

  • ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€, ํ•œ๋ฐ ๋ฌถ์€ ๋ชจ๋“ˆ๋“ค์˜ ์ž‘์—… ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋ช…ํ™•ํ•œ ๋‹จ๊ณ„๋กœ ๊ตฌ๋ถ„ ์ง“๋Š” ๋‹จ๊ณ„ ์ชผ๊ฐœ๊ธฐ๋ฅผ ์ ์šฉํ•  ๋•Œ๋„ ๋งŽ๋‹ค

6.1 ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

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

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

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

"์ตœ์ ํ™” ํ•  ๋•Œ๋Š” ๋‹ค์Œ ๋‘ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ ๋ฐ”๋ž€๋‹ค."
"์ฒซ ๋ฒˆ์งธ, ํ•˜์ง€ ๋งˆ๋ผ."
"๋‘ ๋ฒˆ์งธ(์ „๋ฌธ๊ฐ€ ํ•œ์ •), ์•„์ง ํ•˜์ง€ ๋งˆ๋ผ"

์ ˆ์ฐจ

  1. ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๋ชฉ์ ์„ ์ž˜ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค('์–ด๋–ป๊ฒŒ'๊ฐ€ ์•„๋‹Œ '๋ฌด์—‡์„'ํ•˜๋Š”์ง€๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•œ๋‹ค)
  2. ์ถ”์ถœํ•  ์ฝ”๋“œ๋ฅผ ์›๋ณธ ํ•จ์ˆ˜์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ ํ•จ์ˆ˜์— ๋ถ™์—ฌ๋„ฃ๋Š”๋‹ค
  3. ์ถ”์ถœํ•œ ์ฝ”๋“œ ์ค‘ ์›๋ณธ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ถ”์ถœํ•œ ํ•จ์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ณ€์ˆ˜๋Š” ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ์žˆ๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค
  4. ๋ณ€์ˆ˜๋ฅผ ๋‹ค ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด ์ปดํŒŒ์ผํ•œ๋‹ค
  5. ์›๋ณธ ํ•จ์ˆ˜์—์„œ ์ถ”์ถœํ•œ ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์ƒˆ๋กœ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ์žฅ์œผ๋กœ ๋ฐ”๊พผ๋‹ค
  6. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  7. ๋‹ค๋ฅธ ์ฝ”๋“œ์— ๋ฐฉ๊ธˆ ์ถ”์ถœํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™๊ฑฐ๋‚˜ ๋น„์Šทํ•œ ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€ ์‚ดํ•€๋‹ค. ์žˆ๋‹ค๋ฉด ๋ฐฉ๊ธˆ ์ถ”์ถœํ•œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ฐ”๊ฟ€์ง€ ๊ฒ€ํ† ํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
export function printOwing(invoice) {
  let outstanding = 0;

  console.log("***********************");
  console.log("**** Customer Owes ****");
  console.log("***********************");

  // calculate outstanding
  for (const o of invoice.orders) {
    outstanding += o.amount;
  }

  // record due date
  const today = new Date();
  invoice.dueDate = new Date(
    today.getFullYear(),
    today.getMonth(),
    today.getDate() + 30
  );

  //print details
  console.log(`name: ${invoice.customer}`);
  console.log(`amount: ${outstanding}`);
  console.log(`due: ${invoice.dueDate.toLocaleDateString()}`);
}

const invoice = {
  orders: [{ amount: 2 }, { amount: 5 }],
  customer: "์ค€ํฌ",
};
printOwing(invoice);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function printOwing(invoice) {
  printBanner();
  let outstanding = calculateOutstanding(invoice);
  recordDueDate(invoice);
  printDetails(invoice, outstanding);
}

function printBanner() {
  console.log("***********************");
  console.log("**** ๊ณ ๊ฐ ์ฑ„๋ฌด ****");
  console.log("***********************");
}

function calculateOutstanding(invoice) {
  return invoice.orders.reduce((sum, order) => (sum += order.amount), 0);
}

function recordDueDate(invoice) {
  const today = new Date();
  invoice.dueDate = new Date(
    today.getFullYear(),
    today.getMonth(),
    today.getDate() + 30
  );
}

function printDetails(invoice, outstanding) {
  console.log(`name: ${invoice.customer}`);
  console.log(`amount: ${outstanding}`);
  console.log(`due: ${invoice.dueDate.toLocaleDateString()}`);
}

const invoice = {
  orders: [{ amount: 2 }, { amount: 5 }],
  customer: "์ค€ํฌ",
};
printOwing(invoice);

/**
 * ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋กœ์ง์ด ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค
 *
 * ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ณณ๊ณผ ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์ด ๋†“๊ธฐ
 */

6.2 ํ•จ์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

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

์ ˆ์ฐจ

  1. ๋‹คํ˜• ๋ฉ”์„œ๋“œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค
  2. ์ธ๋ผ์ธํ•  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์„ ๋ชจ๋‘ ์ฐพ๋Š”๋‹ค
  3. ๊ฐ ํ˜ธ์ถœ๋ฌธ์„ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์œผ๋กœ ๊ต์ฒดํ•œ๋‹ค
  4. ํ•˜๋‚˜์”ฉ ๊ต์ฒดํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ํ•จ์ˆ˜ ์ •์˜(์›๋ž˜ ํ•จ์ˆ˜)๋ฅผ ์‚ญ์ œํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
function rating(driver) {
  return moreThanFiveLateDeliveries(driver) ? 2 : 1;
}

function moreThanFiveLateDeliveries(dvr) {
  return dvr.numberOfLateDeliveries > 5;
}

function reportLines(customer) {
  const lines = [];
  gatherCustomerData(lines, customer);
  return lines;
}

function gatherCustomerData(out, customer) {
  out.push(["name", customer.name]);
  out.push(["location", customer.location]);
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function rating(driver) {
  return driver.numberOfLateDeliveries > 5 ? 2 : 1;
}

function reportLines(customer) {
  const lines = [];
  lines.push(["name", customer.name]);
  lines.push(["location", customer.location]);
  return lines;
}

/**
 * ๋ฆฌํŒฉํ„ฐ๋ง์€ extract (์ถ”์ถœํ•˜๊ธฐ) ์™€ inline(์ธ๋ผ์ธํ•˜๊ธฐ) ์˜ ๋ฐ˜๋ณต์ด๋‹ค
 */

6.3 ๋ณ€์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ

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

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

์ ˆ์ฐจ

  1. ์ถ”์ถœํ•˜๋ ค๋Š” ํ‘œํ˜„์‹์— ๋ถ€์ž‘์šฉ์€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
  2. ๋ถˆ๋ณ€ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•˜๊ณ  ์ด๋ฆ„์„ ๋ถ™์ผ ํ‘œํ˜„์‹์˜ ๋ณต์ œ๋ณธ์„ ๋Œ€์ž…ํ•œ๋‹ค
  3. ์›๋ณธ ํ‘œํ˜„์‹์„ ์ƒˆ๋กœ ๋งŒ๋“  ๋ณ€์ˆ˜๋กœ ๊ต์ฒดํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ํ‘œํ˜„์‹์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์„ ์ƒˆ๋กœ ๋งŒ๋“  ๋ณ€์ˆ˜๋กœ ๊ต์ฒดํ•œ๋‹ค. ํ•˜๋‚˜ ๊ต์ฒดํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
export function price(order) {
  // ๊ฐ€๊ฒฉ(price) = ๊ธฐ๋ณธ๊ฐ€๊ฒฉ - ์ˆ˜๋Ÿ‰ํ• ์ธ + ๋ฐฐ์†ก๋น„
  return (
    order.quantity * order.itemPrice -
    Math.max(0, order.quantity - 500) * order.itemPrice * 0.05 +
    Math.min(order.quantity * order.itemPrice * 0.1, 100)
  );
}
class Order {
  constructor(aRecord) {
    this._data = aRecord;
  }

  get quantity() {
    return this._data.quantity;
  }
  get itemPrice() {
    return this._data.itemPrice;
  }

  get price() {
    return (
      this.quantity * this.itemPrice -
      Math.max(0, this.quantity - 500) * this.itemPrice * 0.05 +
      Math.min(this.quantity * this.itemPrice * 0.1, 100)
    );
  }
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function price(order) {
  const basePrice = order.quantity * order.itemPrice;
  const discount = Math.max(0, order.quantity - 500) * order.itemPrice * 0.05;
  const shopping = Math.min(order.quantity * order.itemPrice * 0.1, 100);

  return basePrice - discount + shopping;
}
class Order {
  constructor(aRecord) {
    this._data = aRecord;
  }

  get quantity() {
    return this._data.quantity;
  }
  get itemPrice() {
    return this._data.itemPrice;
  }

  get price() {
    return this.basePrice - this.discount + this.shipping;
  }

  get basePrice() {
    return this.quantity * this.itemPrice;
  }

  get discount() {
    return Math.max(0, this.quantity - 500) * this.itemPrice * 0.05;
  }

  get shipping() {
    return Math.min(this.quantity * this.itemPrice * 0.1, 100);
  }
}

6.4 ๋ณ€์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

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

์ ˆ์ฐจ

  1. ๋Œ€์ž…๋ฌธ์˜ ์šฐ๋ณ€(ํ‘œํ˜„์‹)์—์„œ ๋ถ€์ž‘์šฉ์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
  2. ๋ณ€์ˆ˜๊ฐ€ ๋ถˆ๋ณ€์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“  ํ›„ ํ…Œ์ŠคํŠธํ•œ๋‹ค
  3. ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์žฅ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์„œ ๋Œ€์ž…๋ฌธ ์šฐ๋ณ€์˜ ์ฝ”๋“œ๋กœ ๋ฐ”๊พผ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ๊ต์ฒดํ•  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค
  6. ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ๋Œ€์ž…๋ฌธ์„ ์ง€์šด๋‹ค
  7. ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
function isDeliveryFree(anOrder) {
  let basePrice = anOrder.basePrice;
  return basePrice > 1000;
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function isDeliveryFree(anOrder) {
  return anOrder.basePrice > 1000;
}

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

๋ฐฐ๊ฒฝ

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

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

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

๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ

  1. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐ๋ผ๋ ค๊ฑฐ๋“  ๋จผ์ € ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ์ œ๊ฑฐ ๋Œ€์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
  2. ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊พผ๋‹ค
  3. ๊ธฐ์กด ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ฐพ์•„์„œ ๋ฐ”๋€ ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค

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

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ

  1. ์ด์–ด์ง€๋Š” ์ถ”์ถœ ๋‹จ๊ณ„๋ฅผ ์ˆ˜์›”ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์ ์ ˆํžˆ ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค
  2. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค
  3. ์ถ”์ถœํ•œ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด '๊ฐ„๋‹จํ•œ ์ ˆ์ฐจ'๋ฅผ ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ•œ๋‹ค
  6. ์ด๋ฆ„์„ ์ž„์‹œ๋กœ ๋ถ™์—ฌ๋’€๋‹ค๋ฉด ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋ฅผ ํ•œ ๋ฒˆ ๋” ์ ์šฉํ•ด์„œ ์›๋ž˜ ์ด๋ฆ„์œผ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค
  7. ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
export function circum(radius) {
  return 2 * Math.PI * radius;
}
export default class Book {
  #reservations;
  constructor() {
    this.#reservations = [];
  }

  addReservation(customer) {
    this.#reservations.push(customer);
  }

  hasReservation(customer) {
    return this.#reservations.some(
      (reservedCustomer) => reservedCustomer.id === customer.id
    );
  }
}
export function inNewEngland(aCustomer) {
  return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(aCustomer.address.state);
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function circumference(radius) {
  return 2 * Math.PI * radius;
}

// F2 - ๊ธฐํ˜ธ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ
// circumference - ์›์ฃผ์œจ
export default class Book {
  #reservations;
  constructor() {
    this.#reservations = [];
  }

  addReservation(customer, isPriority = false) {
    this.#reservations.push(customer);
  }

  hasReservation(customer) {
    return this.#reservations.some(
      (reservedCustomer) => reservedCustomer.id === customer.id
    );
  }
}

/**
 * isPriority ๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ›์•„, ํ•จ์ˆ˜ ๋‚ด์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์„ ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
 * addReservation ๋‚ด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ์ด์ „ ๊ฐ’์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด isPriority ์˜ ์ดˆ๊ธฐ๊ฐ’์„ false ๋กœ ์ค€๋‹ค
 */
export function inNewEngland(state) {
  return ["MA", "CT", "ME", "VT", "NH", "RI"].includes(state);
}

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

๋ฐฐ๊ฒฝ

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

ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ๋๋‚˜์ง€ ์•Š๊ณ  ๊ฐ’์ด ์˜์†๋˜๋Š” ํ•„๋“œ๋ผ๋ฉด ์ด๋ฆ„์— ๋” ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค.

์ ˆ์ฐจ

  1. ํญ ๋„“๊ฒŒ ์“ฐ์ด๋Š” ๋ณ€์ˆ˜๋ผ๋ฉด ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค
  2. ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์„ ๋ชจ๋‘ ์ฐพ์•„์„œ, ํ•˜๋‚˜์”ฉ ๋ณ€๊ฒฝํ•œ๋‹ค
  • ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์— ๊ณต๊ฐœ๋œ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ์ด ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค
  • ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ํ•˜๋‚˜์”ฉ ์ ์ง„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค
  1. ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
let a = height * width;

const cpyNm = "์• ํ”Œ";

let tpHd = "์ œ๋ชฉ์—†์Œ";
let result = `<h1>${tpHd}</h1>`;
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
let area = width * height;

const companyName = "์• ํ”Œ";

let title = "์ œ๋ชฉ์—†์Œ";
let movieTitle = "์˜ํ™” ์ œ๋ชฉ";
let pageTitle = "์ œ๋ชฉ";

let result = `<h1>${title}</h1>`;

6.8 ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

๋ฐฐ๊ฒฝ

๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ด ํ•จ์ˆ˜์—์„œ ์ € ํ•จ์ˆ˜๋กœ ํ•จ๊ป˜ ๋ชฐ๋ ค๋‹ค๋‹ˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ž์ฃผ ๋ณธ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ•˜๋‚˜๋กœ ๋ชจ์•„์ฃผ๊ณค ํ•œ๋‹ค.

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

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

์ ˆ์ฐจ

  1. ์ ๋‹นํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„์ง ๋งˆ๋ จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค
  2. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  3. ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐ”๊พธ๊ธฐ๋กœ ์ƒˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ธฐ๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  6. ๊ธฐ์กด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ๋ฅผ ์ƒˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์›์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๊พผ๋‹ค
  7. ๋‹ค ๋ฐ”๊ฟจ๋‹ค๋ฉด ๊ธฐ์กด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ „ ์ฝ”๋“œ
function readingsOutsideRange(station, min, max) {
  return station.readings.filter((r) => r.temp < min || r.temp > max);
}

const station = {
  name: "ZB1",
  readings: [
    { temp: 47, time: "2016-11-10 09:10" },
    { temp: 53, time: "2016-11-10 09:20" },
    { temp: 58, time: "2016-11-10 09:30" },
    { temp: 53, time: "2016-11-10 09:40" },
    { temp: 51, time: "2016-11-10 09:50" },
  ],
};
const operationPlan = {
  temperatureFloor: 51,
  temperatureCeiling: 53,
};

readingsOutsideRange(
  station,
  operationPlan.temperatureFloor,
  operationPlan.temperatureCeiling
);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function readingsOutsideRange(station, range) {
  return station.readings.filter(
    (r) => r.temp < range.temperatureFloor || r.temp > range.temperatureCeiling
  );
}

const station = {
  name: "ZB1",
  readings: [
    { temp: 47, time: "2016-11-10 09:10" },
    { temp: 53, time: "2016-11-10 09:20" },
    { temp: 58, time: "2016-11-10 09:30" },
    { temp: 53, time: "2016-11-10 09:40" },
    { temp: 51, time: "2016-11-10 09:50" },
  ],
};
const operationPlan = {
  temperatureFloor: 51,
  temperatureCeiling: 53,
};

readingsOutsideRange(station, operationPlan);
function readingsOutsideRange(station, range) {
  return station.readings.filter((r) => !range.contains(r.temp));
}

class NumberRange {
  // private ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ ‘๋‘์‚ฌ #
  #min;
  #max;
  constructor(min, max) {
    this.#min = min;
    this.#max = max;
  }

  get min() {
    return this.#min;
  }

  get max() {
    return this.#max;
  }

  contains(number) {
    return number >= this.#min && number <= this.#max;
  }
}

const station = {
  name: "ZB1",
  readings: [
    { temp: 47, time: "2016-11-10 09:10" },
    { temp: 53, time: "2016-11-10 09:20" },
    { temp: 58, time: "2016-11-10 09:30" },
    { temp: 53, time: "2016-11-10 09:40" },
    { temp: 51, time: "2016-11-10 09:50" },
  ],
};
const operationPlan = new NumberRange(51, 53);

readingsOutsideRange(station, operationPlan);

6.6 ๋ณ€์ˆ˜ ์บก์Šํ™”ํ•˜๊ธฐ

๋ฐฐ๊ฒฝ

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

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

๊ทธ๋ž˜์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ๋„“์€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธธ ๋•Œ๋Š” ๋จผ์ € ๊ทธ ๋ฐ์ดํ„ฐ๋กœ์˜ ์ ‘๊ทผ์„ ๋…์ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์‹์œผ๋กœ ์บก์Šํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ๋ฐ์ดํ„ฐ ์žฌ๊ตฌ์„ฑ์ด๋ผ๋Š” ์–ด๋ ค์šด ์ž‘์—…์„ ํ•จ์ˆ˜ ์žฌ๊ตฌ์„ฑ์ด๋ผ๋Š” ๋” ๋‹จ์ˆœํ•œ ์ž‘์—…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

๊ฐ์ฒด ์ง€ํ–ฅ์—์„œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ญ์ƒ private์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•์กฐํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์—ฌ๊ธฐ์— ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ๋ฒ”์œ„๊ฐ€ ๋„“์„์ˆ˜๋ก ์บก์Šํ™”ํ•˜์—ฌ ๊ฐ€์‹œ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ ค ํ•œ๋‹ค.

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

์ ˆ์ฐจ

  1. ๋ณ€์ˆ˜๋กœ์˜ ์ ‘๊ทผ๊ณผ ๊ฐฑ์‹ ์„ ์ „๋‹ดํ•˜๋Š” ์บก์Šํ™” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค
  2. ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค
  3. ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๋˜ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์ ์ ˆํ•œ ์บก์Šํ™” ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐ”๊พผ๋‹ค. ํ•˜๋‚˜์”ฉ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  4. ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•œ๋‹ค (private)
  5. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  6. ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ ˆ์ฝ”๋“œ๋ผ๋ฉด ๋ ˆ์ฝ”๋“œ ์บก์Šํ™”ํ•˜๊ธฐ๋ฅผ ์ ์šฉํ• ์ง€ ๊ณ ๋ คํ•ด๋ณธ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
let defaultOwner = { firstName: "๋งˆํ‹ด", lastName: "ํŒŒ์šธ๋Ÿฌ" };

export function getDefaultOwner() {
  return defaultOwner;
}
let defaultOwner = { firstName: "๋งˆํ‹ด", lastName: "ํŒŒ์šธ๋Ÿฌ" };

function getDefaultOwner() {
  return defaultOwner;
}

const owner = getDefaultOwner();
owner.firstName = "์ค€ํฌ";
console.log(owner);
console.log(getDefaultOwner());
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
let defaultOwner = { firstName: "๋งˆํ‹ด", lastName: "ํŒŒ์šธ๋Ÿฌ" };

function getDefaultOwner() {
  // return Object.assign({}, defaultOwner);
  return { ...defaultOwner };
}

const owner = getDefaultOwner();
owner.firstName = "์ค€ํฌ";
console.log(owner);
console.log(getDefaultOwner());
class Person {
  #lastName;
  #firstName;
  constructor(data) {
    this.#lastName = data.lastName;
    this.#firstName = data.firstName;
  }

  get lastName() {
    return this.#lastName;
  }
  get firstName() {
    return this.#firstName;
  }
}

let defaultOwner = new Person({ firstName: "๋งˆํ‹ด", lastName: "ํŒŒ์šธ๋Ÿฌ" });

function getDefaultOwner() {
  return defaultOwner;
}

const owner = getDefaultOwner();

console.log(owner.firstName);
console.log(getDefaultOwner());

6.9 ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ

๋ฐฐ๊ฒฝ

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

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

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

์ ˆ์ฐจ

  1. ํ•จ์ˆ˜๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๊ณตํ†ต ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์บก์Šํ™”ํ•œ๋‹ค
  2. ๊ณตํ†ต ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ๊ฐ๊ฐ์„ ์ƒˆ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธด๋‹ค
  3. ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋กœ์ง๋“ค์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•ด์„œ ์ƒˆ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธด๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };

export function acquireReading() {
  return reading;
}

export function baseRate(month, year) {
  if (year === 2017 && month === 5) return 0.1;
  return 0.2;
}
import { acquireReading, baseRate } from "./6-9.js";

const aReading = acquireReading();

const baseCharge = baseRate(aReading.month, aReading.year) * aReading.quantity;
console.log(baseCharge);
import { acquireReading, baseRate } from "./6-9.js";

const aReading = acquireReading();
const base = baseRate(aReading.month, aReading.year) * aReading.quantity;

function taxThreshold(year) {
  return 0.1;
}

export const taxableCharge = Math.max(0, base - taxThreshold(aReading.year));
import { acquireReading, baseRate } from "./6-9.js";

const aReading = acquireReading();

function calculateBaseCharge(aReading) {
  return baseRate(aReading.month, aReading.year) * aReading.quantity;
}

const basicChargeAmount = calculateBaseCharge(aReading);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Reading {
  #customer;
  #quantity;
  #month;
  #year;
  constructor(data) {
    this.#customer = data.customer;
    this.#quantity = data.quantity;
    this.#month = data.month;
    this.#year = data.year;
  }

  get customer() {
    return this.#customer;
  }

  get quantity() {
    return this.#quantity;
  }

  get month() {
    return this.#month;
  }

  get year() {
    return this.#year;
  }

  get baseRate() {
    if (this.#year === 2017 && this.#month === 5) return 0.1;
    return 0.2;
  }

  get baseCharge() {
    return this.baseRate * this.quantity;
  }

  get taxThreshold() {
    return 0.1;
  }

  get taxableCharge() {
    return Math.max(0, this.baseCharge - 0.1 * this.taxThreshold);
  }
}

const reading = new Reading({
  customer: "ivan",
  quantity: 10,
  month: 5,
  year: 2017,
});

function acquireReading() {
  return reading;
}

const aReading = acquireReading();

const baseCharge = aReading.baseCharge;
const taxableCharge = aReading.taxableCharge;
const basicChargeAmount = aReading.baseCharge;

6.10 ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋ฌถ๊ธฐ

๋ฐฐ๊ฒฝ

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

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

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

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

์ ˆ์ฐจ

  1. ๋ณ€ํ™˜ํ•  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค
  2. ๋ฌถ์„ ํ•จ์ˆ˜ ์ค‘ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ์„œ ๋ณธ๋ฌธ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๊ณ , ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ž˜์ฝ”๋“œ์— ์ƒˆ ํ•„๋“œ๋กœ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ์ด ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค
  3. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  4. ๋‚˜๋จธ์ง€ ๊ด€๋ จ ํ•จ์ˆ˜๋„ ์œ„ ๊ณผ์ •์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };

export function acquireReading() {
  return reading;
}

export function baseRate(month, year) {
  if (year === 2017 && month === 5) return 0.1;
  return 0.2;
}

/**
 * ์š”์ฆ˜์€ ํด๋ž˜์Šค๋กœ ๋ฌถ๋Š” ๋ฐฉ์‹์„ ๋” ์„ ํ˜ธํ•œ๋‹ค
 * ๋ณ€ํ™˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…์€ ์ด์ „์— ๋งŽ์ด ์‚ฌ์šฉ๋œ ๋ฐฉ์‹
 */

...

import { acquireReading, baseRate } from './6-10.js';

const aReading = acquireReading();

const baseCharge = baseRate(aReading.month, aReading.year) * aReading.quantity;
console.log(baseCharge);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
import _ from "lodash";

const reading = { customer: "ivan", quantity: 10, month: 5, year: 2017 };

export function acquireReading() {
  return reading;
}

export function enrichReading(original) {
  const result = _.cloneDeep(original);
  result.baseCharge = calculateBaseCharge(result);
  result.taxableCharge = Math.max(
    0,
    result.baseCharge - taxTreshold(result.year)
  );
  return result;
}

function calculateBaseCharge(reading) {
  return baseRate(reading.month, reading.year) * reading.quantity;
}

export function baseRate(month, year) {
  if (year === 2017 && month === 5) return 0.1;
  return 0.2;
}
...
import { acquireReading, enrichReading } from "./6-10.js";

const rawReading = acquireReading();
const reading = enrichReading(rawReading);

console.log(reading.baseCharge);
console.log(reading.taxableCharge);

6.11 ๋‹จ๊ณ„ ์ชผ๊ฐœ๊ธฐ

๋ฐฐ๊ฒฝ

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

์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ• ํ•˜๋‚˜๋Š” ๋™์ž‘์„ ์—ฐ์ด์€ ๋‘ ๋‹จ๊ณ„๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด๋‹ค.

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

์ ˆ์ฐจ

  1. ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋…๋ฆฝ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค
  2. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  3. ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์•ž์—์„œ ์ถ”์ถœํ•œ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ์ถ”์ถœํ•œ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฒ€ํ† ํ•œ๋‹ค. ๊ทธ์ค‘ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์˜ฎ๊ธด๋‹ค. ํ•˜๋‚˜์”ฉ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  6. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
function priceOrder(product, quantity, shippingMethod) {
  // ๊ธฐ๋ณธ ์ œํ’ˆ ๊ฐ€๊ฒฉ
  const basePrice = product.basePrice * quantity;

  // ํ• ์ธ ๊ฐ€๊ฒฉ
  const discount =
    Math.max(quantity - product.discountThreshold, 0) *
    product.basePrice *
    product.discountRate;

  // ๊ฐœ๋ณ„ ๋ฐฐ์†ก๋น„
  const shippingPerCase =
    basePrice > shippingMethod.discountThreshold
      ? shippingMethod.discountedFee
      : shippingMethod.feePerCase;

  // ์ตœ์ข… ๋ฐฐ์†ก๋น„
  const shippingCost = quantity * shippingPerCase;

  // ๊ฐ€๊ฒฉ
  const price = basePrice - discount + shippingCost;

  return price;
}

// ์‚ฌ์šฉ ์˜ˆ:
const product = {
  basePrice: 10,
  discountRate: 0.1,
  discountThreshold: 10,
};

const shippingMethod = {
  discountThreshold: 20,
  feePerCase: 5,
  discountedFee: 3,
};

const price = priceOrder(product, 5, shippingMethod);
console.log(price);

/**
 * ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉํ–ฅ
 * 1. ๊ฐ์ฒด๋ฅผ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชป ํ•˜๋„๋ก ๋ง‰๊ธฐ
 */
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function priceOrder(product, quantity, shippingMethod) {
  const basePrice = calculateBasePrice(product, quantity);
  const discount = calcualteDiscountedPrice(product, quantity);
  const shippingCost = calculateShippingCost(
    basePrice,
    quantity,
    shippingMethod
  );

  return basePrice - discount + shippingCost;
}

function calculateBasePrice(product, quantity) {
  return product.basePrice * quantity;
}

function calcualteDiscountedPrice(product, quantity) {
  return (
    Math.max(quantity - product.discountThreshold, 0) *
    product.basePrice *
    product.discountRate
  );
}

function calculateShippingCost(basePrice, quantity, shippingMethod) {
  const shippingPerCase =
    basePrice > shippingMethod.discountThreshold
      ? shippingMethod.discountedFee
      : shippingMethod.feePerCase;

  return quantity * shippingPerCase;
}

// ์‚ฌ์šฉ ์˜ˆ:
const product = {
  basePrice: 10,
  discountRate: 0.1,
  discountThreshold: 10,
};

const shippingMethod = {
  discountThreshold: 20,
  feePerCase: 5,
  discountedFee: 3,
};

const price = priceOrder(product, 5, shippingMethod);
console.log(price);

/**
 * ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉํ–ฅ
 * 1. ๊ฐ์ฒด๋ฅผ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชป ํ•˜๋„๋ก ๋ง‰๊ธฐ
 */

/**
 * 1. ์ฃผ์„์œผ๋กœ ๋ณ€์ˆ˜์˜ ์˜๋„ ํŒŒ์•…ํ•˜๊ธฐ
 * 2. ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ
 * 3. ๋ถˆํ•„์š”ํ•œ (์ž„์‹œ๋ณ€์ˆ˜) ๋ฆฌํ„ด๋ฌธ ์ƒ๋žตํ•˜๊ธฐ
 */

7. ์บก์Šํ™”

7.1 ๋ ˆ์ฝ”๋“œ ์บก์Šํ™”ํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
const organization = { name: "Acme Gooseberries", country: "GB" };

organization.name = "eazel";
console.log(organization.name);
console.log(organization.country);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Organization {
  #name;
  #country;
  #data; //low data, ์˜ค๋ฆฌ์ง€๋„ ์›๋ณธ ๋ฐ์ดํ„ฐ
  constructor(data) {
    this.#data = data;
    this.#name = data.name;
    this.#country = data.country;
  }

  get name() {
    return this.#name;
  }

  set name(value) {
    return (this.#name = value);
  }

  get country() {
    return this.#country;
  }

  set country(value) {
    return (this.#country = value);
  }

  get rawData() {
    return { ...this.#data }; // ์–•์€ ๋ณต์‚ฌ
  }
}

const organization = new Organization({
  name: "Acme Gooseberries",
  country: "GB",
});

console.log(organization.name);
console.log(organization.country);

7.2 ์ปฌ๋ ‰์…˜ ์บก์Šํ™”ํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Person {
  #name;
  #courses;
  constructor(name) {
    this.#name = name;
    this.#courses = [];
  }

  get name() {
    return this.#name;
  }

  get courses() {
    return this.#courses;
  }

  set courses(courses) {
    this.#courses = courses;
  }
}

class Course {
  #name;
  #isAdvanced;
  constructor(name, isAdvanced) {
    this.#name = name;
    this.#isAdvanced = isAdvanced;
  }

  get name() {
    return this.#name;
  }

  get isAdvanced() {
    return this.#isAdvanced;
  }
}

const ellie = new Person("์ค€ํฌ");
ellie.courses.push(new Course("๋ฆฌํŒฉํ† ๋ง", true));
console.log(ellie.courses.length);

/**
 * ์™ธ๋ถ€์—์„œ course๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
 */
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Person {
  #name;
  #courses;
  constructor(name) {
    this.#name = name;
    this.#courses = [];
  }

  get name() {
    return this.#name;
  }

  get courses() {
    return [...this.#courses];
  }

  addCourse(course) {
    this.#courses.push(course);
  }

  removeCourse(course, runIfAbsent) {
    const index = this.#courses.indexOf(course);
    if (index === -1) {
      runIfAbsent();
      return;
    }

    this.#courses.splice(index, 1);
  }
}

class Course {
  #name;
  #isAdvanced;
  constructor(name, isAdvanced) {
    this.#name = name;
    this.#isAdvanced = isAdvanced;
  }

  get name() {
    return this.#name;
  }

  get isAdvanced() {
    return this.#isAdvanced;
  }
}

const junhee = new Person("์ค€ํฌ");
const course = new Course("๋ž˜ํŒฉํ„ฐ๋ง", true);
junhee.addCourse(course);
console.log(junhee.courses.length);
junhee.removeCourse(course, () => {
  console.log("ํ•ด๋‹น ์ฝ”์Šค๋Š” ์—†๋‹ค");
});
console.log(junhee.courses.length);
junhee.removeCourse(course, () => {
  console.log("ํ•ด๋‹น ์ฝ”์Šค๋Š” ์—†๋‹ค");
});

/**
 * ์™ธ๋ถ€์—์„œ course๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ
 */

7.3 ๊ธฐ๋ณธํ˜•์„ ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
export class Order {
  constructor(data) {
    this.priority = data.priority;
  }
}

const orders = [
  new Order({ priority: "normal" }),
  new Order({ priority: "high" }),
  new Order({ priority: "rush" }),
];

const highPriorityCount = orders.filter(
  (o) => "high" === o.priority || "rush" === o.priority
).length;
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Order {
  constructor(data) {
    this.priority = data.priority;
  }

  isHighPriority() {
    return this.priority.higherThan("normal");
  }
}

class Priority {
  #value;

  constructor(value) {
    if (Priority.legalValues().includes(value)) {
      this.#value = value;
    } else {
      throw new Error(`${value} is invalid for Priority`);
    }
  }

  get index() {
    return Priority.legalValues().findIndex(this.#value);
  }

  equals(other) {
    return this.#index === other.index;
  }

  higherThan(other) {
    return this.#index > other.index;
  }

  static legalValues() {
    return ["low", "normal", "high", "rush"];
  }
}

const orders = [
  new Order({ priority: "normal" }),
  new Order({ priority: "high" }),
  new Order({ priority: "rush" }),
];

const highPriorityCount = orders.filter((o) => o.isHighPriority()).length;

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

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Order {
  #quantity;
  #item;
  constructor(quantity, item) {
    this.#quantity = quantity;
    this.#item = item;
  }

  get price() {
    const basePrice = this.#quantity * this.#item.price;
    const discountFactor = 0.98;
    if (basePrice > 1000) discountFactor -= 0.03;
    return basePrice * discountFactor;
  }
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Order {
  #quantity;
  #item;
  constructor(quantity, item) {
    this.#quantity = quantity;
    this.#item = item;
  }

  get basePrice() {
    return this.#quantity * this.#item.price;
  }

  get discountFactor() {
    return this.basePrice > 1000 ? 0.95 : 0.98;
  }

  get price() {
    return this.basePrice * this.discountFactor;
  }
}

7.5 ํด๋ž˜์Šค ์ถ”์ถœํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Person {
  #name;
  #officeAreaCode;
  #officeNumber;
  constructor(name, areaCode, number) {
    this.#name = name;
    this.#officeAreaCode = areaCode;
    this.#officeNumber = number;
  }

  get name() {
    return this.#name;
  }

  set name(arg) {
    this.#name = arg;
  }

  get telephoneNumber() {
    return `(${this.officeAreaCode}) ${this.officeNumber}`;
  }

  get officeAreaCode() {
    return this.#officeAreaCode;
  }

  set officeAreaCode(arg) {
    this.#officeAreaCode = arg;
  }

  get officeNumber() {
    return this.#officeNumber;
  }

  set officeNumber(arg) {
    this.#officeNumber = arg;
  }
}

const person = new Person("์ค€ํฌ", "010", "12345678");
console.log(person.name);
console.log(person.officeAreaCode);
console.log(person.officeNumber);
console.log(person.telephoneNumber);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Person {
  #name;
  #telephoneNumber;
  constructor(name, areaCode, number) {
    this.#name = name;
    this.#telephoneNumber = new TelephoneNumber(areaCode, number);
  }

  get name() {
    return this.#name;
  }

  set name(arg) {
    this.#name = arg;
  }

  get telephoneNumber() {
    return this.#telephoneNumber.toString;
  }

  get officeAreaCode() {
    return this.#telephoneNumber.areaCode;
  }

  get officeNumber() {
    return this.#telephoneNumber.number;
  }
}

class TelephoneNumber {
  #areaCode;
  #number;
  constructor(area, number) {
    this.#areaCode = area;
    this.#number = number;
  }

  get areaCode() {
    return this.#areaCode;
  }
  set areaCode(arg) {
    this.#areaCode = arg;
  }

  get number() {
    return this.#number;
  }
  set number(arg) {
    this.#number = arg;
  }

  get toString() {
    return `(${this.#areaCode}) ${this.#number}`;
  }
}

const telephoneNumber = new TelephoneNumber("010", "12345678");
telephoneNumber.toString;

const person = new Person("์ค€ํฌ", "010", "12345678");
console.log(person.name);
console.log(person.officeAreaCode);
console.log(person.officeNumber);
console.log(person.telephoneNumber);

/**
 * ํด๋ž˜์Šค ํ•˜๋‚˜ ๋‹น ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
 */

7.6 ํด๋ž˜์Šค ์ธ๋ผ์ธํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
export class TrackingInformation {
  #shippingCompany;
  #trackingNumber;
  constructor(trackingNumber, shippingCompany) {
    this.#trackingNumber = trackingNumber;
    this.#shippingCompany = shippingCompany;
  }

  get shippingCompany() {
    return this.#shippingCompany;
  }

  set shippingCompany(arg) {
    this.#shippingCompany = arg;
  }

  get trackingNumber() {
    return this.#trackingNumber;
  }

  set trackingNumber(arg) {
    this.#trackingNumber = arg;
  }

  get display() {
    return `${this.shippingCompany}: ${this.trackingNumber}`;
  }
}

export class Shipment {
  #trackingInformation;
  constructor(trackingInformation) {
    this.#trackingInformation = trackingInformation;
  }

  get trackingInfo() {
    return this.#trackingInformation.display;
  }

  get trackingInformation() {
    return this.#trackingInformation;
  }

  set trackingInformation(trackingInformation) {
    this.#trackingInformation = trackingInformation;
  }
}

const shipment = new Shipment(new TrackingInformation(999, "Maersk"));
console.log(shipment.trackingInfo);

shipment.trackingInformation.shippingCompany = "COSCO";
console.log(shipment.trackingInfo);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
export class Shipment {
  #trackingNumber;
  #shippingCompany;

  constructor(trackingNumber, shippingCompany) {
    this.#trackingNumber = trackingNumber;
    this.#shippingCompany = shippingCompany;
  }

  get shippingCompany() {
    return this.#shippingCompany;
  }

  set shippingCompany(arg) {
    this.#shippingCompany = arg;
  }

  get trackingNumber() {
    return this.#trackingNumber;
  }

  set trackingNumber(arg) {
    this.#trackingNumber = arg;
  }

  get display() {
    return `${this.shippingCompany}: ${this.trackingNumber}`;
  }
}

export class Shipment {
  #trackingInformation;
  constructor(trackingInformation) {
    this.#trackingInformation = trackingInformation;
  }

  get trackingInfo() {
    return this.#trackingInformation.display;
  }

  get trackingInformation() {
    return this.#trackingInformation;
  }

  set trackingInformation(trackingInformation) {
    this.#trackingInformation = trackingInformation;
  }
}

const shipment = new Shipment(999, "Maersk");
console.log(shipment.trackingInfo);

shipment.trackingInformation.shippingCompany = "COSCO";
console.log(shipment.trackingInfo);

7.7 ์œ„์ž„ ์ˆจ๊ธฐ๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Person {
  #name;
  #department;
  constructor(name, department) {
    this.#name = name;
    this.#department = department;
  }

  get name() {
    return this.#name;
  }

  get department() {
    return this.#department;
  }

  set department(arg) {
    this.#department = arg;
  }
}

export class Department {
  #manager;
  #chargeCode;
  constructor(manager, chargeCode) {
    this.#manager = manager;
    this.#chargeCode = chargeCode;
  }

  get chargeCode() {
    return this.#chargeCode;
  }

  set chargeCode(arg) {
    this.#chargeCode = arg;
  }

  get manager() {
    return this.#manager;
  }

  set manager(arg) {
    this.#manager = arg;
  }
}

const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.department.manager);
console.log(person.department.chargeCode);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Person {
  #name;
  #department;
  constructor(name, department) {
    this.#name = name;
    this.#department = department;
  }

  get name() {
    return this.#name;
  }

  get manager() {
    return this.#department.manager;
  }

  get chargeCode() {
    return this.#department.chargeCode;
  }

  get department() {
    return this.#department;
  }

  set department(arg) {
    this.#department = arg;
  }
}

export class Department {
  #manager;
  #chargeCode;
  constructor(manager, chargeCode) {
    this.#manager = manager;
    this.#chargeCode = chargeCode;
  }

  get chargeCode() {
    return this.#chargeCode;
  }

  set chargeCode(arg) {
    this.#chargeCode = arg;
  }

  get manager() {
    return this.#manager;
  }

  set manager(arg) {
    this.#manager = arg;
  }
}

const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.manager);
console.log(person.chargeCode);

/**
 * ๋‚ด๋ถ€์—์‚ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด(department)๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋…ธ์ถœํ•œ ์ผ€์ด์Šค๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค
 * ์™ธ๋ถ€์—์„œ department๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก Department๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์ด๋‹ค
 */

7.8 ์ค‘๊ฐœ์ž ์ œ๊ฑฐํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Person {
  #name;
  #department;
  constructor(name, department) {
    this.#name = name;
    this.#department = department;
  }

  get name() {
    return this.#name;
  }

  get department() {
    return this.#department;
  }

  set department(arg) {
    this.#department = arg;
  }
}

export class Department {
  #manager;
  #chargeCode;
  constructor(manager, chargeCode) {
    this.#manager = manager;
    this.#chargeCode = chargeCode;
  }

  get chargeCode() {
    return this.#chargeCode;
  }

  set chargeCode(arg) {
    this.#chargeCode = arg;
  }

  get manager() {
    return this.#manager;
  }

  set manager(arg) {
    this.#manager = arg;
  }
}

const person = new Person("Tom", new Department("aManager", "999"));
console.log(person.name);
console.log(person.department.manager);
console.log(person.department.chargeCode);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Person {
  #name;
  #manager;
  #chargeCode;
  constructor(name, manager, chargeCode) {
    this.#name = name;
    this.#manager = manager;
    this.#chargeCode = chargeCode;
  }

  get name() {
    return this.#name;
  }
  get chargeCode() {
    return this.#chargeCode;
  }

  set chargeCode(arg) {
    this.#chargeCode = arg;
  }

  get manager() {
    return this.#manager;
  }

  set manager(arg) {
    this.#manager = arg;
  }
}

const person = new Person("Tom", "aManager", "999");
console.log(person.name);
console.log(person.manager);
console.log(person.chargeCode);

/**
 * ์ค‘๊ฐœ์ž = ์œ„์ž„ = ์ปดํฌ์ง€์…˜
 * A ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ B ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ
 * B๋ผ๋Š” ์ค‘๊ฐœ์ž๋ฅผ ํ†ตํ•ด์„œ A์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์–ป๋Š” ํ˜•์‹
 */

/**
 * extract ์ถ”์ถœํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆŒ ๊ฒƒ์ธ์ง€
 * inline ์ œ๊ฑฐํ•ด์„œ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค
 */

7.9 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ต์ฒดํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
function foundPerson(people) {
  for (let i = 0; i < people.length; i++) {
    if (people[i] === "Don") {
      return "Don";
    }
    if (people[i] === "John") {
      return "John";
    }
    if (people[i] === "Kent") {
      return "Kent";
    }
  }
  return "";
}

console.log(foundPerson(["John"]));
console.log(foundPerson(["Don", "John"]));
console.log(foundPerson(["Kent", "Don", "John"]));
console.log(foundPerson(["Lisa", "Don", "Tom"]));
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function foundPerson(people) {
  const candidates = ["Don", "John", "Kent"];
  return people.find((p) => candidates.includes(p)) || "";
}

console.log(foundPerson(["John"]));
console.log(foundPerson(["Don", "John"]));
console.log(foundPerson(["Kent", "Don", "John"]));
console.log(foundPerson(["Lisa", "Don", "Tom"]));

/**
 * ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ ๋˜ํ•œ ์บก์Šํ™”์ด๋‹ค
 * ์ด๋ฆ„๋งŒ ๋‘๊ณ  ๋‚ด๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์ˆจ๊ฒจ๋‘๊ณ , ์ด๋ฆ„๋งŒ์œผ๋กœ ์œ ์ถ”ํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
 */

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

8.1 ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ

๋ฐฐ๊ฒฝ

์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ํ•ต์‹ฌ์€ ๋ชจ๋“ˆํ™”๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋˜์–ด ์žˆ๋Š๋ƒ๋ฅผ ๋œปํ•˜๋Š” ๋ชจ๋“ˆ์„ฑ(modularity)์ด๋‹ค. ๋ชจ๋“ˆ์„ฑ์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋”˜๊ฐ€๋ฅผ ์ˆ˜์ •ํ•˜๋ ค ํ•  ๋•Œ ํ•ด๋‹น ๊ธฐ๋Šฅ๊ณผ ๊นŠ์ด ๊ด€๋ จ๋œ ์ž‘์€ ์ผ๋ถ€๋งŒ ์ดํ•ดํ•ด๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋Šฅ๋ ฅ์ด๋‹ค.

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

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

ํ•จ์ˆ˜๋ฅผ ์˜ฎ๊ธธ์ง€ ๋ง์ง€๋ฅผ ์ •ํ•˜๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š๋‹ค. ๊ทธ๋Ÿด ๋• ๋Œ€์ƒ ํ•จ์ˆ˜์˜ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์™€ ํ›„๋ณด ์ปจํ…์ŠคํŠธ๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด ๋„์›€์ด ๋œ๋‹ค.

๋Œ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๋ฌด์—‡์ธ์ง€, ๋Œ€์ƒ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๋˜ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€, ๋Œ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์—‡์ธ์ง€๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

๊ฒฝํ—˜์ƒ ํ•จ์ˆ˜๋“ค์„ ํ•œ ์ปจํ…์ŠคํŠธ์— ๋‘๊ณ  ์ž‘์—…ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ๋‹ค. ๊ทธ๊ณณ์ด ์–ผ๋งˆ๋‚˜ ์ ํ•ฉํ•œ์ง€๋Š” ์ฐจ์ฐจ ๊นจ๋‹ฌ์•„๊ฐˆ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ๊ณ , ์ž˜ ๋งž์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์œ„์น˜๋Š” ์–ธ์ œ๋“  ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ง์ด๋‹ค.

์ ˆ์ฐจ

  1. ์„ ํƒํ•œ ํ•จ์ˆ˜๊ฐ€ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค. ์ด ์š”์†Œ๋“ค ์ค‘์—๋„ ํ•จ๊ป˜ ์˜ฎ๊ฒจ์•ผ ํ•  ๊ฒŒ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค
  2. ์„ ํƒํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹คํ˜• ๋ฉ”์„œ๋“œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค
  3. ์„ ํƒํ•œ ํ•จ์ˆ˜๋ฅผ ํƒ€๊นƒ ์ปจํ…์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•œ๋‹ค. ํƒ€๊นƒ ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด ํ„ฐ์ „์— ์ž˜ ์ž๋ฆฌ ์žก๋„๋ก ๋‹ค๋“ฌ๋Š”๋‹ค
  • ์ด๋•Œ ์›๋ž˜์˜ ํ•จ์ˆ˜๋ฅผ ์†Œ์Šค ํ•จ์ˆ˜(source function) ๋ผ ํ•˜๊ณ  ๋ณต์‚ฌํ•ด์„œ ๋งŒ๋“  ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ํƒ€๊นƒ ํ•จ์ˆ˜(target function)๋ผ ํ•œ๋‹ค.
  1. ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•œ๋‹ค
  2. ์†Œ์Šค ์ปจํ…์ŠคํŠธ์—์„œ ํƒ€๊นƒ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋ฐ˜์˜ํ•œ๋‹ค
  3. ์†Œ์Šค ํ•จ์ˆ˜๋ฅผ ํƒ€๊นƒ ํ•จ์ˆ˜์˜ ์œ„์ž„ ํ•จ์ˆ˜๊ฐ€ ๋˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค
  4. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ์†Œ์Šค ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค.
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
function trackSummary(points) {
  const totalTime = calculateTime();
  const totalDistance = calculateDistance();
  const pace = totalTime / 60 / totalDistance;
  return {
    time: totalTime,
    distance: totalDistance,
    pace: pace,
  };

  function calculateDistance() {
    let result = 0;
    for (let i = 1; i < points.length; i++) {
      result += distance(points[i - 1], points[i]);
    }
    return result;
  }

  function distance(p1, p2) {
    // ํฌ๋ฎฌ๋ผ: http://www.movable-type.co.uk/scripts/latlong.html
    const EARTH_RADIUS = 3959; // in miles
    const dLat = radians(p2.lat) - radians(p1.lat);
    const dLon = radians(p2.lon) - radians(p1.lon);
    const a =
      Math.pow(Math.sin(dLat / 2), 2) +
      Math.cos(radians(p2.lat)) *
        Math.cos(radians(p1.lat)) *
        Math.pow(Math.sin(dLon / 2), 2);
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return EARTH_RADIUS * c;
  }

  function radians(degrees) {
    return (degrees * Math.PI) / 180;
  }

  function calculateTime() {
    return 10000;
  }
}

const newYork = {
  lat: 40.73061,
  lon: -73.935242,
};

const tokyo = {
  lat: 35.652832,
  lon: 139.839478,
};

const summary = trackSummary([newYork, tokyo]);
console.log(summary);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
/**
 * ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํ•จ์ˆ˜๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋กœ์ง
 *
 * trackSummary ๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ผ ํ˜•ํƒœ์˜€์ง€๋งŒ,
 * ์‹ค์งˆ์ ์œผ๋กœ ์‘์ง‘๋„(์„œ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ •๋„)๊ฐ€ ๋–จ์–ด์กŒ๋‹ค.
 *
 */

function trackSummary(points) {
  const time = calculateTime();
  const distance = calculateDistance(points);
  const pace = time / 60 / distance;

  return { time, distance, pace };
}
function calculateTime() {
  return 10000;
}

function calculateDistance(points) {
  let result = 0;
  for (let i = 1; i < points.length; i++) {
    result += distance(points[i - 1], points[i]);
  }
  return result;
}

function radians(degrees) {
  return (degrees * Math.PI) / 180;
}

function distance(p1, p2) {
  // ํฌ๋ฎฌ๋ผ: http://www.movable-type.co.uk/scripts/latlong.html
  const EARTH_RADIUS = 3959; // in miles
  const dLat = radians(p2.lat) - radians(p1.lat);
  const dLon = radians(p2.lon) - radians(p1.lon);
  const a =
    Math.pow(Math.sin(dLat / 2), 2) +
    Math.cos(radians(p2.lat)) *
      Math.cos(radians(p1.lat)) *
      Math.pow(Math.sin(dLon / 2), 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  return EARTH_RADIUS * c;
}

const newYork = {
  lat: 40.73061,
  lon: -73.935242,
};

const tokyo = {
  lat: 35.652832,
  lon: 139.839478,
};

const summary = trackSummary([newYork, tokyo]);
console.log(summary);

8.2 ํ•„๋“œ ์˜ฎ๊ธฐ๊ธฐ

๋ฐฐ๊ฒฝ

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

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

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

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

์˜ˆ์ปจ๋Œ€ ํ•จ์ˆ˜์— ์–ด๋–ค ๋ ˆ์ฝ”๋“œ๋ฅผ ๋„˜๊ธธ ๋•Œ๋งˆ๋‹ค ๋˜ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ์˜ ํ•„๋“œ๋„ ํ•จ๊ป˜ ๋„˜๊ธฐ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ํ•จ์ˆ˜์— ํ•ญ์ƒ ํ•จ๊ผ ๊ฑด๋„ค์ง€๋Š” ๋ฐ์ดํ„ฐ ์กฐ๊ฐ๋“ค์€ ์ƒํ˜ธ ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋„๋ก ํ•œ ๋ ˆ์ฝ”๋“œ์— ๋‹ด๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ข‹๋‹ค.

ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค ํ•  ๋Œ€ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ์˜ ํ•„๋“œ๊นŒ์ง€ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•„๋“œ์˜ ์œ„์น˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋‹ค.

๊ตฌ์กฐ์ฒด ์—ฌ๋Ÿฌ ๊ฐœ์— ์ •์˜๋œ ๋˜‘๊ฐ™์€ ํ•„๋“œ๋“ค์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•œ ๋ฒˆ๋งŒ ๊ฐฑ์‹ ํ•ด๋„ ๋˜๋Š” ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์˜ฎ๊ธฐ๋ผ๋Š” ์‹ ํ˜ธ๋‹ค.

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

ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋“ค ๋’ค์— ๊ฐ์ถฐ์ ธ(์บก์Šํ™”๋˜์–ด) ์žˆ์œผ๋ฏ€๋กœ ํด๋ž˜์Šค์— ๊ณ๋“ค์—ฌ์ง„ ํ•จ์ˆ˜๋“ค์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.

์ ˆ์ฐจ

  1. ์†Œ์Šค ํ•„๋“œ๊ฐ€ ์บก์Šํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์บก์Šํ™”ํ•œ๋‹ค
  2. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  3. ํƒ€๊นƒ ๊ฐ์ฒด์— ํ•„๋“œ์™€ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  4. ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค
  5. ์†Œ์Šค ๊ฐ์ฒด์—์„œ ํƒ€๊นƒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
  6. ์ ‘๊ทผ์ž๋“ค์ด ํƒ€๊นƒ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค
  7. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  8. ์†Œ์Šค ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค
  9. ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
class Customer {
  constructor(name, discountRate) {
    this.name = name;
    this.discountRate = discountRate;
    this.contract = new CustomerContract(this.dateToday());
  }

  get discountRate() {
    return this.discountRate;
  }

  becomePreferred() {
    this.discountRate += 0.03;
    // ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ์žˆ์Œ...
  }

  applyDiscount(amount) {
    return amount.subtract(amount.multiply(this.discountRate));
  }

  dateToday() {
    return new Date();
  }
}

class CustomerContract {
  constructor(startDate) {
    this.startDate = startDate;
  }
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
class Customer {
  constructor(name, discountRate) {
    this.name = name;
    this.contract = new CustomerContract(this.dateToday(), discountRate);
  }

  becomePreferred() {
    this.contract.discountRate += 0.03;
    // ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ์žˆ์Œ...
  }

  applyDiscount(amount) {
    return amount.subtract(amount.multiply(this.contract.discountRate));
  }

  dateToday() {
    return new Date();
  }
}

class CustomerContract {
  constructor(startDate, discountRate) {
    this.startDate = startDate;
    this.discountRate = discountRate;
  }

  get discountRate() {
    return this.discountRate;
  }

  set discountRate(value) {
    this.discountRate = value;
  }
}

8.3 ๋ฌธ์žฅ์„ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๊ธฐ

๋ฐฐ๊ฒฝ

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

์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด ์ถ”ํ›„ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฌด์–ธ๊ฐ€ ์ˆ˜์ •ํ•  ์ผ์ด ์ƒ๊ฒผ์„ ๋•Œ ๋‹จ ํ•œ๊ณณ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

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

์ ˆ์ฐจ

  1. ๋ฐ˜๋ณต ์ฝ”๋“œ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถ€๋ถ„๊ณผ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋‹ค๋ฉด ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œํ•˜๊ธฐ๋ฅผ ์ ์šฉํ•ด ๊ทผ์ฒ˜๋กœ ์˜ฎ๊ธด๋‹ค
  2. ํƒ€๊นƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์ด ํ•œ ๊ณณ๋ฟ์ด๋ฉด, ๋‹จ์ˆœํžˆ ์†Œ์Šค ์œ„์น˜์—์„œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž˜๋ผ๋‚ด์–ด ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜๋กœ ๋ณต์‚ฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ๋ผ๋ฉด ๋‚˜๋จธ์ง€ ๋‹จ๊ณ„๋Š” ๋ฌด์‹œํ•œ๋‹ค
  3. ํ˜ธ์ถœ์ž๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ํ˜ธ์ถœ์ž ์ค‘ ํ•˜๋‚˜์—์„œ 'ํƒ€๊นƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถ€๋ถ„๊ณผ ๊ทธ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋ ค๋Š” ๋ฌธ์žฅ๋“ค์„ ํ•จ๊ป˜' ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ๋‹ค. ์ถ”์ถœํ•œ ํ•จ์ˆ˜์— ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์ž„์‹œ ์ด๋ฆ„์„ ์ง€์–ด์ค€๋‹ค
  4. ๋‹ค๋ฅธ ํ˜ธ์ถœ์ž ๋ชจ๋‘๊ฐ€ ๋ฐฉ๊ธˆ ์ถ”์ถœํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  5. ๋ชจ๋“  ํ˜ธ์ถœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์›๋ž˜ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ ์ธ๋ผ์ธํ•œ ํ›„ ์›๋ž˜ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค
  6. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์›๋ž˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
function renderPerson(person) {
  const result = [];
  result.push(`<p>${person.name}</p>`);
  result.push(renderPhoto(person.photo));
  result.push(`<p>title: ${person.photo.title}</p>`);
  result.push(emitPhotoData(person.photo));
  return result.join("\n");
}

function photoDiv(p) {
  return ["<div>", `<p>title: ${p.title}</p>`, emitPhotoData(p), "</div>"].join(
    "\n"
  );
}

function emitPhotoData(aPhoto) {
  const result = [];
  result.push(`<p>location: ${aPhoto.location}</p>`);
  result.push(`<p>date: ${aPhoto.date.toDateString()}</p>`);
  return result.join("\n");
}

function renderPhoto(aPhoto) {
  return "";
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function renderPerson(person) {
  const result = [];
  result.push(`<p>${person.name}</p>`);
  result.push(renderPhoto(person.photo));
  result.push(emitPhotoData(person.photo));
  return result.join("\n");
}

function photoDiv(photo) {
  return ["<div>", emitPhotoData(photo), "</div>"].join("\n");
}

function emitPhotoData(photo) {
  const result = [];
  result.push(`<p>title: ${photo.photo.title}</p>`);
  result.push(`<p>location: ${photo.location}</p>`);
  result.push(`<p>date: ${photo.date.toDateString()}</p>`);
  return result.join("\n");
}

function renderPhoto(photo) {
  return "";
}

8.4 ๋ฌธ์žฅ์„ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ

๋ฐฐ๊ฒฝ

ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ์ถ”์ƒํ™”์˜ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ถ”์ƒํ™”๋ผ๋Š” ๊ฒƒ์ด ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธ‹๊ธฐ๊ฐ€ ๋งŒ๋งŒ์น˜ ์•Š๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์ถ”์ƒํ™”์˜ ๊ฒฝ๊ณ„๋˜ ์›€์ง์ด๊ฒŒ ๋œ๋‹ค. ํ•จ์ˆ˜ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์ดˆ๊ธฐ์—๋Š” ์‘์ง‘๋„ ๋†’๊ณ  ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•˜๋˜ ํ•จ์ˆ˜๊ฐ€ ์–ด๋Š์ƒˆ ๋‘˜ ์ด์ƒ์˜ ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

์˜ˆ์ปจ๋Œ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๊ธฐ๋Šฅ์ด ์ผ๋ถ€ ํ˜ธ์ถœ์ž์—๊ฒŒ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ์ผ(์ดˆ๊ธฐ์—๋Š” ์‘์ง‘๋„ ๋†’๊ณ  ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•˜๋˜ ํ•จ์ˆ˜๊ฐ€ ์–ด๋Š์ƒˆ ๋‘˜ ์ด์ƒ์˜ ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค)์ด ๋ฒŒ์–ด์ง„๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋‹ฌ๋ผ์ง„ ๋™์ž‘์„ ํ•จ์ˆ˜์—์„œ ๊บผ๋‚ด ํ•ด๋‹น ํ˜ธ์ถœ์ž๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค.

์ ˆ์ฐจ

  1. ํ˜ธ์ถœ์ž๊ฐ€ ํ•œ๋‘ ๊ฐœ๋ฟ์ด๊ณ  ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜๋„ ๊ฐ„๋‹จํ•œ ๋‹จ์ˆœํ•œ ์ƒํ™ฉ์ด๋ฉด, ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ์ฒ˜์Œ ์ค„์„ ์ž˜๋ผ๋‚ด์–ด ํ˜ธ์ถœ์ž๋กœ ๋ณต์‚ฌํ•ด ๋„ฃ๋Š”๋‹ค. ํ…Œ์ŠคํŠธ๋งŒ ํ†ต๊ณผํ•˜๋ฉด ์ด๋ฒˆ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์—ฌ๊ธฐ์„œ ๋์ด๋‹ค
  2. ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ๋Š”, ์ด๋™ํ•˜์ง€ '์•Š๊ธธ' ์›ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์žฅ์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•œ ๋‹ค์Œ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ž„์‹œ ์ด๋ฆ„์„ ์ง€์–ด์ค€๋‹ค
  3. ์›๋ž˜ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ•œ๋‹ค
  4. ์ถ”์ถœ๋œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์›๋ž˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
/**
 *   outStream.write(`<p>location: ${photo.location}</p>\n`); ๋ฅผ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
 */

function renderPerson(outStream, person) {
  outStream.write(`<p>${person.name}</p>\n`);
  renderPhoto(outStream, person.photo);
  emitPhotoData(outStream, person.photo);
}

function listRecentPhotos(outStream, photos) {
  photos
    .filter((p) => p.date > recentDateCutoff())
    .forEach((p) => {
      outStream.write("<div>\n");
      emitPhotoData(outStream, p);
      outStream.write("</div>\n");
    });
}

function emitPhotoData(outStream, photo) {
  outStream.write(`<p>title: ${photo.title}</p>\n`);
  outStream.write(`<p>date: ${photo.date.toDateString()}</p>\n`);
  outStream.write(`<p>location: ${photo.location}</p>\n`);
}

function renderPhoto(outStream, aPhoto) {
  outStream.write("");
}

function recentDateCutoff() {
  //7 days ago.
  return new Date().setDate(new Date().getDate() - 7);
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
function renderPerson(outStream, person) {
  outStream.write(`<p>${person.name}</p>\n`);
  renderPhoto(outStream, person.photo);
  emitPhotoData(outStream, person.photo);
  outStream.write(`<p>location: ${photo.location}</p>\n`);
}

function listRecentPhotos(outStream, photos) {
  photos
    .filter((p) => p.date > recentDateCutoff())
    .forEach((p) => {
      outStream.write("<div>\n");
      emitPhotoData(outStream, p);
      outStream.write("</div>\n");
    });
}

function emitPhotoData(outStream, photo) {
  outStream.write(`<p>title: ${photo.title}</p>\n`);
  outStream.write(`<p>date: ${photo.date.toDateString()}</p>\n`);
}

function renderPhoto(outStream, aPhoto) {
  outStream.write("");
}

function recentDateCutoff() {
  //7 days ago.
  return new Date().setDate(new Date().getDate() - 7);
}

8.5 ์ธ๋ผ์ธ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

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

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

์ ˆ์ฐจ

  1. ์ธ๋ผ์ธ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒดํ•œ๋‹ค
  2. ํ…Œ์ŠคํŠธํ•œ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
let appliesToMass = false;
for (const s of states) {
  if (s === "MA") appliesToMass = true;
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
let appliesToMass2 = states.includes("MA");

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

๋ฐฐ๊ฒฝ

๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์ด ๊ฐ€๊นŒ์ด ๋ชจ์—ฌ ์žˆ๋‹ค๋ฉด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค. ์˜ˆ์ปจ๋Œ€ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฌธ์žฅ๋“ค์€ ํ•œ๋ฐ ๋ชจ์—ฌ ์žˆ์–ด์•ผ ์ข‹๋‹ค.

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

์ ˆ์ฐจ

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

์ฝ”๋“œ ์กฐ๊ฐ์„ ์Šฌ๋ผ์ด๋“œํ•  ๋•Œ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. 1. ๋ฌด์—‡์„ ์Šฌ๋ผ์ด๋“œํ• ์ง€์™€ 2. ์Šฌ๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋‹ค. ๋ฌด์—‡์„ ์Šฌ๋ผ์ด๋“œํ• ์ง€๋Š” ๋งฅ๋ฝ๊ณผ ๊ด€๋ จ์ด ๊นŠ๋‹ค.

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

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

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
// ์˜ˆ์ œ 1
const pricingPlan = retrievePricingPlan();
const order = retreiveOrder();
let charge;
const chargePerUnit = pricingPlan.unit;

// ์˜ˆ์ œ 2
function someFunc() {
  let result;
  if (availableResources.length === 0) {
    result = createResource();
    allocatedResources.push(result);
  } else {
    result = availableResources.pop();
    allocatedResources.push(result);
  }
  return result;
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
// ์˜ˆ์ œ 1
const pricingPlan = retrievePricingPlan();
const chargePerUnit = pricingPlan.unit;
const order = retreiveOrder();
let charge;

// ์˜ˆ์ œ 2
function someFunc() {
  const result =
    availableResources.length === 0
      ? (result = createResource())
      : (result = availableResources.pop());

  allocatedResources.push(result);
  return result;
}

8.7 ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ

๋ฐฐ๊ฒฝ

์ข…์ข… ๋ฐ˜๋ณต๋ฌธ ํ•˜๋‚˜์—์„œ ๋‘ ๊ฐ€์ง€ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด๊ฒŒ ๋œ๋‹ค. ๊ทธ์ € ๋‘ ์ผ์„ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์œ ์—์„œ ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ์ผ ๋ชจ๋‘๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ฐ๊ฐ์˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ถ„๋ฆฌํ•ด๋‘๋ฉด ์ˆ˜์ •ํ•  ๋™์ž‘ ํ•˜๋‚˜๋งŒ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ˜๋ณต๋ฌธ์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด ๋ฆฌํŒฉํ„ฐ๋ง์„ ๋ถˆํŽธํ•ดํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ ๋งŽ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, ๋ฆฌํŒฉํ„ฐ๋ง๊ณผ ์ตœ์ ํ™”๋ฅผ ๊ตฌ๋ถ„ํ•˜์ž.

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

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

์ ˆ์ฐจ

  1. ๋ฐ˜๋ณต๋ฌธ์„ ๋ณต์ œํ•ด ๋‘ ๊ฐœ๋กœ ๋งŒ๋“ ๋‹ค
  2. ๋ฐ˜๋ณต๋ฌธ์ด ์ค‘๋ณต๋˜์–ด ์ƒ๊ธฐ๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ํŒŒ์•…ํ•ด์„œ ์ œ๊ฑฐํ•œ๋‹ค
  3. ํ…Œ์ŠคํŠธํ•œ๋‹ค
  4. ์™„๋ฃŒ๋์œผ๋ฉด, ๊ฐ ๋ฐ˜๋ณต๋ฌธ์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
/* ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ */

function reportYoungestAgeAndTotalSalary(people) {
  function youngestAge() {
    let youngest = people[0] ? people[0].age : Infinity;

    for (const p of people) {
      if (p.age < youngest) youngest = p.age;
    }
    return youngest;
  }

  function youngestAge2() {
    return Math.min(...people.map((p) => p.age));
  }

  function totalSalary() {
    let totalSalary = 0;

    for (const p of people) {
      totalSalary += p.salary;
    }
    return totalSalary;
  }

  function totalSalary2() {
    return people.reduce((total, p) => (total += p.salary), 0);
  }

  return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
}
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
/* ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ */

function reportYoungestAgeAndTotalSalary(people) {
  function youngestAge() {
    let youngest = people[0] ? people[0].age : Infinity;

    for (const p of people) {
      if (p.age < youngest) youngest = p.age;
    }
    return youngest;
  }

  function youngestAge2() {
    return Math.min(...people.map((p) => p.age));
  }

  function totalSalary() {
    let totalSalary = 0;

    for (const p of people) {
      totalSalary += p.salary;
    }
    return totalSalary;
  }

  function totalSalary2() {
    return people.reduce((total, p) => (total += p.salary), 0);
  }

  return `youngestAge: ${youngestAge()}, totalSalary: ${totalSalary()}`;
}

8.8 ๋ฐ˜๋ณต๋ฌธ์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

๋ฐฐ๊ฒฝ

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

์˜ˆ์ปจ๋ฐ ์ด๋ฒˆ ์ด์•ผ๊ธฐ์˜ ์ฃผ์ธ๊ณต์ธ ์ปฌ๋ ‰์…˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ด์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์ผ๋ จ์˜ ์—ฐ์‚ฐ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ๊ฐ ์—ฐ์‚ฐ์€ ์ปฌ๋ ‰์…˜์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜์„ ๋‚ด๋ฑ‰๋Š”๋‹ค.

์ ˆ์ฐจ

  1. ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋ ‰์…˜์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค
  2. ๋ฐ˜๋ณต๋ฌธ์˜ ์ฒซ ์ค„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ, ๊ฐ๊ฐ์˜ ๋‹จ์œ„ ํ–‰์œ„๋ฅผ ์ ์ ˆํ•œ ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ์ด๋•Œ ์ปฌ๋ ‰์…˜ ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์€ 1์—์„œ ๋งŒ๋“  ๋ฐ˜๋ณต๋ฌธ ์ปฌ๋ ‰์…˜ ๋ณ€์ˆ˜์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ์ด์ „ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ดˆ๋กœ ์—ฐ์‡„์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ํ•˜๋‚˜๋ฅผ ๋Œ€์ฒดํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•œ๋‹ค
  3. ๋ฐ˜๋ณต๋ฌธ์˜ ๋ชจ๋“  ๋™์ž‘์„ ๋Œ€์ฒดํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ ์ž์ฒด๋ฅผ ์ง€์šด๋‹ค
๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
function acquireData(input) {
  const lines = input.split("\n");
  let firstLine = true;
  const result = [];
  for (const line of lines) {
    if (firstLine) {
      firstLine = false;
      continue;
    }
    if (line.trim() === "") continue;
    const record = line.split(",");
    if (record[1].trim() === "India") {
      result.push({ city: record[0].trim(), phone: record[2].trim() });
    }
  }
  return result;
}

const input = `office, country, telephone\n
Chicago, USA, +1 312 373 1000\n
Beijing, China, +86 4008 900 505\n
Bangalore, India, +91 80 4064 9570\n
Porto Alegre, Brazil, +55 51 3079 3550\n
Chennai, India, +91 44 660 44766`;
const result = acquireData(input);
console.log(result);
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ
/**
 * ๋ฐ˜๋ณต๋ฌธ์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
 */

function acquireData(input) {
  return input
    .split("\n")
    .splice(1)
    .filter((line) => line.trim() !== "")
    .map((line) => line.split(","))
    .filter((line) => line[1].trim() === "India")
    .map((line) => ({
      city: line[0].trim(),
      phone: line[2].trim(),
    }));
}

const input = `office, country, telephone\n
Chicago, USA, +1 312 373 1000\n
Beijing, China, +86 4008 900 505\n
Bangalore, India, +91 80 4064 9570\n
Porto Alegre, Brazil, +55 51 3079 3550\n
Chennai, India, +91 44 660 44766`;
const result = acquireData(input);
console.log(result);

๋งˆํฌ์—… ๋ณต์‚ฌ์šฉ

๋ฐฐ๊ฒฝ

์ ˆ์ฐจ

๋ฆฌํŒฉํ„ฐ๋ง ์ด์ „ ์ฝ”๋“œ
๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„ ์ฝ”๋“œ

Hits