Skip to content

Latest commit

ย 

History

History
467 lines (345 loc) ยท 20.3 KB

ch4_remark.md

File metadata and controls

467 lines (345 loc) ยท 20.3 KB

4์žฅ. ์ฃผ์„

์ฃผ์„์ด ๋‚˜์œ ์ด์œ 

๋‚˜์œ ์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ฌ์ง€ ๋งˆ๋ผ. ์ƒˆ๋กœ ์งœ๋ผ.

  • ๋ธŒ๋ผ์ด์–ธ W. ์ปค๋‹ˆํ—จ, P.J. ํ”Œ๋ผ์šฐ๊ฑฐ

์ž˜ ๋‹ฌ๋ฆฐ ์ฃผ์„์€ ๊ทธ ์–ด๋–ค ์ •๋ณด๋ณด๋‹ค ์œ ์šฉํ•˜๋‹ค. ๊ฒฝ์†”ํ•˜๊ณ  ๊ทผ๊ฑฐ ์—†๋Š” ์ฃผ์„์€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ์˜ค๋ž˜๋˜๊ณ  ์กฐ์žกํ•œ ์ฃผ์„์€ ๊ฑฐ์ง“๊ณผ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ํผํŠธ๋ ค ํ•ด์•ฝ์„ ๋ฏธ์นœ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์น˜๋ฐ€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค๋ฉด ์ฃผ์„์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

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

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฃผ์„์ด ํ•„์š”ํ•˜๋ฉด ์ƒํ™ฉ์„ ์—ญ์ „ํ•ด ์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์€ ์—†๋Š”์ง€ ์ƒ๊ฐํ•˜์ž!

์ฃผ์„์€ ์˜ค๋ž˜๋ ์ˆ˜๋ก ์ฝ”๋“œ์—์„œ ๋ฉ€์–ด์ง„๋‹ค. ์˜ค๋ž˜๋ ์ˆ˜๋ก ์™„์ „ํžˆ ๊ทธ๋ฆ‡๋  ๊ฐ€๋Šฅ์„ฑ๋„ ์ปค์ง„๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ฃผ์„์„ ์œ ์ง€ํ•˜๊ณ  ๋ณด์ˆ˜ํ•˜๊ธฐ๋ž€ ํ˜„์‹ค์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

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

๋ถ€์ •ํ™•ํ•œ ์ฃผ์„์€ ์•„์˜ˆ ์—†๋Š” ์ฃผ์„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์˜๋‹ค. ๋ถ€์ •ํ™•ํ•œ ์ฃผ์„์€ ๋…์ž๋ฅผ ํ˜„ํ˜นํ•˜๊ณ  ์˜ค๋„ํ•œ๋‹ค. ๋” ์ด์ƒ ์ง€ํ‚ฌ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ทœ์น™์ด๋‚˜ ์ง€์ผœ์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ทœ์น™์„ ๋ช…์‹œํ•œ๋‹ค.

์ฝ”๋“œ๋Š” ์ž์‹ ์ด ํ•˜๋Š” ์ผ์„ ์ง„์‹ค๋˜๊ฒŒ ๋งํ•œ๋‹ค. ์ฝ”๋“œ๋งŒ์ด ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ์ถœ์ฒ˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” (๊ฐ„ํ˜น ํ•„์š”ํ• ์ง€๋ผ๋„) ์ฃผ์„์„ ๊ฐ€๋Šฅํ•œ ์ค„์ด๋„๋ก ๊พธ์ค€ํžˆ ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

์ฃผ์„์€ ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ๋ณด์™„ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ฝ”๋“œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ด์œ ๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์ด ๋‚˜์˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ชจ๋“ˆ์„ ์งœ๋‹ค๋ณด๋‹ˆ ์งœ์ž„์ƒˆ๊ฐ€ ์—‰๋ง์ด๊ณ  ์•Œ์•„๋จน๊ธฐ ์–ด๋ ต๋‹ค.

