15์žฅ(JUnit)๊ณผ 16์žฅ(SerialDate Refactoring)์€ ์ฝ”๋“œ๊ฐ€ ๋งŽ๊ณ , ์ง€๋ฐฐ์ ์ธ ๋‚ด์šฉ์ด ์•„๋‹ˆ๋ผ ํŒ๋‹จํ•˜์—ฌ ์ƒ๋žตํ•˜์˜€๋‹ค. 17์žฅ, ๋ƒ„์ƒˆ์™€ ํœด๋ฆฌ์Šคํ‹ฑ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

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

์ฃผ์„

๋ถ€์ ์ ˆํ•œ ์ •๋ณด

Git ์‹œ์Šคํ…œ์— ์ €์žฅํ•  ์ •๋ณด๋Š” ์ฃผ์„์œผ๋กœ ์ ์ ˆ์น˜ ๋ชปํ•˜๋‹ค. ์ฃผ์„์€ ๊ธฐ์ˆ ์ ์ธ ์„ค๋ช…์„ ๋ถ€์—ฐํ•˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค.

์“ธ๋ชจ ์—†๋Š” ์ฃผ์„

์ฃผ์„์€ ๋นจ๋ฆฌ ๋‚ก๋Š”๋‹ค. ์“ธ๋ชจ ์—†์–ด์งˆ ์ฃผ์„์€ ์•„์˜ˆ ๋‹ฌ์ง€ ์•Š๊ณ , ์“ธ๋ชจ ์—†์–ด์ง„ ์ฃผ์„์€ ๋นจ๋ฆฌ ์ œ๊ฑฐํ•œ๋‹ค.

์ค‘๋ณต๋œ ์ฃผ์„

์ฝ”๋“œ๋กœ ์ถฉ๋ถ„ํ•œ๋ฐ๋„ ๊ตฌ๊ตฌ์ ˆ์ ˆ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์€ ์ œ๊ฑฐํ•œ๋‹ค. i++ // i์ฆ๊ฐ€

์„ฑ์˜ ์—†๋Š” ์ฃผ์„

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

์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ

์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๋Š” ํ‰๋ฌผ ๊ทธ ์ž์ฒด๋‹ค. ์ฆ‰๊ฐ ์ง€์›Œ๋ผ. ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด์ „ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค.

ํ™˜๊ฒฝ

์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•œ๋‹ค

๋นŒ๋“œ๋Š” ๊ฐ„๋‹จํžˆ ํ•œ ๋‹จ๊ณ„๋กœ ๋๋‚˜์•ผ ํ•œ๋‹ค.

์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.

๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ•œ ๋ช…๋ น์œผ๋กœ ๋Œ๋ ค์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜

๋„ˆ๋ฌด ๋งŽ์€ ์ธ์ˆ˜

ํ•จ์ˆ˜์—์„œ ์ธ์ˆ˜ ๊ฐœ์ˆ˜๋Š” ์ž‘์„์ˆ˜๋ก ์ข‹๋‹ค. ๋„ท ์ด์ƒ์€ ํ”ผํ•œ๋‹ค.

์ถœ๋ ฅ ์ธ์ˆ˜

์ง๊ด€์„ ์ •๋ฉด์œผ๋กœ ์œ„๋ฐฐํ•œ๋‹ค. ์ธ์ˆ˜๋Š” ์ž…๋ ฅ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜

Boolean ์ธ์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๋ช…๋ฐฑํ•œ ์ฆ๊ฑฐ๋‹ค. ํ”ผํ•ด๋ผ.

์ฃฝ์€ ํ•จ์ˆ˜

์•„๋ฌด๋„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ์‚ญ์ œํ•œ๋‹ค. ์–ด์ฐจํ”ผ Git์ด ๊ธฐ์–ตํ•œ๋‹ค.

์ผ๋ฐ˜

ํ•œ ์†Œ์Šค ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

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

๋‹น์—ฐํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค

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

// String์„ Enum์œผ๋กœ ๋ณ€ํ™˜
Day day = DayDate.StringToDay(String dayName);
  • "Monday"๋ฅผ Day.MONDAY์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒ ์ง€?
  • "Mon"๋ฅผ Day.MONDAY์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒ ์ง€?
  • "monday"๋ฅผ Day.MONDAY์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฒ ์ง€?

๊ฒฝ๊ณ„๋ฅผ ์˜ฌ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค

์Šค์Šค๋กœ์˜ ์ง๊ด€์— ์˜์กดํ•˜์ง€ ๋งˆ๋ผ. ๋ชจ๋“  ๊ฒฝ๊ณ„ ์กฐ๊ฑด์„ ์ฐพ์•„๋„ค๊ณ , ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ผ.

