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

๐Ÿญ Chapter 5: ํ˜•์‹ ๋งž์ถ”๊ธฐ

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

๐ŸŽƒ ํ˜•์‹์„ ๋งž์ถ”๋Š” ๋ชฉ์ โ€‹

์ฝ”๋“œ ํ˜•์‹์€ ์ค‘์š”ํ•˜๋‹ค. ๋„ˆ๋ฌด๋‚˜๋„ ์ค‘์š”ํ•˜๋ฏ€๋กœ ์œตํ†ต์„ฑ ์—†์ด ๋งน๋ชฉ์ ์œผ๋กœ ๋”ฐ๋ฅด๋ฉด ์•ˆ ๋œ๋‹ค. ์ฝ”๋“œ ํ˜•์‹์€ ์˜์‚ฌ์†Œํ†ต์˜ ์ผํ™˜์ด๋‹ค. ์˜์‚ฌ์†Œํ†ต ์ „๋ฌธ ๊ฐœ๋ฐœ์ž์˜ ์ผ์ฐจ์ ์ธ ์˜๋ฌด๋‹ค.

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

๐ŸŽƒ ์ ์ ˆํ•œ ํ–‰ ๊ธธ์ด๋ฅผ ์œ ์ง€ํ•˜๋ผโ€‹

์„ธ๋กœ ๊ธธ์ด๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. ์†Œ์Šค ์ฝ”๋“œ๋Š” ์–ผ๋งˆ๋‚˜ ๊ธธ์–ด์•ผ ์ ๋‹นํ• ๊นŒ? ์ž๋ฐ”์—์„œ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ํด๋ž˜์Šค ํฌ๊ธฐ์™€ ๋ฐ€์ ‘ํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ํŒŒ์ผ๋ณด๋‹ค ์ž‘์€ ํŒŒ์ผ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

๐ŸŽˆ ์‹ ๋ฌธ ๊ธฐ์‚ฌ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ผโ€‹

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

์‹ ๋ฌธ์€ ๋‹ค์–‘ํ•œ ๊ธฐ์‚ฌ๋กœ ์ด๋ค„์ง„๋‹ค. ๋Œ€๋‹ค์ˆ˜ ๊ธฐ์‚ฌ๊ฐ€ ์•„์ฃผ ์งง๋‹ค. ์–ด๋–ค ๊ธฐ์‚ฌ๋Š” ์กฐ๊ธˆ ๊ธธ๋‹ค. ํ•œ ๋ฉด์„ ์ฑ„์šฐ๋Š” ๊ธฐ์‚ฌ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.

๐ŸŽˆ ๊ฐœ๋…์„ ๋นˆ ํ–‰์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ผโ€‹

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

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

๐ŸŽˆ ์„ธ๋กœ ๋ฐ€์ง‘๋„โ€‹

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

public class ReporterConfig {
/**
* ๋ฆฌํฌํ„ฐ ๋ฆฌ์Šค๋„ˆ์˜ ํด๋ž˜์Šค ์ด๋ฆ„
*/
private String m_className;

/**
* ๋ฆฌํฌํ„ฐ ๋ฆฌ์Šค๋„ˆ์˜ ์†์„ฑ
*/
private List<Property> m_properties = new ArrayList<Property>();
public void addProperty(Property property) {
m_properties.add(property);
}
}

๋‹ค์Œ ์˜ˆ์ œ๊ฐ€ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค. ์ฝ”๋“œ๊ฐ€ 'ํ•œ๋ˆˆ'์— ๋“ค์–ด์˜จ๋‹ค. ์ ์–ด๋„ ๋‚ด๊ฒŒ๋Š” ๊ทธ๋ ‡๋‹ค. ์ฒ™ ๋ณด๋ฉด ๋ณ€์ˆ˜ 2๊ฐœ์— ๋ฉ”์„œ๋“œ๊ฐ€ 1๊ฐœ์ธ ํด๋ž˜์Šค๋ผ๋Š” ์‚ฌ์‹ค์ด ๋“œ๋Ÿฌ๋‚œ๋‹ค. ๋จธ๋ฆฌ๋‚˜ ๋ˆˆ์„ ์›€์ง์ผ ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค.

public class ReporterConfig {
private String m_className;
private List<Property> m_properties = new ArrayList<Property>();

public void addProperty(Property property) {
m_properties.add(property);
}
}

