๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 10: ์ƒ์†๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

๐Ÿ“š ์ƒ์†๊ณผ ์ค‘๋ณต ์ฝ”๋“œโ€‹

๐ŸŽˆ DRY ์›์น™โ€‹

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

DRY ์›์น™์€ ๋ชจ๋“  ์ง€์‹์€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋‹จ์ผํ•˜๊ณ , ์• ๋งคํ•˜์ง€ ์•Š๊ณ , ์ •๋ง๋กœ ๋ฏฟ์„ ๋งŒํ•œ ํ‘œํ˜„ ์–‘์‹์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

  • DRY ์›์น™์€ ํ•œ ๋ฒˆ, ๋‹จ ํ•œ ๋ฒˆ(Once and Only Onc) ์›์น™ ๋˜๋Š” ๋‹จ์ผ ์ง€์  ์ œ์–ด(Single Point Control) ์›์น™์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

๐ŸŽˆ ์ค‘๋ณต๊ณผ ๋ณ€๊ฒฝโ€‹

๐Ÿถ ์ค‘๋ณต ์ฝ”๋“œ ์‚ดํŽด๋ณด๊ธฐโ€‹

  • ์˜ˆ์ œ ์ƒ๋žต.
  • ์ฑ… 310 ~ 313 ํŽ˜์ด์ง€ ์ฐธ๊ณ 

๐Ÿถ ์ค‘๋ณต ์ฝ”๋“œ ์ˆ˜์ €์•„๊ธฐโ€‹

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

๐Ÿถ ํƒ€์ž… ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐโ€‹

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

๐ŸŽˆ ์ƒ์†์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐํ•˜๊ธฐโ€‹

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

๐Ÿ“š ์ทจ์•ฝํ•œ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค ๋ฌธ์ œโ€‹

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

๐ŸŽˆ ๋ถˆํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์† ๋ฌธ์ œโ€‹

  • ์ž๋ฐ”์˜ ์ดˆ๊ธฐ ๋ฒ„์ „์—์„œ ์ƒ์†์„ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋Š” java.util.Properties์™€ java.util.Stack์ด๋‹ค. ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ทœ์น™์ด ์œ„๋ฐ˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ž๋ฐ”์˜ ์ดˆ๊ธฐ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ์ž๋“ค์€ ์š”์†Œ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ ์˜คํผ๋ ˆ์ด์…˜์„ ์ œ๊ณตํ•˜๋Š” Vector๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Stack์„ Vector์˜ ์ž์‹ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • Stack์ด Vector๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— Stack์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์— Vector ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•ฉ์ณ์ง„๋‹ค. ๋”ฐ๋ผ์„œ Vector์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž„์˜์˜ ์œ„์น˜์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Stack์˜ ๊ทœ์น™์„ ์‰ฝ๊ฒŒ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
Stack<String> stack = new Stack<>();
stack.push("1st");
stack.push("2nd");
stack.push("3rd");

stack.add(0, "4th");

assertEquals("4th", stack.pop()); // error! ๋ฐ˜ํ™˜๊ฐ’์€ "3rd"
  • ๋ฌธ์ œ์˜ ์›์ธ์€ Vector์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๊นŒ์ง€๋„ ํ•จ๊ป˜ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ƒ์†์„ ์œ„ํ•œ ๊ฒฝ๊ณ  2
    ์ƒ์†๋ฐ›์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๊นจํŠธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽˆ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ค์ž‘์šฉ ๋ฌธ์ œโ€‹

  • InstrumentHashSet์€ HashSet์˜ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์š”์†Œ์˜ ์ˆ˜๋ฅผ ์…€ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ํด๋ž˜์Šค๋กœ์„œ HashSet์˜ ์ž์‹ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋ผ ์žˆ๋‹ค.
public class InstrumentHashSet<E> extends HashSet<E> {
private int addCount = 0; // ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋ก

@Override
public boolean add(E e) { // ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
addCount++;

return super.add(e);
}

@Override
public boolean addAll(Collection<? extends E> c) { // ๋‹ค์ˆ˜์˜ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€
addCount += c.size();

return super.addAll(c);
}
}
  • InstrumentHashSet์˜ ๊ตฌํ˜„์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ฌ๋ผ์ง„๋‹ค.