์•ˆ์ „ ์ ˆ์ฐจ ๋ฌด์‹œ

์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ  ๋„๊ธฐ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ œ์ณ๋‘๊ธฐ์™€ ๊ฐ™์€ ํƒœ๋„๋Š” ์ž์นซํ•˜๋ฉด ๋์—†๋Š” ๋””๋ฒ„๊น…์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด๋‹ค.

์ค‘๋ณต

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ทœ์น™์ด๋‹ค. ์ค‘๋ณต์€ ์ถ”์ƒํ™”ํ•  ๊ธฐํšŒ๋‹ค. ์ค‘๋ณต์„ ์—†์• ๋ผ.

  • ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ
  • if/else๋กœ ๋˜‘๊ฐ™์€ ์กฐ๊ฑด์„ ๊ฑฐ๋“ญ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋‹คํ˜•์„ฑ์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์œ ์‚ฌํ•˜๋‚˜, ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
    • Template Method pattern, Strategy pattern

์ถ”์ƒํ™” ์ˆ˜์ค€์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ๋ชปํ•˜๋‹ค

์ถ”์ƒํ™”๋กœ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•  ๋•Œ๋Š” ์ฒ ์ €ํ•ด์•ผ ํ•œ๋‹ค.

  • ๊ณ ์ฐจ์› ๊ฐœ๋…์€ Base Class, ์ €์ฐจ์› ๊ฐœ๋…์€ Derived Class์— ๋„ฃ๋Š”๋‹ค.
  • ์„ธ๋ถ€ ๊ตฌํ˜„๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค์€ ๊ธฐ์ดˆ ํด๋ž˜์Šค์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

๊ธฐ์ดˆ ํด๋ž˜์Šค๊ฐ€ ํŒŒ์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•œ๋‹ค

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

๊ณผ๋„ํ•œ ์ •๋ณด

์ž˜ ์ •์˜๋œ ๋ชจ๋“ˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งค์šฐ ์ž‘๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค.

  • ์ž๋ฃŒ, ์œ ํ‹ธ๋ฆฌํ‹ฐ, ์ƒ์ˆ˜, ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ๋ฅผ ์ˆจ๊ฒจ๋ผ.
  • ์ •๋ณด๋ฅผ ์ œํ•œํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ๋ผ

์ฃฝ์€ ์ฝ”๋“œ

์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” ์ฃฝ์€ ์ฝ”๋“œ๋‹ค.

  • ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๋Š” if๋ฌธ, switch/case๋ฌธ
  • ์‹œ์Šคํ…œ์—์„œ ์ œ๊ฑฐํ•˜๋ผ.

์ˆ˜์ง ๋ถ„๋ฆฌ

๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜์— ๊ฐ€๊น๊ฒŒ ์ •์˜ํ•œ๋‹ค.

  • ์ง€์—ญ๋ณ€์ˆ˜: ์‚ฌ์šฉํ•˜๊ธฐ ์ง์ „์— ์„ ์–ธํ•œ๋‹ค. ์ˆ˜์ง์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ๊ณณ์— ๋ฐฐ์น˜ํ•œ๋‹ค.
  • ๋น„๊ณต๊ฐœ ํ•จ์ˆ˜: ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœํ•œ ์งํ›„์— ์ •์˜ํ•œ๋‹ค.

์ผ๊ด€์„ฑ ๋ถ€์กฑ

์–ด๋–ค ๊ฐœ๋…์„ A ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด, ์œ ์‚ฌ ๊ฐœ๋…๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

์žก๋™์‚ฌ๋‹ˆ

๋น„์–ด์žˆ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ๊ตณ์ด ํ•„์š”์—†๋‹ค. ์žก๋™์‚ฌ๋‹ˆ๋“ค์€ ํ•ญ์ƒ ์ •๋ฆฌํ•œ๋‹ค.

์ธ์œ„์  ๊ฒฐํ•ฉ

๋ฌด๊ด€ํ•œ ๊ฐœ๋…์„ ์ธ์œ„์ ์œผ๋กœ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” enum์€ ํŠน์ • class์— ์†ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.
  • ๋ฒ”์šฉ static ํ•จ์ˆ˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.
  • ์ด๋Š”, ๋‹น์žฅ ํŽธํ•œ ์œ„์น˜์— ๋„ฃ์–ด๋ฒ„๋ฆฐ ๊ฒฐ๊ณผ๋‹ค.

๊ธฐ๋Šฅ ์š•์‹ฌ

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋Š” ์ž๊ธฐ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์„ ํƒ์ž ์ธ์ˆ˜