ํ‘œํ˜„๋ ฅ์ด ํ’๋ถ€ํ•˜๊ณ  ๊น”๋”ํ•˜๋ฉฐ ์ฃผ์„์ด ๊ฑฐ์˜ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์–ด์ˆ˜์„ ํ•˜๋ฉฐ ์ฃผ์„์ด ๋งŽ์€ ์ฝ”๋“œ๋ณด๋‹ค ํ›จ์”ฌ ์ข‹๋‹ค.

์ฝ”๋“œ๋กœ ์˜๋„๋ฅผ ํ‘œํ˜„ํ•˜๋ผ!

// ์ง์›์—๊ฒŒ ๋ณต์ง€ ํ˜œํƒ์„ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
if ((employee.flags & HOURLY_FLAG) && 
    (employee.age > 65))
if (employee.isEligibleForFullBenefits())

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

์ข‹์€ ์ฃผ์„

์–ด๋–ค ์ฃผ์„์€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์œ ์ตํ•˜๋‹ค.

๋ฒ•์ ์ธ ์ฃผ์„

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

// Copyright (C) 2003, 2004, 2005 by Object Mentor, Inc. All rights reserved. 
// GND General Public License ๋ฒ„์ „ 2 ์ด์ƒ์„ ๋”ฐ๋ฅด๋Š” ์กฐ๊ฑด์œผ๋กœ ๋ฐฐํฌํ•œ๋‹ค.

์†Œ์Šค ํŒŒ์ผ ์ฒซ๋จธ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” ์ฃผ์„์ด ๋ฐ˜๋“œ์‹œ ๊ณ„์•ฝ ์กฐ๊ฑด์ด๋‚˜ ๋ฒ•์ ์ธ ์ •๋ณด์ผ ํ•„์š”๋Š” ์—†๋‹ค. ๋ชจ๋“  ์กฐํ•ญ๊ณผ ์กฐ๊ฑด์„ ์—ด๊ฑฐํ•˜๋Š” ๋Œ€์‹ ์—, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ํ‘œ์ค€ ๋ผ์ด์„ ์Šค๋‚˜ ์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด๋„ ๋œ๋‹ค.

์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฃผ์„

๋•Œ๋กœ๋Š” ๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋ฅผ ์ฃผ์„์œผ๋กœ ์ œ๊ณตํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์ฃผ์„์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฐ’์„ ์„ค๋ช…ํ•œ๋‹ค.

// ํ…Œ์ŠคํŠธ ์ค‘์ธ Responder ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
protected abstract Responder responderInstance();

๋•Œ๋•Œ๋กœ ์œ„์™€ ๊ฐ™์€ ์ฃผ์„์ด ์œ ์šฉํ•˜๋‹ค ํ• ์ง€๋ผ๋„, ๊ฐ€๋Šฅํ•˜๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์— ์ •๋ณด๋ฅผ ๋‹ด์•„ ๋‘๋Š” ํŽธ์ด ์ข‹๋‹ค.

// kk:mm:ss EEE, MMM dd, yyyy ํ˜•์‹์ด๋‹ค.
Pattern timeMatcher = Pattern.compile(
    "\\d*:\\d*:\\d* \\w*, \\w* \\d*, \\d*");
)

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

์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„

๋•Œ๋กœ๋Š” ์ฃผ์„์€ ๊ตฌํ˜„์„ ์ดํ•ดํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ์„ ์„ ๋„˜์–ด ๊ฒฐ์ •์— ๊น”๋ฆฐ ์˜๋„๊นŒ์ง€ ์„ค๋ช…ํ•œ๋‹ค. ๋‹ค์Œ์€ ์ฃผ์„์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ๊ฒฐ์ •์„ ๊ธฐ๋กํ•œ ์˜ˆ์ œ๋‹ค. ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ ์ €์ž๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ๊ฐ์ฒด๋ณด๋‹ค ์ž๊ธฐ ๊ฐ์ฒด์— ๋†’์€ ์ˆœ์œ„๋ฅผ ์ฃผ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

