๋์ ์ฝ๋์ ์ฃผ์์ ๋ฌ์ง ๋ง๋ผ. ์๋ก ์ง๋ผ.
- ๋ธ๋ผ์ด์ธ 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 ์ฃผ์์ ์ ๊ฒํด ์์ ๋ ๊ด์ฐฎ์ ์ฃผ์์ ์์ ๋ผ๊ณ ๊ถํ๋ค.
์์นซ ๋์๋กญ์ง ์๋ค๊ณ ์ฌ๊ฒจ์ง ๋ญ๊ฐ์ ์ค์์ฑ์ ๊ฐ์กฐํ๊ธฐ ์ํด์๋ ์ฃผ์์ ์ฌ์ฉํ๋ค.
์ค๋ช ์ด ์ ๋ ๊ณต๊ฐ 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 ํ๊ทธ๋ฅผ ์ฝ์ ํ๋ ์ฑ ์์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋๋ผ ๋๊ตฌ๊ฐ ์ ธ์ผ ํ๋ค.
์ฃผ์์ ๋ฌ์์ผ ํ๋ค๋ฉด ๊ทผ์ฒ์ ์๋ ์ฝ๋๋ง ๊ธฐ์ ํ๋ผ. ์ฝ๋ ์ผ๋ถ์ ์ฃผ์์ ๋ฌ๋ฉด์ ์์คํ ์ ์ ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ์ง ๋ง๋ผ.
/**
* ์ ํฉ์ฑ ํ
์คํธ๊ฐ ๋์ํ๋ ํฌํธ: ๊ธฐ๋ณธ๊ฐ์ <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์ ์ถ๊ฐํ ์ด์ ๋ ๋ญ๊น? ์ฃผ์์ ๋ค๋ ๋ชฉ์ ์ ์ฝ๋๋ง์ผ๋ก ์ค๋ช ์ด ๋ถ์กฑํด์๋ค. ์ฃผ์ ์์ฒด๊ฐ ๋ค์ ์ค๋ช ์ ์๊ตฌํ๋ ์ํ๊น๊ธฐ ๊ทธ์ง์๋ค.
์งง์ ํจ์๋ ๊ธด ์ค๋ช ์ด ํ์ ์๋ค. ์งง๊ณ ํ ๊ฐ์ง๋ง ์ํํ์ฌ ์ด๋ฆ์ ์ ๋ถ์ธ ํจ์๊ฐ ์ฃผ์์ผ๋ก ํค๋๋ฅผ ์ถ๊ฐํ ํจ์๋ณด๋ค ํจ์ฌ ์ข๋ค.
๊ณต๊ฐ 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 ์ ์์ผ ์ํํธ์จ์ด ์ฅ์ธ ์ ์