์ด ์๋ฃ์๋ ๋์ ํจ๊ป ์ผํ๋ ์ฌ๋๋ค์ Java ์ฝ๋์์ ๋ณธ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ช
๋ฐฑํ ์ด์ ๋ก ์ ์ ๋ถ์(์ฐ๋ฆฌ๋ qulice ์ฌ์ฉ )์ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ๋ชจ๋ ๊ฐ์งํ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๋์ดํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด๋ฌํ ์ค๋ฅ๋ ๋ชจ๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ, ํนํ Java์ ๊ด๋ จ์ด ์์ต๋๋ค.
ํด๋์ค ์ด๋ฆ
๊ทํ์ ํด๋์ค๋ " ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ " , " ์ปจํธ๋กค๋ฌ " , " ๊ด๋ฆฌ์ " ๋ฑ์ด ์๋ ์ค์ ๊ฐ์ฒด์ ์ถ์ํ์ฌ์ผ ํฉ๋๋ค . ํด๋์ค ์ด๋ฆ์ด "-er"๋ก ๋๋๋ฉด ์๋ชป๋ ๋์์ธ์ ๋๋ค. ๋ฌผ๋ก Apache์ StringUtils , FileUtils ๋ฐ IOUtils ์ ๊ฐ์ ์ํฐํจํด ๋์ฐ๋ฏธ ํด๋์ค ๋ ๋์ฐํ ๋์์ธ ํจํด์ ์ข์ ์์ ๋๋ค. ์ธํฐํ์ด์ค์ ํด๋์ค๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ์ ๋ฏธ์ฌ ๋๋ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ์ง ๋ง์ญ์์ค. ์๋ฅผ ๋ค์ด, IRecord , IfaceEmployee ๋๋ RecordInterface ์ ๊ฐ์ ์ด๋ฆ์ ๋ชจ๋ ๋์ฐํฉ๋๋ค . ์ผ๋ฐ์ ์ผ๋ก ์ธํฐํ์ด์ค ์ด๋ฆ์ ์ค์ ๊ฐ์ฒด์ ์ด๋ฆ์ด๊ณ , ํด๋์ค ์ด๋ฆ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ค๋ช ํด์ผ ํฉ๋๋ค. ๊ตฌํ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ธ๊ธํ ์ ์๋ ๊ฒฝ์ฐ " Default ", " Simple " ๋๋ ์ด์ ์ ์ฌํ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:class SimpleUser implements User {}; class DefaultRecord implements Record {}; class Suffixed implements Name {}; class Validated implements Content {};
๋ฉ์๋ ์ด๋ฆ
๋ฉ์๋๋ " something "์ ๋ฐํ ํ๊ฑฐ๋ " void "๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๋ฉ์๋๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ์ ๋ฐํ๋ ๋ด์ฉ์ ์ค๋ช ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด(" get " ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์ ):boolean isValid(String name); String content(); int ageOf(File file);
"
void "๊ฐ ๋ฐํ๋๋ฉด ์ด๋ฆ์ ๋ฉ์๋๊ฐ ์ํํ๋ ์์
์ ๋ช
ํํ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด ๊ท์น์๋
JUnit
void save(File file); void process(Work work); void append(File file, String line);
ํ
์คํธ ๋ฐฉ๋ฒ ์ด๋ผ๋ ๋จ ํ๋์ ์์ธ๊ฐ ์์ต๋๋ค . ์๋์ ์ค๋ช
๋์ด ์์ต๋๋ค.
ํ ์คํธ ๋ฐฉ๋ฒ ์ด๋ฆ
JUnit ํ ์คํธ์ ๋ฉ์๋ ์ด๋ฆ์ ๊ณต๋ฐฑ ์์ด ์์ด ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ช ํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค./** * HttpRequest can return its content in Unicode. * @throws Exception If test fails */ public void returnsItsContentInUnicode() throws Exception { }
JavaDoc์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ์ ํ
์คํธ ์ค์ธ ํด๋์ค ์ด๋ฆ๊ณผ "
can "์ผ๋ก ์์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ์ ํญ์ " ๋๊ตฐ๊ฐ๋ ๋ญ๊ฐ๋ฅผ ํ ์ ์๋ค " ๋ผ๋ ๋ฌธ๊ตฌ์ ๊ฐ์์ผ ํฉ๋๋ค . ๋ฉ์๋ ์ด๋ฆ์ ๋์ผํ ๋ด์ฉ์ ๋ํ๋ด์ง๋ง ํ
์คํธ ๋์์ ์์ต๋๋ค. ๋ฉ์๋ ์ด๋ฆ์ ์์ ๋ถ๋ถ์ ์ถ๊ฐํ๋ฉด ์์ ์์ ๊ฐ์ด ์์ ํ ์์ด ๋ฌธ์ฅ์ด ํ์๋ฉ๋๋ค. "
HttpRequest๋ ํด๋น ์ฝํ
์ธ ๋ฅผ ์ ๋์ฝ๋๋ก ๋ฐํํฉ๋๋ค ." ํ
์คํธ ๋ฉ์๋ ์ด๋ฆ์ โ
can โ์ผ๋ก ์์ํ์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ธ์. JavaDoc ์ฃผ์๋ง "
can "์ผ๋ก ์์ํฉ๋๋ค. ๋ํ ๋ฉ์๋ ์ด๋ฆ์ ๋์ฌ๋ก ์์ํด์๋ ์ ๋ฉ๋๋ค(
๋ฒ์ญ์์ ๋ง์ ๋ฐ๋ฅด๋ฉด, ๋ถ๋ช
ํ ์ ์๋ ๋์ฌ์ ๋ช
๋ นํ์ ์๋ฏธํ๋ค๊ณ ํฉ๋๋ค ). ํ
์คํธ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ ์์ธ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ณ์ ์ด๋ฆ
timeOfDay , firstItem ๋๋ httpRequest ์ ๊ฐ์ ๋ณตํฉ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ๋ง์ธ์ . ํด๋์ค ๋ณ์์ ๋ฉ์๋ ๋ณ์๋ฅผ ๋ชจ๋ ์๋ฏธํฉ๋๋ค. ๋ณ์ ์ด๋ฆ์ ํด๋น ๋ฒ์์์ ๋ชจํธํจ์ ํผํ ์ ์์ ๋งํผ ๊ธธ์ด์ผ ํ์ง๋ง ๊ฐ๋ฅํ๋ฉด ๋๋ฌด ๊ธธ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ฆ์ ๋จ์ ๋๋ ๋ณต์ ๋ช ์ฌ์ฌ์ผ ํฉ๋๋ค. ์: ์์ฑ์๊ฐ ์์ฑ๋ ๊ฐ์ฒด์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ ์์ฑ์ ๋งค๊ฐ๋ณ์์ ํด๋์ค ํ๋ ์ฌ์ด์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ชจ์์ ์ ๊ฑฐํ์ฌ ์ฝ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์: ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ข์ ๋ณ์ ์ด๋ฆ์ ํด๋น ํด๋์ค์ ์ด๋ฆ์ ๋๋ค. ๊ทธ๋ฅ ๋๋ฌธ์๋ก ์ฐ๋ฉด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ฐ์ ๊ธฐ๋ณธ ์ ํ์ ๋ํด์๋ ์ ๋๋ก ๋์ผํ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค . ํน์ฑ์ด ๋ค๋ฅธ ์ฌ๋ฌ ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํ์ฉ์ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:List
names; void sendThroughProxy(File file, Protocol proto); private File content; public HttpRequest request;
public class Message { private String recipient; public Message(String rcpt) { this.recipient = rcpt; } }
File file; User user; Branch branch;
Integer number
String string
String contact(String left, String right);
์์ฑ์
์์ธ ์์ด ๊ฐ์ฒด ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์ฑ์๋ ํ๋๋ง ์์ด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์์ฑ์๋ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. public class Server { private String address; public Server(String uri) { this.address = uri; } public Server(URI uri) { this(uri.toString()); } }
์ผํ์ฑ ๋ณ์
์ด๋ค ์ผ์ด ์์ด๋ ์ผํ์ฑ ๋ณ์๋ฅผ ํผํ์ธ์. "์ผํ์ฉ"์ด๋ ํ ๋ฒ ์ฌ์ฉ๋๋ ๋ณ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์์์์ ๊ฐ์ดString name = "data.txt"; return new File(name);
๋ณ์๋ ํ ๋ฒ๋ง ์ฌ์ฉ๋๋ฉฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋จ์ํ๋ ์ ์์ต๋๋ค.
return new File("data.txt");
๋๋ก๋ ๋งค์ฐ ๋๋ฌธ ๊ฒฝ์ฐ(์ฃผ๋ก ๋ ๋์ ํ์ํ๋ก ์ธํด) ์ผํ์ฑ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฌํ ์ํฉ์ ํผํ๋ ค๊ณ ๋
ธ๋ ฅํ์ญ์์ค.
์์ธ.
๋ฌผ๋ก , ์์ธ๋ฅผ ์ ๋๋ก "์ผ์ผ์๋" ์ ๋๋ฉฐ, ๊ฐ๋ฅํ ํ ๋๊ฒ ๋์ ธ์ผ ํฉ๋๋ค. ๊ฐ์ธ ๋ฉ์๋์ ์์ธ๋ ์ธ๋ถ์์ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ํ๋ฆ์ ์ ์ดํ๊ธฐ ์ํด ์์ธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์์ ์ ์ฝ๋๊ฐ ์๋ชป๋์์ต๋๋ค.int size; try { size = this.fileSize(); } catch (IOException ex) { size = 0; }
IOException์ "๋์คํฌ๊ฐ ๊ฝ ์ฐผ์ต๋๋ค"๋ผ๊ณ ํ์๋๋ฉด ํ์ผ ํฌ๊ธฐ๊ฐ 0์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ๊ณ์ ์งํํ์๊ฒ ์ต๋๊น?
๋ค์ฌ ์ฐ๊ธฐ.
๋ค์ฌ์ฐ๊ธฐ์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๊ดํธ๊ฐ ์ค์ ๋๋ด๊ฑฐ๋ ๊ฐ์ ์ค์์ ๋๋์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค(๋ซ๋ ๊ดํธ์๋ ๋ฐ๋ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค). ์๋ ์์์๋ ์ฒซ ๋ฒ์งธ ๊ดํธ๊ฐ ๊ฐ์ ์ค์์ ๋ซํ์ง ์๊ณ ๊ทธ ๋ค์ ๋ฌธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ ๋ฒ์งธ ๋๊ดํธ ์์๋ ๋ฌธ์๊ฐ ์๊ณ ํ์ฌ ์ค์๋ ์ฌ๋ ๋๊ดํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.final File file = new File(directory, "file.txt");
์ฌ๋ฐ๋ฅธ ๋ค์ฌ์ฐ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join( Arrays.asList("a", "b") ) ), "separator" );
๋ค์ฌ์ฐ๊ธฐ์ ๋ ๋ฒ์งธ ์ค์ํ ๊ท์น์ ๊ฐ๋ฅํ ํ ๋ง์ ๋ด์ฉ์ ํ ์ค(80์ ์ด๋ด)์ ๋ฐฐ์นํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์์ ์๋ ์์ถ๋ ์ ์์ผ๋ฏ๋ก ์ ํจํ์ง ์์ต๋๋ค.
StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join(Arrays.asList("a", "b")) ), "separator" );
์ค๋ณต ์์.
ํด๋์ค ์์๋ ํด๋์ค ๋ฉ์๋ ๊ฐ์ ์ ๋ณด์ ๋ํ ์ ๊ทผ์ ๊ณต์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ์ด ์ ๋ณด๋ ํด๋์ค์ ํน์ง( ! )์ ๋๋ค. ๋ฌธ์์ด์ด๋ ์ซ์ ๋ฆฌํฐ๋ด์ ๋์ ํ์ฌ ์์๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. ๋งค์ฐ ๋์ ์ต๊ด์ ๋๋ค. ์ฝ๋๊ฐ ์ค์ผ๋ ์ ์์ต๋๋ค. ๋ค๋ฅธ OOP ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋ ์ค์ ์ธ๊ณ์์ ์๋ฏธ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ค์ ์ธ๊ณ์์ ์ด๋ฌํ ์์์ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?class Document { private static final String D_LETTER = "D"; // bad practice private static final String EXTENSION = ".doc"; // good practice }
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ค์๋ ํ
์คํธ ๋ฉ์๋์์ ๋ฌธ์์ด/์ซ์ ๋ฆฌํฐ๋ด์ ์ค๋ณต์ ํผํ๊ธฐ ์ํด ๋จ์ ํ
์คํธ์์ ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฑฐ ํ์ง๋ง! ๊ฐ ํ
์คํธ ๋ฐฉ๋ฒ์ ์์ฒด ์
๋ ฅ ๊ฐ ์ธํธ์์ ์๋ํด์ผ ํฉ๋๋ค. ๊ฐ๊ฐ์ ์๋ก์ด ํ
์คํธ ๋ฐฉ๋ฒ์ ์๋ก์ด ํ
์คํธ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. ํ
์คํธ๋ ๋
๋ฆฝ์ ์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋์ผํ ์
๋ ฅ ์์๋ฅผ ๊ณต์ ํด์ผ ํ ๊น์?
ํ ์คํธ ๋ฐ์ดํฐ ์ปคํ๋ง.
๋ค์์ ํ ์คํธ ๋ฉ์๋๋ฅผ ํํนํ๋ ์์ ๋๋ค:User user = new User("Jeff"); // maybe some other code here MatcherAssert.assertThat(user.name(), Matchers.equalTo("Jeff"))
; ๋ง์ง๋ง ์ค์์๋ "
Jeff "๋ฅผ ์ฒซ ๋ฒ์งธ ์ค์ ์ง์ ๋ ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ ์ฐ๊ฒฐํฉ๋๋ค. ๋ช ๋ฌ ํ ๋๊ตฐ๊ฐ๊ฐ ์ธ ๋ฒ์งธ ์ค์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ ๊ฒฝ์ฐ ์ด ๋ฐฉ๋ฒ์์ "
Jeff "๊ฐ ์ฌ์ฉ ๋ ๋ค๋ฅธ ์์น๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ถ๊ฐ ์๊ฐ์ ์๋นํด์ผ ํฉ๋๋ค . ์ด๋ฌํ ๋ฐ์ดํฐ ๊ฑธ๋ฆผ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ณ์๋ฅผ ๋์
ํด์ผ ํฉ๋๋ค.
GO TO FULL VERSION