public int compare(Object o){
    if (o instanceof WikiPagePath){
        WikiPaghPath p = (WikiPagePath) o;
        String compressedName = StringUtil.join(names, "");
        String compressedArgumentName = StringUtil.join(p.names, "");
        return compressedName.compareTo(compressedArgumentName);
        }
        return 1; // ์˜ค๋ฅธ์ชฝ ์œ ํ˜•์ด๋ฏ€๋กœ ์ •๋ ฌ ์ˆœ์œ„๊ฐ€ ๋” ๋†’๋‹ค.
}

์˜๋ฏธ๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ๋ฐํžˆ๋Š” ์ฃผ์„

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

์ด ๋•Œ ๊ทธ๋ฆ‡๋œ ์ฃผ์„์„ ๋‹ฌ์•„๋†“์„ ์œ„ํ—˜์ด ์ƒ๋‹นํžˆ ๋†’์œผ๋ฏ€๋กœ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์—†๋Š”์ง€ ๊ณ ๋ฏผํ•˜๊ณ  ์ •ํ™•ํžˆ ๋‹ฌ๋„๋ก ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•œ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•˜๋Š” ์ฃผ์„

๋•Œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ•  ๋ชฉ์ ์œผ๋กœ ์ฃผ์„์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฃผ์„์œผ๋กœ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์„ ๋‚จ๊ธฐ๊ฑฐ๋‚˜ @Ignore ์†์„ฑ์— ๋ฌธ์ž์—ด๋กœ ๋„ฃ์–ด์ค€๋‹ค. @Ignore("์‹คํ–‰์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.")

TODO ์ฃผ์„

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

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

์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๋Š” ์ฃผ์„

์ž์นซ ๋Œ€์ˆ˜๋กญ์ง€ ์•Š๋‹ค๊ณ  ์—ฌ๊ฒจ์งˆ ๋ญ”๊ฐ€์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์ฃผ์„์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ณต๊ฐœ API์—์„œ Javadocs

์„ค๋ช…์ด ์ž˜ ๋œ ๊ณต๊ฐœ API๋Š” ์ฐธ์œผ๋กœ ์œ ์šฉํ•˜๊ณ  ๋งŒ์กฑ์Šค๋Ÿฝ๋‹ค. ํ‘œ์ค€ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•œ javadocs๊ฐ€ ์ข‹์€ ์˜ˆ๋‹ค.

๊ณต๊ฐœ API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ›Œ๋ฅญํ•œ javadocs๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์žฅ์—์„œ ์ œ์‹œํ•˜๋Š” ๋‚˜๋จธ์ง€ ์ถฉ๊ณ ๋„ ๋ช…์‹ฌํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ์—ฌ๋Š ์ฃผ์„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Javadocs ์—ญ์‹œ ๋…์ž๊ฐ€ ์˜ค๋„ํ•˜๊ฑฐ๋‚˜, ์ž˜๋ชป ์œ„์น˜ํ•˜๊ฑฐ๋‚˜, ๊ทธ๋ฆ‡๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

๋‚˜์œ ์ฃผ์„

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

์ฃผ์ ˆ๊ฑฐ๋ฆฌ๋Š” ์ฃผ์„

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

๊ฐ™์€ ์ด์•ผ๊ธฐ๋ฅผ ์ค‘๋ณตํ•˜๋Š” ์ฃผ์„

ํ—ค๋”์— ๋‹ฌ๋ฆฐ ์ฃผ์„์ด ๊ฐ™์€ ์ฝ”๋“œ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ค‘๋ณตํ•œ๋‹ค. ์ž์นซํ•˜๋ฉด ์ฝ”๋“œ๋ณด๋‹ค ์ฃผ์„์„ ์ฝ๋Š” ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

/**
 * ์ปจํ…Œ์ด๋„ˆ์™€ ๊ด€๋ จ๋œ Loader ๊ตฌํ˜„
 */
 protected Loader loader = null;

์˜คํ•ดํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ์˜๋„๋Š” ์ข‹์•˜์œผ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋”ฑ ๋งž์„ ์ •๋„๋กœ ์—„๋ฐ€ํ•˜๊ฒŒ ์ฃผ์„์„ ๋‹ฌ์ง€ ๋ชปํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