์„ ํƒ์ž ์ธ์ˆ˜(Bool, enum, Int)๋Š” ํฐ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฟ ํ•จ์ˆ˜๋กœ ์ชผ๊ฐœ์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒŒ์œผ๋ฆ„์˜ ์†Œ์‚ฐ์ด๋‹ค.

  • ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•˜๋ผ.

๋ชจํ˜ธํ•œ ์˜๋„

์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” ์˜๋„๋ฅผ ์ตœ๋Œ€ํ•œ ๋ถ„๋ช…ํžˆ ๋ฐํžŒ๋‹ค.

  • ํ–‰ ๋ฐ”๊พธ๊ธฐ
  • ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ์ด๋ฆ„ ์ •ํ•˜๊ธฐ

์ž˜๋ชป ์ง€์šด ์ฑ…์ž„

์ฝ”๋“œ ๋ฐฐ์น˜๋Š” ์ตœ์†Œ ๋†€๋žŒ์˜ ์›์น™, ์ฆ‰ ๋…์ž๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ธฐ๋Œ€ํ•  ์œ„์น˜์— ๋ฐฐ์น˜ํ•œ๋‹ค.

๋ถ€์ ์ ˆํ•œ static ํ•จ์ˆ˜

์ธ์Šคํ„ด์Šค์™€ ์ •๋ง ๋ฌด๊ด€ํ•œ ๊ฒฝ์šฐ์— static ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. ์ธ์Šคํ„ด์Šค์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

์„œ์ˆ ์  ๋ณ€์ˆ˜

๊ณ„์‚ฐ์„ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์„œ์ˆ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋ผ.

  • ๋งŽ์„ ์ˆ˜๋ก ์ข‹๋‹ค.

์ด๋ฆ„๊ณผ ๊ธฐ๋Šฅ์ด ์ผ์น˜ํ•˜๋Š” ํ•จ์ˆ˜

์ด๋ฆ„๋งŒ์œผ๋กœ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•„ ๊ตฌํ˜„์„ ์‚ดํŽด์•ผ ํ•œ๋‹ค๋ฉด, ์ข‹์€ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ๋” ์ด๋ฆ„์„ ๋ถ™์ด๊ธฐ ์‰ฝ๋„๋ก ์ •๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

Date newDate = date.add(5);
  • 5์ผ์„ ๋”ํ•˜๋Š” ๊ฑด๊ฐ€?
  • 5์ฃผ? 5์‹œ๊ฐ„?
  • ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฑด๊ฐ€?
  • ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑด๊ฐ€?
  • addDaysTo, datsLater์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์˜๋„๋ฅผ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•˜๋ผ

๊ตฌํ˜„์ด ๋๋‚ฌ๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์ „์—, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™•์‹คํžˆ ์ดํ•ดํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

๋…ผ๋ฆฌ์  ์˜์กด์„ฑ์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ด๋ผ

์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ์ด ์ƒ๋Œ€ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•˜๋ผ.

If/Else ํ˜น์€ Switch/Case ๋ฌธ๋ณด๋‹ค ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜๋ผ

switch๋ฌธ์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋‹น์žฅ ์‰ฌ์šด ์„ ํƒ์ด๋ผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ˆ˜์ •ํ•˜๋ ค๋ฉด switch ๋ฌธ์„ ๋ชจ๋‘ ๋ด์•ผ ํ•œ๋‹ค.

ํ‘œ์ค€ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅด๋ผ

์—…๊ณ„ ํ‘œ์ค€๊ณผ ํŒ€์ด ์ •ํ•œ ํ‘œ์ค€์„ ๋”ฐ๋ฅธ๋‹ค.

  • ์—…๊ณ„ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ์„ค๋ช…์ด ํ•„์š”์—†์ด ์ฝ”๋“œ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค.
  • ํŒ€์ด ์ •ํ•œ ํ‘œ์ค€์˜ ๊ฒฝ์šฐ, ํŒ€์› ๋ชจ๋‘๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

๋งค์ง ์ˆซ์ž๋Š” ๋ช…๋ช…๋œ ์ƒ์ˆ˜๋กœ ๊ต์ฒดํ•˜๋ผ

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ์—์„œ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด๋ผ.

์ •ํ™•ํ•˜๋ผ

์ฝ”๋“œ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ๋Š” ์ •ํ™•ํžˆ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ์ด์œ ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์„ ๋ถ„๋ช…ํžˆ ์ดํ•ดํ•ด๋ผ.

๊ด€๋ก€๋ณด๋‹ค ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

