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

๐Ÿญ Chapter 3: ํ•จ์ˆ˜

๐ŸŽƒ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ!โ€‹

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ฒซ์งธ ๊ทœ์น™์€ "์ž‘๊ฒŒ!" ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋‘˜์งธ ๊ทœ์น™์€ "๋” ์ž‘๊ฒŒ!" ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์˜ค๋žœ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‚˜๋Š” ์ž‘์€ ํ•จ์ˆ˜๊ฐ€ ์ข‹๋‹ค๊ณ  ํ™•์‹ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ์งง์•„์•ผ ์ข‹์„๊นŒ?

๐ŸŽˆ ๋ธ”๋ก๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐโ€‹

๋‹ค์‹œ ๋งํ•ด, if๋ฌธ / else๋ฌธ / while๋ฌธ ๋“ฑ์— ๋“ค์–ด๊ฐ€๋Š” ๋ธ”๋ก์€ ํ•œ ์ค„์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋Œ€๊ฒŒ ๊ฑฐ๊ธฐ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ”๊นฅ์„ ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž‘์•„์งˆ ๋ฟ ์•„๋‹ˆ๋ผ, ๋ธ”๋ก ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ ์ ˆํžˆ ์ง“๋Š”๋‹ค๋ฉด, ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์ง„๋‹ค.

์ด ๋ง์€ ์ค‘์ฒฉ ๊ตฌ์กฐ๊ฐ€ ์ƒ๊ธธ๋งŒํผ ํ•จ์ˆ˜๊ฐ€ ์ปค์ ธ์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•จ์ˆ˜์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์€ 1๋‹จ์ด๋‚˜ 2๋‹จ์„ ๋„˜์–ด์„œ๋ฉด ์•ˆ ๋œ๋‹ค. ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ, ๊ทธ๋ž˜์•ผ ํ•จ์ˆ˜๋ฅผ ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๐ŸŽƒ ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!โ€‹

๋‹ค์Œ์€ ์ง€๋‚œ 30์—ฌ๋…„ ๋™์•ˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค์–‘ํ•œ ํฌํ˜„์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ ์ฃผ์–ด์ง„ ์ถฉ๊ณ ๋‹ค.

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

์ด ์ถฉ๊ณ ์—์„œ ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ ํ•œ ๊ฐ€์ง€๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ์ ์ด๋‹ค.

public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}

์œ„ ์ฝ”๋“œ์—์„œ ์„ธ ๊ฐ€์ง€๋ฅผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ํŽ˜์ด์ง€๊ฐ€ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€์ธ์ง€ ํŒ๋‹จํ•œ๋‹ค.
  2. ๊ทธ๋ ‡๋‹ค๋ฉด ์„ค์ • ํŽ˜์ด์ง€์™€ ํ•ด์ฒด ํŽ˜์ด์ง€๋ฅผ ๋„ฃ๋Š”๋‹ค.
  3. ํŽ˜์ด์ง€๋ฅผ HTML๋กœ ๋ Œ๋”๋งํ•œ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ์„ธ ๋‹จ๊ณ„๋Š” ์ง€์ •๋œ ํ•จ์ˆ˜ ์ด๋ฆ„ ์•„๋ž˜์„œ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•˜๋‚˜๋‹ค. ํ•จ์ˆ˜๋Š” ๊ฐ„๋‹จํ•œ TO๋ฌธ๋‹จ์œผ๋กœ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

TO RenderPageWithSetupsAndTeardowns, ํŽ˜์ด์ง€๊ฐ€ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€์ธ์ง€ ํ™•์ธํ•œ ํ›„ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€๋ผ๋ฉด ์„ค์ • ํŽ˜์ด์ง€์™€ ํ•ด์ฒด ํŽ˜์ด์ง€๋ฅผ ๋„ฃ๋Š”๋‹ค. ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€๋“  ์•„๋‹ˆ๋“  ํŽ˜์ด์ง€๋ฅผ HTML๋กœ ๋ Œ๋”๋งํ•œ๋‹ค.

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