InstrumentHashSet<String> languages = new InstrumentHashSet<>();
languages.addAll(Arrays.asList("Java", "Ruby", "Scala"));
  • ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด addCount์˜ ๊ฐ’์ด 3์ผ ๋  ๊ฑฐ๋ผ ์˜ˆ์ƒํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์‹คํ–‰ํ•œ ํ›„์˜ addCount์˜ ๊ฐ’์€ 6์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ HashSet์˜ addAll ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ add ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ InstrumentHashSet์˜ addAll์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ• ์—ญ์‹œ ๋‚˜์ค‘์— HashSet์˜ addAll ๋ฉ”์„œ๋“œ๊ฐ€ add ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •๋œ๋‹ค๋ฉด addAll ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ถ”๊ฐ€๋˜๋Š” ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์นด์šดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ InstrumentHashSet์˜ addAll ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๊ณ  ์ถ”๊ฐ€๋˜๋Š” ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ add ๋ฉ”์‹œ์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
public class InstrumentHashSet<E> extends HashSet<E> {
private int addCount = 0;

@Override
public boolean add(E e) {
addCount++;

return super.add(e);
}

@Override
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;

for(E e : c)
if(add(e))
modified = true;
return modified;
}
}
  • ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•๋„ ์˜ค๋ฐ”๋ฆฌ์ด๋”ฉ๋œ addAll ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์ด HashSet์˜ ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ์ ์— ๋ฏธ๋ž˜์— ๋ฐœ์ƒํ• ์ง€ ๋ชจ๋ฅด๋Š” ์œ„ํ—˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต์‹œํ‚จ ๊ฒƒ์ด๋‹ค.
  • ์ƒ์†์„ ์œ„ํ•œ ๊ฒฝ์šฐ 3
    ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๊ฒฝ์šฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽˆ ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค์˜ ๋™์‹œ ์ˆ˜์ • ๋ฌธ์ œโ€‹

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

๐Ÿ“š Phone ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ธฐโ€‹

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

๐ŸŽˆ ์ถ”์ƒํ™”์— ์˜์กดํ•˜์žโ€‹

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

๐ŸŽˆ ์ฐจ์ด๋ฅผ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•˜๋ผโ€‹

  • ์ค‘๋ณต ์ฝ”๋“œ ์•ˆ์—์„œ ์ฐจ์ด์ ์„ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ”ํžˆ ๋งํ•˜๋Š” ๋ณ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ถ„๋ฆฌํ•˜๋ผ. ๋˜๋Š” *๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๊ณ  ์ด๋ฅผ ์บก์Šํ™”ํ•˜๋ผ.*๋ผ๋Š” ์กฐ์–ธ์„ ๋ฉ”์„œ๋“œ ์ˆ˜์ค€์—์„œ ์ ์šฉํ•œ ๊ฒƒ์ด๋‹ค.
public class Phone {
// ...
public Money calculateFee() {
Money result = Money.ZERO;

for(Call call : calls) {
result = result.plus(calculateCallFee(call));
}

return result;
}

private Money calculateCallFee(Call call) {
return amount.times(call.getDuration().getSeconds() / seconds.getSeconds());
}
}
  • NightDiscountPhone์˜ ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
public class NightDiscountPhone {
// ...
public Money calculateFee() {
Money result = Money.ZERO;

for(Call call : calls) {
result = result.plus(calculateCallFee(call));
}

return result;
}

private Money calculateCallFee(Call call) {
if(call.getFrom().getHour() >= LATE_NIGHT_HOUR) {
return nightlyAmount.times(call.getDuration().getSeconds() / seconds.getSeconds());
} else {
return regularAmount.times(call.getDuration().getSeconds() / seconds.getSeconds());
}
}
}
  • ๋‘ ํด๋ž˜์Šค์˜ calculateFee ๋ฉ”์„œ๋“œ๋Š” ์™„์ „ํžˆ ๋™์ผํ•ด์กŒ๊ณ  ์ถ”์ถœํ•œ calculateCallFee ๋ฉ”์„œ๋“œ ์•ˆ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๋†“์•˜๋‹ค.

๐ŸŽˆ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์˜ฌ๋ ค๋ผโ€‹

  • ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค.
public abstract class AbstractPhone {}

public class Phone extends AbstractPhone {...}