์„ค์ •์„ ๊ฐ•์ œ ํ•  ๋•Œ๋Š” ๊ตฌ์กฐ ์ž์ฒด๋กœ ๊ฐ•์ œํ•˜๋ผ. ๊ธฐ์ดˆ ํด๋ž˜์Šค๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค.

์กฐ๊ฑด์„ ์บก์Šํ™”ํ•˜๋ผ

Bool ๋…ผ๋ฆฌ๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์บก์Šํ™”ํ•˜์—ฌ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜๋ผ.

if (shouldBeDeleted(timer)) โœ…
 
if (timer.hasExpired() && !timer.isRecurrent()) โŽ

๋ถ€์ • ์กฐ๊ฑด์€ ํ”ผํ•˜๋ผ

๋ถ€์ • ์กฐ๊ฑด์€ ๊ธ์ • ์กฐ๊ฑด๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

if (buffer.shouldCompact()) โœ…
 
if (!buffer.shouldNotCompact()) โŽ

ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด์•ผ ํ•œ๋‹ค

์—ฌ๋Ÿฟ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ชผ๊ฐœ๋ผ.

์ˆจ๊ฒจ์ง„ ์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ†ตํ•ด ์‹œ๊ฐ„์  ๊ฒฐํ•ฉ์„ ๋“œ๋Ÿฌ๋‚ด๋ผ.

public void dive(String reason) {
    satuateGradient();
    reticulateSplines();
    diveForMoog(reason);
}
public void dive(String reason) {
    Gradient gradient = saturateGradient();
    List<Spline> splines = reticulateSplines(gradient);
    diveForMoog(splines, reason);
}
  • ์•„๋ž˜์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ผ

์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์žก์„ ๋•Œ๋Š” ์ด์œ ๋ฅผ ๊ณ ๋ฏผํ•˜๋ผ.

๊ฒฝ๊ณ„ ์กฐ๊ฑด์„ ์บก์Šํ™”ํ•˜๋ผ

๊ฒฝ๊ณ„ ์กฐ๊ฑด์€ ๋นผ๋จน๊ฑฐ๋‚˜ ๋†“์น˜๊ธฐ ์‹ญ์ƒ์ด๋‹ค. ํ•œ๊ณณ์—์„œ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋ผ.

ํ•จ์ˆ˜๋Š” ์ถ”์ƒ์  ์ˆ˜์ค€์„ ํ•œ ๋‹จ๊ณ„๋งŒ ๋‚ด๋ ค๊ฐ€์•ผ ํ•œ๋‹ค

ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ฌธ์žฅ์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

  • ์ถ”์ƒํ™” ์ˆ˜์ค€ ๋ถ„๋ฆฌ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋‹ค.

์„ค์ • ์ •๋ณด๋Š” ์ตœ์ƒ์œ„ ๋‹จ๊ณ„์— ๋‘ฌ๋ผ

๊ธฐ๋ณธ๊ฐ’ ์ƒ์ˆ˜๋‚˜, ์„ค์ • ๊ด€๋ จ ์ƒ์ˆ˜๋ฅผ ์ €์ฐจ์› ํ•จ์ˆ˜์— ์ˆจ๊ฒจ์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ถ”์ด์  ํƒ์ƒ‰์„ ํ”ผํ•˜๋ผ

์ถ”์ด์  ๊ด€๊ณ„: ์›์†Œ์˜ ์›์†Œ๋ฅผ ์›์†Œ๋กœ ํ•˜๋Š” ์ง‘ํ•ฉ.

  • A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , B๊ฐ€ C๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ A๊ฐ€ C๋ฅผ ์•Œํ•„์š”๋Š” ์—†๋‹ค.

๋””๋ฏธํ„ฐ์˜ ๋ฒ•์น™: ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ๋งŒ ์•Œ์•„์•ผ ํ•œ๋‹ค.

  • ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์ด ๋‚ด๊ฒŒ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฆ„

์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

์†Œํ”„ํŠธ์›จ์–ด ๊ฐ€๋…์„ฑ์˜ 90%์€ ์ด๋ฆ„์ด ๊ฒฐ์ •ํ•œ๋‹ค.

์ ์ ˆํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€์—์„œ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋ผ

๊ตฌํ˜„์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ด๋ฆ„์€ ํ”ผํ•˜๋ผ.

public interface Modem {
    boolean dial(String phoneNumber);
    boolean disconnect(); 
}
  • ์ „ํ™”์„ ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Modem์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ๋‹ค.
public interface Modem {
    boolean connect(String connectionLocator);
    boolean disconnect(); 
}
  • ์ผ€์ด๋ธ”์„ ํ†ตํ•œ Modem์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€๋ชจํ–ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ‘œ์ค€ ๋ช…๋ช…๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ผ