์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์œ„ ์ฝ”๋“œ๋ฅผ ๋” ์ด์ƒ ์ค„์ด๊ธฐ๋ž€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. if๋ฌธ์„ includeSetupsTeardownsIfTestPate๋ผ๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค๋ฉด ๋˜‘๊ฐ™์€ ๋‚ด์šฉ์„ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•  ๋ฟ ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€๋งŒ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ๋” ์žˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ํ‘œํ˜„์ด ์•„๋‹ˆ๋ผ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋Š” ์…ˆ์ด๋‹ค.

๐ŸŽƒ ํ•จ์ˆ˜ ๋‹น ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ํ•˜๋‚˜๋กœ!โ€‹

ํ•จ์ˆ˜๊ฐ€ ํ™•์‹คํžˆ ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ฌธ์žฅ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

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

๐ŸŽˆ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ ์ฝ๊ธฐ: ๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™โ€‹

์ฝ”๋“œ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์ฝํ˜€์•ผ ์ข‹๋‹ค. ํ•œ ํ•จ์ˆ˜ ๋‹ค์Œ์—๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์€ ํ•จ์ˆ˜๊ฐ€ ์˜จ๋‹ค. ์ฆ‰, ์œ„์—์„œ ์•„๋ž˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ์œผ๋ฉด ํ•จ์ˆ˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ๋‚ฎ์•„์ง„๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์ผ๋ จ์˜ TO ๋ฌธ๋‹จ์„ ์ฝ๋“ฏ์ด ํ”„๋กœ๊ทธ๋žจ์ด ์ฝํ˜€์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ TO ๋ฌธ๋‹จ์€ ํ˜„์žฌ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์„ค๋ช…ํ•˜๋ฉฐ ์ด์–ด์ง€๋Š” ์•„๋ž˜ ๋‹จ๊ณ„ TO ๋ฌธ๋‹จ์„ ์ฐธ๊ณ ํ•œ๋‹ค.

  • TO ์„ค์ • ํŽ˜์ด์ง€์™€ ํ•ด์ฒด ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด, ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•˜๊ณ , ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ , ํ•ด์ฒด ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • TO ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด, ์ŠˆํŠธ์ด๋ฉด ์ŠˆํŠธ ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ ํ›„ ์ผ๋ฐ˜ ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • TO ์ŠˆํŠธ ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด, ๋ถ€๋ชจ ๊ณ„์ธต์—์„œ "SuiteSetUp" ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„ include ๋ฌธ๊ณผ ํŽ˜์ด์ง€ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • TO ๋ถ€๋ชจ ๊ณ„์ธต์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด, ...

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

๐ŸŽƒ Switch ๋ฌธโ€‹

switch๋ฌธ์€ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค. case ๋ถ„๊ธฐ๊ฐ€ ๋‹จ ๋‘ ๊ฐœ์ธ switch๋ฌธ๋„ ๋‚ด ์ทจ์–‘์—๋Š” ๋„ˆ๋ฌด ๊ธธ๋ฉฐ, ๋‹จ์ผ ๋ธ”๋ก์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์„ ํ˜ธํ•œ๋‹ค. ๋˜ํ•œ "ํ•œ ๊ฐ€์ง€" ์ž‘์—…๋งŒ ํ•˜๋Š” switch ๋ฌธ๋„ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ switch ๋ฌธ์€ N๊ฐ€์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ switch ๋ฌธ์„ ์™„์ „ํžˆ ํ”ผํ•  ๋ฐฉ๋ฒ•์€ ์žˆ๋‹ค. ๋ฌผ๋ก  ๋‹คํ˜•์„ฑ(polymorphism)์„ ์ด์šฉํ•œ๋‹ค.

public Money calculatePay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}