(์ฝ”๋“œ๋ณด๋‹ค๋„ ์ฝ๊ธฐ ์–ด๋ ค์šด) ์ฃผ์„์— ๋‹ด๊ธด '์‚ด์ง ์ž˜๋ชป๋œ ์ •๋ณด'๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ์ด์œ ๋ฅผ ์ฐพ๋‹ค๊ฐ€ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์•“์„ ์ˆ˜ ์žˆ๋‹ค.

// this.closed๊ฐ€ true์ผ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋‹ค.
// ํƒ€์ž„์•„์›ƒ์— ๋„๋‹ฌํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
public synchronized void waitForClose(final long timeoutMills) throws Exception {
    if (!closed){
        wait(timeoutMills);
        if (!closed)
            throw new Exception("MockResponseSender could not be closed");
    }
}

์˜๋ฌด์ ์œผ๋กœ ๋‹ค๋Š” ์ฃผ์„

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

์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋“ˆ์„ ํŽธ์ง‘ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“ˆ ์ฒซ๋จธ๋ฆฌ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆ ์ฒซ๋จธ๋ฆฌ ์ฃผ์„์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“ˆ์— ๊ฐ€ํ•œ ๋ณ€๊ฒฝ์„ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๋Š” ์ผ์กฐ์˜ ์ผ์ง€ ํ˜น์€ ๋กœ๊ทธ๊ฐ€ ๋œ๋‹ค.

์˜ˆ์ „์—๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ ์ฒซ๋จธ๋ฆฌ์— ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ด€๋ก€๊ฐ€ ๋ฐ”๋žŒ์งํ–ˆ๋‹ค. ๋‹น์‹œ์—๋Š” ์†Œ์Šค์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์—†์—ˆ์œผ๋‹ˆ๊นŒ. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ํ˜ผ๋ž€๋งŒ ๊ฐ€์ค‘ํ•  ๋ฟ์ด๋‹ค. ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

์žˆ์œผ๋‚˜ ๋งˆ๋‚˜ ํ•œ ์ฃผ์„

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

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

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

๋ฌด์„œ์šด ์žก์Œ

๋•Œ๋กœ๋Š” Javadocs๋„ ์žก์Œ์ด๋‹ค. ์ฃผ์„์— ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ณต๋ถ™ํ•  ์ƒ๊ฐ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์ ์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹๋‹ค. ๋ณต๋ถ™ํ•˜๋‹ค ์‹คํŒจํ•˜๋ฉด ๊ณจ์น˜๋งŒ ์•„ํ”„๋‹ค.

ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฃผ์„์„ ๋‹ฌ์ง€ ๋ง๋ผ

์ฃผ์„์„ ์—†์• ๊ณ  ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์ž.

์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์†Œ์Šค ํŒŒ์ผ์—์„œ ํŠน์ • ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋ ค ์ฃผ์„์„ ์‚ฌ์šฉํ•œ๋‹ค.

// Actions ///////////////////////////////////////////

๊ทนํžˆ ๋“œ๋ฌผ์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ๋ฐฐ๋„ˆ ์•„๋ž˜ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋†“์œผ๋ฉด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์€ ์ฃผ์„์€ ๊ฐ€๋…์„ฑ์„ ๋‚ฎ์ถ”๋ฏ€๋กœ ์ œ๊ฑฐํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค. ํŠนํžˆ ๋’ท๋ถ€๋ถ„์— ์Šฌ๋ž˜์‹œ(/)๋กœ ์ด์–ด์ง€๋Š” ์žก์Œ์€ ์ œ๊ฑฐํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

๋„ˆ๋ฌด ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐฐ๋„ˆ๋Š” ๋ˆˆ์— ๋„๋ฉฐ ์ฃผ์˜๋ฅผ ํ™˜๊ธฐํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•  ๋•Œ๋งŒ, ์•„์ฃผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค. ๋ฐฐ๋„ˆ๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ๋…์ž๊ฐ€ ํ”ํ•œ ์žก์Œ์œผ๋กœ ์—ฌ๊ฒจ ๋ฌด์‹œํ•œ๋‹ค.

๋‹ซ๋Š” ๊ด„ํ˜ธ์— ๋‹ค๋Š” ์ฃผ์„