๋””์ž์ธ ํŒจํ„ด์€ ์‰ฌ์šด ์˜์‚ฌ์†Œํ†ต์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ด๋‹ค. ์ด๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋ผ.

๋ช…ํ™•ํ•œ ์ด๋ฆ„

๊ธธ๋”๋ผ๋„ ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์ด๋ผ๋ฉด ๊ทธ ๋‹จ์ ์„ ๋ชจ๋‘ ๋ณด์™„ํ•œ๋‹ค.

๊ธด ๋ฒ”์œ„๋Š” ๊ธด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ

์ด๋ฆ„์ด ์งง์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋Š” ๋ฒ”์œ„๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์˜๋ฏธ๋ฅผ ์žƒ๋Š”๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ์งง๋‹ค๋ฉด ์งง์€ ๋ณ€์ˆ˜๋„ ์ข‹์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. (for i in ~)

์ธ์ฝ”๋”ฉ์„ ํ”ผํ•˜๋ผ

ํ—๊ฐ€๋ฆฌ์•ˆ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. (m_, vis_)

์ด๋ฆ„์œผ๋กœ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๋ผ

์ด๋ฆ„์— ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

public ObjectOutputStream getOos() throws IOException {
    if (m_oos == null) {
        m_oos = new ObjectOutputStream(m_socket.getOutputStream());
    }
    return m_oos;
}
  • ๋‹จ์ˆœํžˆ oos๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • oos๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•œ๋‹ค.
  • createOrReturnOos๊ฐ€ ๋ณด๋‹ค ์ข‹๋‹ค.

ํ…Œ์ŠคํŠธ

๋ถˆ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ

์ž ์žฌ์ ์œผ๋กœ ๊นจ์งˆ๋งŒํ•œ ๋ถ€๋ถ„์„ ๋ชจ๋‘ ํ…Œ์ŠคํŠธํ•œ๋‹ค.

์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋น ๋œจ๋ฆฌ๋Š” ๊ณต๋ฐฑ์„ ์•Œ๋ ค์ค€๋‹ค.

์‚ฌ์†Œํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์ง€ ๋งˆ๋ผ

์‚ฌ์†Œํ•œ ํ…Œ์ŠคํŠธ๋Š” ์งœ๊ธฐ ์‰ฝ๋‹ค. ์‰ฌ์šด๋ฐ ๊ฑด๋„ˆ๋›ฐ์ง€ ๋งˆ๋ผ.

๋ฌด์‹œํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ชจํ˜ธํ•จ์„ ๋œปํ•œ๋‹ค

์š”๊ตฌ์‚ฌํ•ญ์ด ๋ถˆ๋ถ„๋ช…ํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์‹ ํ˜ธ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๊ฒฝ๊ณ„์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธํ•˜๋ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ค‘์•™ ์กฐ๊ฑด์€ ์˜ฌ๋ฐ”๋กœ ์งœ๋†“๊ณ  ๊ฒฝ๊ณ„ ์กฐ๊ฑด์—์„œ ์‹ค์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•˜๋‹ค.

๋ฒ„๊ทธ ์ฃผ๋ณ€์€ ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜๋ผ

๋ฒ„๊ทธ๋Š” ์„œ๋กœ ๋ชจ์ด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค. ๋ฐœ๊ฒฌํ•œ ๊ณณ ์ฃผ๋ณ€์„ ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜๋ผ.

์‹คํŒจ ํŒจํ„ด์„ ์‚ดํŽด๋ผ

๋•Œ๋กœ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํŒจํ„ด์„ ์‚ดํŽด๋ผ

ํ†ต๊ณผํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ, ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋Š” ๋นจ๋ผ์•ผ ํ•œ๋‹ค

๋Š๋ฆฐ ํ…Œ์ŠคํŠธ๋Š” ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋Œ์•„๊ฐ€๋„๋ก ํ•˜๋ผ.

๊ฒฐ๋ก 

  • ์ด ๋ชจ๋“  ๋ชฉ๋ก์€, ์ด์ „์— ๋งํ–ˆ๋˜ ๊ฐ€์น˜ ์ฒด๊ณ„๋ฅผ ํ”ผ๋ ฅํ•  ๋ฟ์ด๋‹ค.
  • ์žฅ์ธ ์ •์‹ ๊ณผ ์ „๋ฌธ๊ฐ€ ์ •์‹ ์„ ๊ฐ€์ง€๊ณ  ์ดํ–‰ํ•˜๋ผ.

Reference