public class NightDiscountPhone extends AbstractPhone {...}
  • ์ด์ œ ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†น ๋ถ€๋ถ„์„ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์˜ฎ๊ธธ ๋•Œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ณด๋‹ค ๋ฉ”์„œ๋“œ๋ฅผ ๋จผ์ € ์ด๋™์‹œํ‚จ๋‹ค.
public abstract class AbstractPhone {
private List<Call> calls = new ArrayList<>();

public Money calculateFee() {
Money result = Money.ZERO;

for(Call call : calls) {
result = result.plus(calculateCallFee(call));
}

return result;
}

abstract protected Money calculateCallFee(Call call);
}
  • ์ด์ œ ๋‘ ํด๋ž˜์Šค์— calculateFee์— ๊ด€๋ จ๋œ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋‹ค.
public class Phone extends AbstractPhone {
// ...

@Override
protected Money calculateCallFee(Call call) {
return amount.times(call.getDuration().getSeconds() / seconds.getSeconds());
}
}

public class NightDiscountPhone extends AbstractPhone {
// ...

@Override
protected Money calculateCallFee(Call call) {
if(call.getFrom().getHour() >= LATE_NIGHT_HOUR) {
return nightlyAmount.times(call.getDuration().getSeconds() / seconds.getSeconds());
} else {
return regularAmount.times(call.getDuration().getSeconds() / seconds.getSeconds());
}
}
}
  • ์ด์ œ ์šฐ๋ฆฌ์˜ ์„ค๊ณ„๋Š” ์ถ”์ƒํ™”์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

๐ŸŽˆ ์ถ”์ƒํ™”๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.โ€‹

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

๐ŸŽˆ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ด๋ฆ„ ์„ ํƒํ•˜๊ธฐโ€‹

  • ํ•œ ๊ฐ€์ง€ ์•„์‰ฌ์šด ์ €์€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
public abstract class Phone {...}

public class RegularPhone extends Phone {...}

public class NightDiscountPhone extends Phone {...}

๐ŸŽˆ ์„ธ๊ธˆ ์ถ”๊ฐ€ํ•˜๊ธฐโ€‹

  • ์„ธ๊ธˆ์€ ๋ชจ๋“  ์š”๊ธˆ์ œ์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋ผ์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ณตํ†ต ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ธ Phone์„ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ์ž์‹ ํด๋ž˜์Šค ๊ฐ„์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
public abstract class Phone {
private double taxRate;
private List<Call> calls = new ArrayList<>();

public Phone(double taxRate) {
this.taxRate = taxRate;
}

public Money calculateFee() {
Money result = Money.ZERO;

for(Call call : calls) {
result = result.plus(calculateCallFee(call));
}

return result.plus(result.times(taxRate));
}

abstract protected Money calculateCallFee(Call call);
}
  • ํ•˜์ง€๋งŒ, Phone ์ž์‹ ํด๋ž˜์Šค์ธ RegularPhone๊ณผ NightDiscountPhone์˜ ์ƒ์„ฑ์ž ์—ญ์‹œ taxRate๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
public class RegularPhone extends Phone {
//...
public RegularPhone (Money amount, Duration seconds, double taxRate) {
super(taxRate);
// ...
}
// ...
}

public class NightDiscountPhone extends Phone {
//...
public NightDiscountPhone (Money nightlyAmount, Money regularAmount, Duration seconds, double taxRate) {
super(taxRate);
// ...
}
// ...
}
  • ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์ƒ์†์€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•œ ํ–‰๋™๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ ๊ฒฐํ•ฉ๋˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฑ…์ž„์„ ์•„๋ฌด๋ฆฌ ์ž˜ ๋ถ„๋ฆฌํ•˜๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ถ”๊ฐ€๋Š” ์ข…์ข… ์ƒ์† ๊ณ„์ธต ์ „๋ฐ˜์— ๊ฑธ์นœ ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋‘ ํด๋ž˜์Šค์— ๋™์ผํ•œ ์„ธ๊ธˆ ๊ณ„์‚ฐ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณต์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํ˜„๋ช…ํ•œ ์„ ํƒ์ด๋‹ค.
  • ์ƒ์†์œผ๋กœ ์ธํ•œ ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ์ƒ์†์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๊ฒฐํ•ฉ์‹œํ‚จ๋‹ค. ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ฒฐํ•ฉ์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์–ด๋Š ์ •๋„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ๊ฒฐํ•ฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.

๐Ÿ“š ์ฐจ์ด์— ์˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€‹

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