๐ŸŽˆ ์ˆ˜์ง ๊ฑฐ๋ฆฌโ€‹

์‹œ์Šคํ…œ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์‹ถ์€๋ฐ, ์ด ์กฐ๊ฐ ์ € ์กฐ๊ฐ์ด ์–ด๋””์— ์ด๋Š”์ง€ ์ฐพ๊ณ  ๊ธฐ์–ตํ•˜๋Š๋ผ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์†Œ๋ชจํ•œ๋‹ค.

์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…์€ ์„ธ๋กœ๋กœ ๊ฐ€๊นŒ์ด ๋‘ฌ์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ๋‘ ๊ฐœ๋…์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์†ํ•œ๋‹ค๋ฉด ๊ทœ์น™์ด ํ†ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ํƒ€๋‹นํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค๋ฉด ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ฐœ๋…์€ ํ•œ ํŒŒ์ผ์— ์†ํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ protected ๋ณ€์ˆ˜๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋‹ค.

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

๋ณ€์ˆ˜ ์„ ์–ธ. ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์ด ์„ ์–ธํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ•จ์ˆ˜๋Š” ๋งค์šฐ ์งง์œผ๋ฏ€๋กœ ์ง€๊ฒฝ ๋ณ€์ˆ˜๋Š” ๊ฐ ํ•จ์ˆ˜ ๋งจ ์ฒ˜์Œ์— ์„ ์–ธํ•œ๋‹ค. ๋‹ค์Œ์€ JUnit 4.3.1์—์„œ ๊ฐ€์ ธ์˜จ ๋‹ค์†Œ ๊ธด ํ•จ์ˆ˜๋‹ค.

private static void readPreferences() {
InputStream is = null;

try {
is = new FileInputStream(getPreferencesFile());
setPreferences(new Properties(getPreferences()));
getPreferences().load(is);
} catch (IOException e) {
try {
if (is != null)
is.close();
} catch (IOException e1) {
// ...
}
}
}

๋ฃจํ”„๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ํ”ํžˆ ๋ฃจํ”„ ๋ฌธ ๋‚ด๋ถ€์— ์„ ์–ธํ•œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ ์—ญ์‹œ JUnit 4.3.1์—์„œ ๊ฐ€์ ธ์˜จ ์ž‘๊ณ  ๊ท€์—ฌ์šด ํ•จ์ˆ˜๋‹ค.

public int countTestCases() {
int count = 0;
for (Test each: tests)
count += each.countTestCases();
return count;
}

์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜. ๋ฐ˜๋ฉด, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค ๋งจ ์ฒ˜์Œ์— ์„ ์–ธํ•œ๋‹ค. ๋ณ€์ˆ˜ ๊ฐ„์— ์„ธ๋กœ๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค. ์ž˜ ์„ค๊ณ„ํ•œ ํด๋ž˜์Šค๋Š” ๋งŽ์€ (ํ˜น์€ ๋Œ€๋‹ค์ˆ˜) ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž˜ ์•Œ๋ ค์ง„ ์œ„์น˜์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋ชจ์€๋‹ค. ๋ณ€์ˆ˜ ์„ ์–ธ์„ ์–ด๋””์„œ ์ฐพ์„์ง€ ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

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

public class Assert {
static public void assertTrue(String message, boolean condition) {
if (!condition)
fail(message);
}

static public void assertTrue(boolean condition) {
assertTrue(null, condition);
}

static public void assertFalse(String message, boolean condition) {
assertTrue(message, !condition);
}

static public void assertFalse(boolean condition) {
assertFalse(null, condition);
}
// ...
}

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

๐ŸŽˆ ์„ธ๋กœ ์ˆœ์„œโ€‹

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

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

๐ŸŽƒ ๊ฐ€๋กœ ํ˜•์‹ ๋งž์ถ”๊ธฐโ€‹

์งง์€ ํ–‰์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. 100์ž๋‚˜ 120์ž์— ๋‹ฌํ•ด๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ด์ƒ์€ ์†”์งํžˆ ์ฃผ์˜๋ถ€์กฑ์ด๋‹ค.

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

๐ŸŽˆ ๊ฐ€๋กœ ๊ณต๋ฐฑ๊ณผ ๋ฐ€์ง‘๋„โ€‹

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