๋•Œ๋•Œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๋‹ซ๋Š” ๊ด„ํ˜ธ์— ํŠน์ˆ˜ํ•œ ์ฃผ์„์„ ๋‹ฌ์•„๋†“๋Š”๋‹ค. ์ค‘์ฒฉ์ด ์‹ฌํ•˜๊ณ  ์žฅํ™ฉํ•œ ํ•จ์ˆ˜๋ผ๋ฉด ์˜๋ฏธ๊ฐ€ ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ์ž‘๊ณ  ์บก์Šํ™”๋œ ํ•จ์ˆ˜์—๋Š” ์žก์Œ์ผ ๋ฟ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ซ๋Š” ๊ด„ํ˜ธ์— ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค๋ฉด ๋Œ€์‹ ์— ํ•จ์ˆ˜๋ฅผ ์ค„์ด๋ ค ์‹œ๋„ํ•˜์ž.

public class wc {
    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        int lineCount = 0;
        int charCount = 0;
        int wordCount = 0;
        try {
            while ((line = in.readLine()) != null) {
                lineCount++;
                charCount += line.length();
                String words[] = line.split("\\W");
                wordCount += words.length;
            } // while
            System.out.println("wordCount = " + wordCount);
            System.out.println("lineCount = " + lineCount);
            System.out.println("charCount = " + charCount);
        } // try
        catch (IOException e) {
            System.err.println("Error:" + e.getMessage());
        } // catch
    } // main
}

๊ณต๋กœ๋ฅผ ๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์ €์ž๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฃผ์„

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

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ•์กฐํ•˜์ง€๋งŒ, ์œ„์™€ ๊ฐ™์€ ์ •๋ณด๋Š” ์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ

์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ์ฝ”๋“œ๋งŒํผ ๋ฐ‰์‚ด์Šค๋Ÿฐ ๊ด€ํ–‰๋„ ๋“œ๋ฌผ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•˜์ง€ ๋งˆ๋ผ!

InputStreamResponse response = new InputStreamResponse();
response.setBody(formatter.getResultStream(), formatter.getByteCount());
// InputStream resultStream = formatter.getResultStream();
// StreamReader reader = new StreamReader(resultsStream);
// response.setContent(reader.read(formatter.getByteCount()));

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

์šฐ๋ฆฌ๋Š” ์˜ค๋ž˜ ์ „๋ถ€ํ„ฐ ์šฐ์ˆ˜ํ•œ ์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์™”๋‹ค. ์†Œ์Šค ์ฝ”๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์šฐ๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•ด ์ฝ”๋“œ๋ฅผ ๊ธฐ์–ตํ•ด์ค€๋‹ค. ์ด์ œ๋Š” ์ฃผ์„์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ƒฅ ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ผ. ์žƒ์–ด๋ฒ„๋ฆด ์—ผ๋ ค๋Š” ์—†๋‹ค. ์•ฝ์†ํ•œ๋‹ค.

HTML ์ฃผ์„

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

์ „์—ญ ์ •๋ณด

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

/**
 * ์ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ํฌํŠธ: ๊ธฐ๋ณธ๊ฐ’์€ <b>8282</b>.
 *
 * @param fitnessPort
 */
 public void setFitnessPort(int fitnessPort){
     this.fitnessPort = fitnessPort;
 }

์œ„ ์ฝ”๋“œ๋Š” ์ฃผ์„์— ๊ธฐ๋ณธ ํฌํŠธ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์—์„œ ํฌํŠธ ๊ธฐ๋ณธ ๊ฐ’์„ ์ „ํ˜€ ํ†ต์ œํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ฆ‰, ํฌํŠธ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€ํ•ด๋„ ์•„๋ž˜ ์ฃผ์„์ด ๋ณ€ํ•˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์ „ํ˜€ ์—†๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด

์ฃผ์„์—๋‹ค ํฅ๋ฏธ๋กœ์šด ์—ญ์‚ฌ๋‚˜ ๊ด€๋ จ์—†๋Š” ์ •๋ณด๋ฅผ ์žฅํ™ฉํ•˜๊ฒŒ ๋Š˜์—ฌ๋†“์ง€ ๋งˆ๋ผ.