์œ„ ํ•จ์ˆ˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ฒซ์งธ, ํ•จ์ˆ˜๊ฐ€ ๊ธธ๋‹ค. ์ƒˆ ์ง์› ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ๊ธธ์–ด์ง„๋‹ค. ๋‘˜์งธ, "ํ•œ ๊ฐ€์ง€" ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ธ์งธ, SRP(Single Responsibility Principle, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™)๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ์—ฌ๋Ÿฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋„ค์งธ, OCP(Open Closed Principle, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ƒˆ ์ง์› ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์•„๋งˆ ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ผ๋ฉด ์œ„ ํ•จ์ˆ˜๊ฐ€ ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฌดํ•œ์ • ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

isPayDay(Employee e, Date date);

ํ˜น์€

deliverPay(Employee e, Money pay);

๊ฐ€๋Šฅ์„ฑ์€ ๋ฌดํ•œํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋‘๊ฐ€ ๋˜‘๊ฐ™์ด ์œ ํ•ดํ•œ ๊ตฌ์กฐ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ ์ฝ”๋“œ๋‹ค. ๋ฌธ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(ABSTRACT FACTORY)์— ๊ฝ๊ฝ ์ˆจ๊ธด๋‹ค. ์•„๋ฌด์—๊ฒŒ๋„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค. ํŒฉํ† ๋ฆฌ๋Š” switch ๋ฌธ์„ ์‚ฌ์˜นํ•ด ์ ์ ˆํ•œ Employee ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑํ•œ๋‹ค. calculatePay, isPayDay, deliverPay ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” Employee ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑฐ์ณ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹คํ˜•์„ฑ์œผ๋กœ ์ธํ•ด ์‹ค์ œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

public abstract class Employee {
public abstract boolean isPayDay();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}

public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}

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

๐ŸŽƒ ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ!โ€‹

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

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

์ด๋ฆ„์„ ์ •ํ•˜๋Š๋ผ ์‹œ๊ฐ„์„ ๋“ค์—ฌ๋„ ๊ดœ์ฐฎ๋‹ค. ์ด๋Ÿฐ์ €๋Ÿฐ ์ด๋ฆ„์„ ๋„ฃ์–ด ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด ๋” ์ข‹๋‹ค. ์ด๋Ÿฐ์ €๋Ÿฐ ์ด๋ฆ„์„ ์‹œ๋„ํ•œ ํ›„ ์ตœ๋Œ€ํ•œ ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ๊ณจ๋ผ๋„ ์ข‹๊ฒ ๋‹ค.

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

์ด๋ฆ„์„ ๋ถ™์ผ ๋•Œ๋Š” ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ชจ๋“ˆ ๋‚ด์—์„œ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๊ฐ™์€ ๋ฌธ๊ตฌ, ๋ช…์‚ฌ, ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. includeSetupAndTeardownPages, includeSetupPages, includeSuiteSetupPage, includeSetupPage ๋“ฑ์ด ์ข‹์€ ์˜ˆ๋‹ค. ๋ฌธ์ฒด๊ฐ€ ๋น„์Šทํ•˜๋ฉด ์ด์•ผ๊ธฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ’€์–ด๊ฐ€๊ธฐ๋„ ์‰ฌ์›Œ์ง„๋‹ค.

๐ŸŽƒ ํ•จ์ˆ˜ ์ธ์ˆ˜โ€‹

ํ•จ์ˆ˜์—์„œ ์ด์ƒ์ ์ธ ์ธ์ˆ˜ ๊ฐœ์ˆ˜๋Š” 0๊ฐœ(๋ฌดํ•ญ)๋‹ค. ๋‹ค์Œ์€ 1๊ฐœ(๋‹จํ•ญ)๊ณ , ๋‹ค์Œ์€ 2๊ฐœ(์ดํ•ญ)๋‹ค. 3๊ฐœ(์‚ผํ•ญ)๋Š” ๊ฐ€๋Šฅํ•œ ํ”ผํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค. 4๊ฐœ ์ด์ƒ(๋‹คํ•ญ)์€ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์–ด๋„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

์ธ์ˆ˜๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์šฐ๋ฆฌ ์˜ˆ์ œ์—์„œ ์ธ์ˆ˜๋ฅผ ๊ฑฐ์˜ ์—†์•ค ์ด์œ ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” includeSetupPageInfo(newPageContent)๋ณด๋‹ค includeSetupPage()๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฝ๋‹ค. includeSetupPageInto(newPageContent)๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ์ธ์ˆ˜ ์‚ฌ์ด์— ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ํ˜„ ์‹œ์ ์—์„œ ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์„ธ๋ถ€์‚ฌํ•ญ, ์ฆ‰ StringBuffer๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

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

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