private void measureLine(String line) {
lineCount++;
int lineSize = line.length();
totalChars += lineSize;
lineWidthHistogram.addLine(lineSize, lineCount);
recordWidestLine(lineSize);
}

ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ•์กฐํ•˜๋ ค๊ณ  ์•ž๋’ค์— ๊ณต๋ฐฑ์„ ์คฌ๋‹ค. ํ• ๋‹น๋ฌธ์€ ์™ผ์ชฝ ์š”์†Œ์™€ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๊ฐ€ ๋ถ„๋ช…ํžˆ ๋‚˜๋‰œ๋‹ค. ๊ณต๋ฐฑ์„ ๋„ฃ์œผ๋ฉด ๋‘ ๊ฐ€์ง€ ์ฃผ์˜ ์š”์†Œ๊ฐ€ ํ™•์‹คํžˆ ๋‚˜๋‰œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋”์šฑ ๋ถ„๋ช…ํ•ด์ง„๋‹ค.

๋ฐ˜๋ฉด, ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ์ด์–ด์ง€๋Š” ๊ด„ํ˜ธ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ์„ ๋„ฃ์ง€ ์•Š์•˜๋‹ค. ํ•จ์ˆ˜์™€ ์ธ์ˆ˜๋Š” ์„œ๋กœ ๋ฐ€์ ‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ณต๋ฐฑ์„ ๋„ฃ์œผ๋ฉด ํ•œ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ ๋ณ„๊ฐœ๋กœ ๋ณด์ธ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๊ด„ํ˜ธ ์•ˆ ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. ์‰ผํ‘œ๋ฅผ ๊ฐ•์กฐํ•ด ์ธ์ˆ˜๊ฐ€ ๋ณ„๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

public class Quadratic {
public static double root1(double a, double b, double c) {
double determinant = determinant(a, b, c);
return (-b + Math.sqrt(determinant)) / (2*a);
}
}

์ˆ˜์‹์„ ์ฝ๊ธฐ๊ฐ€ ์•„์ฃผ ํŽธํ•˜๋‹ค. ์Šน์ˆ˜ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ์ด ์—†๋‹ค. ๊ณฑ์…ˆ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ญ ์‚ฌ์ด์—๋Š” ๊ณต๋ฐฑ์ด ๋“ค์–ด๊ฐ„๋‹ค. ๋ง์…ˆ๊ณผ ๋บ„์…ˆ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ณฑ์…ˆ๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐ŸŽˆ ๊ฐ€๋กœ ์ •๋ ฌโ€‹

public class FitNesseExpediter implements ResponseSender {
private Socket socket;
private InputStream input;
private OutputStream output;
private Request request;
private Response response;
private FitNesseContext context;
// ...
}

์œ„์™€ ๊ฐ™์€ ์ •๋ ฌ์€ ๋ณ„๋กœ ์œ ์šฉํ•˜์ง€ ๋ชปํ•˜๋‹ค. ์ฝ”๋“œ๊ฐ€ ์—‰๋šฑํ•œ ๋ถ€๋ถ„์„ ๊ฐ•์กฐํ•ด ์ง„์งœ ์˜๋„๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„ ์„ ์–ธ๋ถ€๋ฅผ ์ฝ๋‹ค ๋ณด๋ฉด ๋ณ€์ˆ˜ ์œ ํ˜•์€ ๋ฌด์‹œํ•˜๊ณ  ๋ณ€์ˆ˜ ์ด๋ฆ„๋ถ€ํ„ฐ ์ฝ๊ฒŒ ๋œ๋‹ค.

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

public class FitNesseExpediter implements ResponseSender {
private Socket socket;
private InputStream input;
private OutputStream output;
private Request request;
private Response response;
private FitNesseContext context;
// ...
}

๐ŸŽˆ ๋“ค์—ฌ์“ฐ๊ธฐโ€‹