๋ชจํ˜ธํ•œ ๊ด€๊ณ„

์ฃผ์„๊ณผ ์ฃผ์„์ด ์„ค๋ช…ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‘˜ ์‚ฌ์ด ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค.

/**
 * ๋ชจ๋“  ํ”ฝ์…€์„ ๋‹ด์„ ๋งŒํผ ์ถฉ๋ถ„ํ•œ ๋ฐฐ์—ด๋กœ ์‹œ์ž‘ํ•œ๋‹ค(์—ฌ๊ธฐ์— ํ•„ํ„ฐ ๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ๋‹ค).
 * ๊ทธ๋ฆฌ๊ณ  ํ—ค๋” ์ •๋ณด๋ฅผ ์œ„ํ•ด 200๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ๋‹ค.
 */
 this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];

์—ฌ๊ธฐ์„œ ํ•„ํ„ฐ ๋ฐ”์ดํŠธ๋ž€ ๋ฌด์—‡์ผ๊นŒ? +1๊ณผ ๊ด€๋ จ ์žˆ์„ ๊นŒ? * 3๊ณผ ๊ด€๋ จ์ด ์žˆ์„๊นŒ? ์•„๋‹ˆ๋ฉด ๋‘˜ ๋‹ค? ํ•œ ํ”ฝ์…€์ด ํ•œ ๋ฐ”์ดํŠธ์ธ๊ฐ€? 200์„ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š” ๋ญ˜๊นŒ? ์ฃผ์„์„ ๋‹ค๋Š” ๋ชฉ์ ์€ ์ฝ”๋“œ๋งŒ์œผ๋กœ ์„ค๋ช…์ด ๋ถ€์กฑํ•ด์„œ๋‹ค. ์ฃผ์„ ์ž์ฒด๊ฐ€ ๋‹ค์‹œ ์„ค๋ช…์„ ์š”๊ตฌํ•˜๋‹ˆ ์•ˆํƒ€๊น๊ธฐ ๊ทธ์ง€์—†๋‹ค.

ํ•จ์ˆ˜ ํ—ค๋”

์งง์€ ํ•จ์ˆ˜๋Š” ๊ธด ์„ค๋ช…์ด ํ•„์š” ์—†๋‹ค. ์งง๊ณ  ํ•œ ๊ฐ€์ง€๋งŒ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด๋ฆ„์„ ์ž˜ ๋ถ™์ธ ํ•จ์ˆ˜๊ฐ€ ์ฃผ์„์œผ๋กœ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•œ ํ•จ์ˆ˜๋ณด๋‹ค ํ›จ์”ฌ ์ข‹๋‹ค.

๋น„๊ณต๊ฐœ ์ฝ”๋“œ์—์„œ Javadocs

๊ณต๊ฐœ API๋Š” javadocs๊ฐ€ ์œ ์šฉํ•˜์ง€๋งŒ ๊ณต๊ฐœํ•˜์ง€ ์•Š์„ ์ฝ”๋“œ๋ผ๋ฉด javadocs๋Š” ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค. ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— ์†ํ•œ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜์— Javadocs๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์œ ์šฉํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Javadocs ์ฃผ์„์ด ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๋งŒ ๋ณด๊ธฐ ์‹ซ๊ณ  ์‚ฐ๋งŒํ•ด์งˆ ๋ฟ์ด๋‹ค.

์˜ˆ์ œ

๋ฆฌํŒฉํ† ๋ง ์ „ GeneratePrimes.java

/**
 * This class Generates prime numbers up to a user specified
 * maximum. The algorithm used is the Sieve of Eratosthenes.
 * <p>
 * Eratosthenes of Cyrene, b. c. 276 BC, Cyrene, Libya --
 * d. c. 194, Alexandria.  The first man to calculate the
 * circumference of the Earth. Also known for working on
 * calendars with leap years and ran the library at Alexandria.
 * <p>
 * The algorithm is quite simple. Given an array of integers
 * starting at 2. Cross out all multiples of 2. Find the next
 * uncrossed integer, and cross out all of its multiples.
 * Repeat untilyou have passed the square root of the maximum
 * value.
 *
 * @author Alphonse
 * @version 13 Feb 2002 atp
 */