์ตœ์„ ์€ ์ž…๋ ฅ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ, ์ฐจ์„ ์€ ์ž…๋ ฅ ์ธ์ˆ˜๊ฐ€ 1๊ฐœ๋ฟ์ธ ๊ฒฝ์šฐ๋‹ค. SetupTeardownIncluder.render(pageData)๋Š” ์ดํ•ดํ•˜๊ธฐ ์•„์ฃผ ์‰ฝ๋‹ค. pageData ๊ฐ์ฒด ๋‚ด์šฉ์„ ๋ Œ๋”๋งํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

๐ŸŽˆ ๋งŽ์ด ์“ฐ๋Š” ๋‹จํ•ญ ํ˜•์‹โ€‹

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

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

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋‹จํ•ญ ํ•จ์ˆ˜๋Š” ๊ฐ€๊ธ‰์  ํ”ผํ•œ๋‹ค.

๐ŸŽˆ ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜โ€‹

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

๐ŸŽˆ ์ดํ•ญ ํ•จ์ˆ˜โ€‹

์ธ์ˆ˜๊ฐ€ 2๊ฐœ์ธ ํ•จ์ˆ˜๋Š” ์ธ์ˆ˜๊ฐ€ 1๊ฐœ์ธ ํ•จ์ˆ˜๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, writeField(name)๋Š” writeField(outputStream, name)๋ณด๋‹ค ์ด์• ํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋‘˜ ๋‹ค ์˜๋ฏธ๋Š” ๋ช…๋ฐฑํ•˜์ง€๋งŒ ์ „์ž๊ฐ€ ๋” ์‰ฝ๊ฒŒ ์ฝํžˆ๊ณ  ๋” ๋นจ๋ฆฌ ์ดํ•ด๋œ๋‹ค. ํ›„์ž๋Š” ์ž ์‹œ ์ฃผ์ถคํ•˜๋ฉฐ ์ฒซ ์ธ์ˆ˜๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ๊ทธ ์‚ฌ์‹ค์ด ๊ฒฐ๊ตญ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค. ์™œ๋ƒ๊ณ ? ์–ด๋–ค ์ฝ”๋“œ๋“  ์ ˆ๋Œ€๋กœ ๋ฌด์‹œํ•˜๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ. ๋ฌด์‹œํ•œ ์ฝ”๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ์ˆจ์–ด๋“œ๋‹ˆ๊นŒ.

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

๐ŸŽˆ ์‚ผํ•ญ ํ•จ์ˆ˜โ€‹

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

๐ŸŽˆ ์ธ์ˆ˜ ๊ฐ์ฒดโ€‹

์ธ์ˆ˜๊ฐ€ 2-3๊ฐœ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ผ๋ถ€ ๋…์ž์ ์ธ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์งš์–ด๋ณธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋‘ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์ž.

Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);

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

๐ŸŽˆ ์ธ์ˆ˜ ๋ชฉ๋กโ€‹

๋•Œ๋กœ๋Š” ์ธ์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ํ•จ์ˆ˜๋„ ํ•„์š”ํ•˜๋‹ค. String.format ๋ฉ”์„œ๋“œ๊ฐ€ ์ข‹์€ ์˜ˆ๋‹ค.

String.format("%s worked %.2f hours.", name, hours);

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๊ฐ€๋ณ€ ์ธ์ˆ˜ ์ „๋ถ€๋ฅผ ๋™๋“ฑํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋ฉด List ํ˜• ์ธ์ˆ˜ ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋…ผ๋ฆฌ๋กœ ๋”ฐ์ ธ๋ณด์ž๋ฉด String.format์€ ์‚ฌ์‹ค์ƒ ์ดํ•ญ ํ•จ์ˆ˜๋‹ค. ์‹ค์ œ๋กœ String.format ์„ ์–ธ๋ถ€๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ดํ•ญ ํ•จ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์ด ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

public String format(String format, Object ... args)

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

๐ŸŽˆ ๋™์‚ฌ์™€ ํ‚ค์›Œ๋“œโ€‹

ํ•จ์ˆ˜์˜ ์˜๋„๋‚˜ ์ธ์ˆ˜์˜ ์ˆœ์„œ์™€ ์˜๋„๋ฅผ ์ œ๋Œ€๋กœ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์ข‹์€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด ํ•„์ˆ˜๋‹ค. ๋‹จํ•ญ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์™€ ์ธ์ˆ˜๊ฐ€ ๋™์‚ฌ/๋ช…์‚ฌ ์Œ์„ ์ด๋ค„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด write(name)์€ ๋ˆ„๊ตฌ๋‚˜ ๊ณง๋ฐ”๋กœ ์ดํ•ดํ•œ๋‹ค. ์ข€ ๋” ๋‚˜์€ ์ด๋ฆ„์€ writeField(name)์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฆ„, ํ•„๋“œ๋ผ๋Š” ์‚ฌ์‹ค์ด ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