๋ฒ”์œ„(scope)๋กœ ์ด๋ค„์ง„ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ์“ด๋‹ค. ๋“ค์—ฌ์“ฐ๋Š” ์ •๋„๋Š” ๊ณ„์ธต์—์„œ ์ฝ”๋“œ๊ฐ€ ์ž๋ฆฌ์žก์€ ์ˆ˜์ค€์— ๋น„๋ก€ํ•œ๋‹ค. ํด๋ž˜์Šค ์ •์˜์ฒ˜๋Ÿผ ํŒŒ์ผ ์ˆ˜์ค€์ธ ๋ฌธ์žฅ์€ ๋“ค์—ฌ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ํด๋ž˜์Šค ๋‚ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค๋ณด๋‹ค ํ•œ ์ˆ˜์ค€ ๋“ค์—ฌ์“ด๋‹ค. ๋ฉ”์„œ๋“œ ์ฝ”๋“œ๋Š” ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ณด๋‹ค ํ•œ ์ˆ˜์ค€ ๋“ค์—ฌ์“ด๋‹ค. ๋ธ”๋ก ์ฝ”๋“œ๋Š” ๋ธ”๋ก์„ ํฌํ•จํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ํ•œ ์ˆ˜์ค€ ๋“ค์—ฌ์“ด๋‹ค.

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

๋“ค์—ฌ์“ฐ๊ธฐํ•œ ํŒŒ์ผ์€ ๊ตฌ์กฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค. ๋ณ€์ˆ˜, ์ƒ์„ฑ์ž ํ•จ์ˆ˜, ์ ‘๊ทผ์ž ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธˆ๋ฐฉ ๋ณด์ธ๋‹ค. ๋ฐ˜๋ฉด, ๋“ค์—ฌ์“ฐ๊ธฐ ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์—ด์‹ฌํžˆ ๋ถ„์„ํ•˜์ง€ ์•Š๋Š”ํ•œ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋“ค์—ฌ์“ฐ๊ธฐ ๋ฌด์‹œํ•˜๊ธฐ. ๋•Œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ if๋ฌธ, ์งง์€ while ๋ฌธ, ์งง์€ ํ•จ์ˆ˜์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ณ ํ”ˆ ์œ ํ˜น์ด ์ƒ๊ธด๋‹ค. ์ด๋Ÿฐ ์œ ํ˜น์— ๋น ์งˆ ๋•Œ๋งˆ๋‹ค ๋‚˜๋Š” ํ•ญ์ƒ ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๋„ฃ๋Š”๋‹ค. ์ฆ‰, ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ ํ–‰์— ๋ฒ”์œ„๋ฅผ ๋ญ‰๋šฑ๊ทธ๋ฆฐ ์ฝ”๋“œ๋ฅผ ํ”ผํ•œ๋‹ค.

public class CommentWidget extends TextWidget {
public static final String REGEXP = "^#[^\r\n]*(?:(?:\r\n)|\n|\r)?";

public CommentWidget(ParentWidget parent, String text) {super(parent, text);}
public String render() throws Exception {return "";}
}

๋Œ€์‹ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๋ฒ”์œ„๋ฅผ ์ œ๋Œ€๋กœ ํ‘œํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค.

public class CommentWidget extends TextWidget {
public static final String REGEXP = "^#[^\r\n]*(?:(?:\r\n)|\n|\r)?";

public CommentWidget(ParentWidget parent, String text) {
super(parent, text);
}

public String render() throws Exception {
return "";
}
}

๐ŸŽˆ ๊ฐ€์งœ ๋ฒ”์œ„โ€‹

๋•Œ๋กœ๋Š” ๋นˆ while ๋ฌธ์ด๋‚˜ for ๋ฌธ์„ ์ ‘ํ•œ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ์— ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•˜๋ ค ์• ์“ด๋‹ค. ํ”ผํ•˜์ง€ ๋ชปํ•  ๋•Œ๋Š” ๋นˆ ๋ธ”๋ก์„ ์˜ฌ๋ฐ”๋กœ ๋“ค์—ฌ์“ฐ๊ณ  ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜๋Š” while ๋ฌธ ๋์— ์„ธ๋ฏธ์ฝœ๋ก  ํ•˜๋‚˜๋ฅผ ์‚ด์ง ๋ง๋ถ™์ธ ์ฝ”๋“œ๋กœ ์ˆ˜์—†์ด ๊ณจํƒ•์„ ๋จน์—ˆ๋‹ค. ์„ธ๋ฏธ์ฝœ๋ก ์€ ์ƒˆ ํ–‰์—๋‹ค ์ œ๋Œ€๋กœ ๋“ค์—ฌ์จ์„œ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ˆˆ์— ๋„์ง€ ์•Š๋Š”๋‹ค.

while (dis.read(buf, 0, readBufferSize) != -1)
;

๐ŸŽƒ ํŒ€ ๊ทœ์น™โ€‹

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

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