public class GeneratePrimes
{
  /**
   * @param maxValue is the generation limit.
   */
  public static int[] generatePrimes(int maxValue)
  {
    if (maxValue >= 2) // the only valid case
    {
      // declarations
      int s = maxValue + 1; // size of array
      boolean[] f = new boolean[s];
      int i;
      // initialize array to true.
      for (i = 0; i < s; i++)
        f[i] = true;

      // get rid of known non-primes
      f[0] = f[1] = false;

      // sieve
      int j;
      for (i = 2; i < Math.sqrt(s) + 1; i++)
      {
        if (f[i]) // if i is uncrossed, cross its multiples.
        {
          for (j = 2 * i; j < s; j += i)
            f[j] = false; // multiple is not prime
        }
      }

      // how many primes are there?
      int count = 0;
      for (i = 0; i < s; i++)
      {
        if (f[i])
          count++; // bump count.
      }

      int[] primes = new int[count];

      // move the primes into the result
      for (i = 0, j = 0; i < s; i++)
      {
        if (f[i])             // if prime
          primes[j++] = i;
      }

      return primes; // return the primes
    }
    else // maxValue < 2
    return new int[0]; // return null array if bad input.
  }

  public static void main(String[] args) {
    for (int i: generatePrimes(50)) {
      System.out.print(i + " ");
    }
  }
}

๋ฆฌํŒฉํ† ๋ง ํ›„ PrimeGenerator.java

/**
 * This class Generates prime numbers up to a user specified
 * maximum.  The algorithm used is the Sieve of Eratosthenes.
 * Given an array of integers starting at 2:
 * Find the first uncrossed integer, and cross out all its
 * multiples.  Repeat until there are no more multiples
 * in the array.
 */

public class PrimeGenerator {
  private static boolean[] crossedOut;
  private static int[] result;

  public static int[] generatePrimes(int maxValue) {
    if (maxValue < 2)
      return new int[0];
    else {
      uncrossIntegersUpTo(maxValue);
      crossOutMultiples();
      putUncrossedIntegersIntoResult();
      return result;
    }
  }

  private static void uncrossIntegersUpTo(int maxValue) {
    crossedOut = new boolean[maxValue + 1];
    for (int i = 2; i < crossedOut.length; i++)
      crossedOut[i] = false;
  }

  private static void crossOutMultiples() {
    int limit = determineIterationLimit();
    for (int i = 2; i <= limit; i++)
      if (notCrossed(i))
        crossOutMultiplesOf(i);
  }

  private static int determineIterationLimit() {
    // Every multiple in the array has a prime factor that
    // is less than or equal to the root of the array size,
    // so we don't have to cross out multiples of numbers
    // larger than that root.
    double iterationLimit = Math.sqrt(crossedOut.length);
    return (int) iterationLimit;
  }

  private static void crossOutMultiplesOf(int i) {
    for (int multiple = 2 * i;
         multiple < crossedOut.length;
         multiple += i)
      crossedOut[multiple] = true;
  }

  private static boolean notCrossed(int i) {
    return crossedOut[i] == false;
  }

  private static void putUncrossedIntegersIntoResult() {
    result = new int[numberOfUncrossedIntegers()];
    for (int j = 0, i = 2; i < crossedOut.length; i++)
      if (notCrossed(i))
        result[j++] = i;
  }

  private static int numberOfUncrossedIntegers() {
    int count = 0;
    for (int i = 2; i < crossedOut.length; i++)
      if (notCrossed(i))
        count++;

    return count;
  }

  public static void main(String[] args) {
    for (int i : generatePrimes(50)) {
      System.out.print(i + " ");
    }
  }
}

์ฐธ๊ณ  ์ž๋ฃŒ

  • Clean Code ์• ์ž์ผ ์†Œํ”„ํŠธ์›จ์–ด ์žฅ์ธ ์ •์‹