๋งˆ์ง€๋ง‰ ์˜ˆ์ œ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์— ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•์‹์ด๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ์ด๋ฆ„์— ์ธ์ˆ˜ ์ด๋ฆ„์„ ๋„ฃ๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, assertExpectedEqualsActual(expected, actual)์ด ๋” ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ธ์ˆ˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

๐ŸŽƒ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!โ€‹

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

๋งŒ์•ฝ ์‹œ๊ฐ„์ ์ธ ๊ฒฐํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ•œ๋‹ค.

๐ŸŽˆ ์ถœ๋ ฅ ์ธ์ˆ˜โ€‹

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ธ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ์ž…๋ ฅ์œผ๋กœ ํ•ด์„ํ•œ๋‹ค.

appendFooter(s);

์ด ํ•จ์ˆ˜๋Š” ๋ฌด์–ธ๊ฐ€์— s๋ฅผ ๋ฐ”๋‹ฅ๊ธ€๋กœ ์ฒจ๋ถ€ํ• ๊นŒ? ์•„๋‹ˆ๋ฉด s์— ๋ฐ”๋‹ฅ๊ธ€์„ ์ฒจ๋ถ€ํ• ๊นŒ? ์ธ์ˆ˜ s๋Š” ์ž…๋ ฅ์ผ๊นŒ ์ถœ๋ ฅ์ผ๊นŒ? ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ฐพ์•„๋ณด๋ฉด ๋ถ„๋ช…ํ•ด์ง„๋‹ค.

public void appendFooter(StringBuffer report)

์ธ์ˆ˜ s๊ฐ€ ์ถœ๋ ฅ ์ธ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์€ ๋ถ„๋ช…ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ฐพ์•„๋ณด๊ณ  ๋‚˜์„œ์•ผ ์•Œ์•˜๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ฐพ์•„๋ณด๋Š” ํ–‰์œ„๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค๊ฐ€ ์ฃผ์ถคํ•˜๋Š” ํ–‰์œ„์™€ ๋™๊ธ‰์ด๋‹ค. ์ธ์ง€์ ์œผ๋กœ ๊ฑฐ์Šฌ๋ฆฐ๋‹ค๋Š” ๋œป์œผ๋กœ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ์ถœ๋ ฅ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. ์ถœ๋ ฅ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ์„ค๊ณ„ํ•œ ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋กœ this์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, appendFooter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹๋‹ค.

report.appendFooter()

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

๐ŸŽƒ ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ!โ€‹

ํ•จ์ˆ˜๋Š” ๋ญ”๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ญ”๊ฐ€์— ๋‹ตํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋‘˜ ๋‹ค ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋‹ค. ๋‘˜ ๋‹ค ํ•˜๋ฉด ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•œ๋‹ค.

๐ŸŽƒ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!โ€‹

๋ช…๋ น ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ๋ช…๋ น/์กฐํšŒ ๋ถ„๋ฆฌ ๊ทœ์น™์„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ž์นซํ•˜๋ฉด if๋ฌธ์—์„œ ๋ช…๋ น์„ ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํƒ“์ด๋‹ค.

if (deletePage(page) == E_OK)

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

์˜ค๋ฅ˜ ์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์›๋ž˜ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค.

try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
} catch (Exception e) {
logger.log(e.getMessage());
}

๐ŸŽˆ Try/Catch ๋ธ”๋ก ๋ฝ‘์•„๋‚ด๊ธฐโ€‹

try/catch ๋ธ”๋ก์€ ์›๋ž˜ ์ถ”ํ•˜๋‹ค. ์ฝ”๋“œ ๊ตฌ์กฐ์— ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค๋ฉฐ, ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ๋’ค์„ž๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ try/catch ๋ธ”๋ก์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๋Š” ํŽธ์ด ์ข‹๋‹ค.

public void delete(Page page) {
try {
deletePageAndAllReferences(page);
} catch (Exception e) {
logError(e);
}
}

private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}

private void logError(Exception e) {
logger.log(e.getMessage());
}

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

๐ŸŽˆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ํ•œ ๊ฐ€์ง€ ์ž‘์—…์ด๋‹ค.โ€‹

ํ•จ์ˆ˜๋Š” "ํ•œ ๊ฐ€์ง€" ์ž‘์—…๋งŒ ํ•ด์•ผ ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ "ํ•œ ๊ฐ€์ง€" ์ž‘์—…์— ์†ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค. ํ•จ์ˆ˜์— ํ‚ค์›Œ๋“œ try๊ฐ€ ์žˆ๋‹ค๋ฉด try๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•ด catch/finally ๋ฌธ์œผ๋กœ ๋๋‚˜์•ผ ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

๐ŸŽˆ Error.java ์˜์กด์„ฑ ์ž์„โ€‹

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋Š”, ํด๋ž˜์Šค๋“  ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜๋“ , ์–ด๋””์„ ๊ฐ€ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

public enum Error {
OK,
INVALID,
NO_SUCH,
LOCKED,
OUT_OF_RESOURCES,
WAITING_FOR_EVENT;
}

์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋Š” ์˜์กด์„  ์ž์„(magnet)์ด๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ Error enum์„ importํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฆ‰ Error enum์ด ๋ณ€ํ•œ๋‹ค๋ฉด Error enum์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์ „๋ถ€๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‹ค์‹œ ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Error ํด๋ž˜์Šค ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ์ง„๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์žฌ์ปดํŒŒ์ผ/์žฌ๋ฐฐ์น˜๊ฐ€ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ์— ์ƒˆ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ๊ธฐ์กด ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

์˜ค๋ฅ˜ ์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ์˜ˆ์™ธ๋Š” Exception ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์ปดํŒŒ์ผ/์žฌ๋ฐฐ์น˜ ์—†์ด๋„ ์ƒˆ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽƒ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ๋ผ!โ€‹

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

๐ŸŽƒ ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€‹

์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์—์ธ ํ—ˆ๋ฅด ๋ฐ์ดํฌ์ŠคํŠธ๋ผ์˜ ๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค ๋ฐ์ดํฌ์ŠคํŠธ๋ผ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๋‚ด ๋ชจ๋“  ๋ธ”๋ก์— ์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๋Š” return๋ฌธ์ด ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ๋ง์ด๋‹ค. ๋ฃจํ”„ ์•ˆ์—์„œ break๋‚˜ continue๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ˆ ๋˜๋ฉด goto๋Š” ์ ˆ๋Œ€๋กœ, ์ ˆ๋Œ€๋กœ ์•ˆ ๋œ๋‹ค.

๊ตฌ์กฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ชฉํ‘œ์™€ ๊ทœ์œจ์€ ๊ณต๊ฐํ•˜์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ์ž‘๋‹ค๋ฉด ์œ„ ๊ทœ์น™์€ ๋ณ„ ์ด์ต์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์•„์ฃผ ํด ๋•Œ๋งŒ ์ƒ๋‹นํ•œ ์ด์ต์„ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ๋งŒ๋“œ๋‹ค๋ฉด ๊ฐ„ํ˜น return, break, continue๋ฅผ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ์˜คํžˆ๋ ค ๋•Œ๋กœ๋Š” ๋‹จ์ผ ์ž…/์ถœ๊ตฌ ๊ทœ์น™๋ณด๋‹ค ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๐ŸŽƒ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์ฃ ?โ€‹

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

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

๐ŸŽƒ ๊ฒฐ๋ก โ€‹

๋ชจ๋“  ์‹œ์Šคํ…œ์€ ํŠน์ • ์‘์šฉ ๋ถ„์•ผ ์‹œ์Šคํ…œ์„ ๊ธฐ์ˆ ํ•  ๋ชฉ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ค๊ณ„ํ•œ ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด(DSL)๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ํ•จ์ˆ˜๋Š” ๊ทธ ์–ธ์–ด์—์„œ ๋™์‚ฌ๋ฉฐ, ํด๋ž˜์Šค๋Š” ๋ช…์‚ฌ๋‹ค.

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

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