์๋์ ์ ํ ๊ท์น๋ค์ ๋จ์ํ ๊ฐ์ด๋๋ผ์ธ์ด๋ ๊ถ์ฅ์ฌํญ์ด ์๋, ์๊ฒฉํ ๊ท์น์ด๋ค. ํด๋น ๊ท์น์ ์งํค์ง ์์ ์๋๋ก์ด๋ ํ๋ก์ ํธ์ ๋ํ ์ฝ๋ ๊ธฐ์ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์๋ค์ฌ์ง์ง ์์ ๊ฒ์ด๋ค.
ํ์ฌ ์กด์ฌํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ์ด ๊ท์น์ ๋ฐ๋ฅด์ง๋ ์์ง๋ง, ์๋ก์ด ์ฝ๋๋ค์ ์ด ๊ท์น๋ค์ ๋ฐ๋ฅผ ๊ฒ์ ๊ธฐ๋ํ๋ค.
์๋ฐ์ ํ์ค ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ฐ๋ฅด๋ ๋ช ๊ฐ์ง ๊ท์น์ ์ถ๊ฐํ๋ค.
์ฝ๋๋ฅผ ์ง๋ค ๋ณด๋ฉด ๋๋ก๋ ์๋์ ์์ฒ๋ผ ์ต์ ์ ์ ์์ ํ ๋ฌด์ํ๊ณ ์ถ์ด์ง ๋๊ฐ ์์ ๊ฒ์ด๋ค.
void setServerPort(String value) {
try {
serverPort = Integer.parseInt(value);
} catch (NumberFormatException e) { }
}
์ ๋ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง์๋ ์ ๋๋ค. ๋น์ ์ ์ฝ๋๊ฐ ์ ๋๋ก ์๋ฌ๋ฅผ ์ผ์ผํค์ง ์์ ๊ฑฐ๋ผ๊ณ , ๋๋ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํ ์๋ ์์ผ๋ ์์ฒ๋ผ ์ต์ ์ ์ ๋ฌด์ํ๋ ๊ฒ์ ์ธ์ ๊ฐ ๋น์ ์ ์ฝ๋๋ฅผ ๋ค๋ฃฐ ๋๊ตฐ๊ฐ์๊ฒ ์ง๋ขฐ๋ฅผ ๊น์์ฃผ๋ ๊ฒ๊ณผ ๋ค๋ฆ์๋ค. ๋ฐ๋ผ์ ์ฝ๋์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์ต์ ์ ์ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ์ฒ๋ฆฌํด์ผ ํ๋ค. ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ง๋ค ๋ค๋ฅผ ๊ฒ์ด๋ค.
๋๊ตฌ๋ ๋น์ด ์๋ ์บ์น
catch
๊ตฌ๋ฌธ์ ๋ง๋ค ๋๋ ๋ญ๊ฐ ์ฌ๋ฉํ ๊ธฐ๋ถ์ด ๋ค์ด์ผ ํ๋ค. ๋ฌผ๋ก ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ณ์ ๋๊ฐ ๋ถ๋ช ํ ์์ง๋ง, ์ ์ด๋ ๋ค์ ํ ๋ฒ ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค. ์๋ฐ๋ฅผ ์งค ๋๋ ๊ทธ ์ฌ๋ฉํ ๊ธฐ๋ถ์ ๋ฌด์ํด์ ์ ๋๋ค. ์ ์์ค ๊ณ ์ฌ๋ง
ํ์ฉํ ๋งํ ๋์๋ค์ ์๋์ ๊ฐ๋ค. ๋ชฉ๋ก์ ์์ ์์์๋ก ์ ํธ๋๊ฐ ๋์ ๋ฐฉ๋ฒ์ด๋ค.
-
์ต์ ์ ์ ํด๋น ๋ฉ์๋์ ์ฝ๋ฌ(caller)์ ๋ฐ์์ํจ๋ค.
void setServerPort(String value) throws NumberFormatException { serverPort = Integer.parseInt(value); }
-
์ถ์(abstraction) ์ ๋์ ๋ง๋ ์๋ก์ด ์ต์ ์ ์ ๋ฐ์์ํจ๋ค.
void setServerPort(String value) throws ConfigurationException { try { serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { throw new ConfigurationException("Port " + value + " is not valid."); } }
-
์บ์น ๋ธ๋ก ์์์ ์ ๋นํ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค.
/** Set port. If value is not a valid number, 80 is substituted. */ void setServerPort(String value) { try { serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { serverPort = 80; // default port for server } }
-
์ต์ ์ ์ ์บ์นํ ๋ค ์๋ก์ด ๋ฐํ์์ต์ ์
RuntimeException
์ ๋ฐ์์ํจ๋ค. ์ํํ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ๋ฐ๋ฅธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ด ํฌ๋์(crash)๋ ํ์ ์ด ์์ ๋๋ง ์ฌ์ฉํ๋ผ./** Set port. If value is not a valid number, die. */ void setServerPort(String value) { try { serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { throw new RuntimeException("port " + value " is invalid, ", e); } }
์ปจ์คํธ๋ญํฐ(constructor)์๊ฒ ๋ฐํ์์ต์ ์ ์ด ์ ํด์ง ๋ ์๋ ๋ฐ์ํ ์ต์ ์ ์ด ๊ฐ์ด ์ ๋ฌ๋๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ์๋ฐ 1.3 ๋ฏธ๋ง์ ๋ฒ์ ์์ ์ปดํ์ผ์ ํด์ผ ํ๋ค๋ฉด ์์ธ์ด ๋๋ ์ต์ ์ ์ ์ฝ๋์์ ์ ์ธํด์ผ ํ๋ค.
-
์ตํ์ ๋ณด๋ฃจ: ์ต์ ์ ์ ๋ฌด์ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๋ค๋ ํ์ ์ด ๋ ๋ค๋ฉด ๊ทธ๋ ๊ฒ ํด๋ ์ข๋ค. ๋ค๋ง ํฉ๋นํ ์ด์ ๋ฅผ ๊ผญ ์ฝ๋ฉํธ๋ก ๋จ๊ธฐ์.
/** If value is not a valid number, original port number is used. */ void setServerPort(String value) { try { serverPort = Integer.parseInt(value); } catch (NumberFormatException e) { // Method is documented to just ignore invalid user input. // serverPort will just be unchanged. } }
์ข ์ข ์ต์ ์ ์ ์ก์๋ด๋ ๊ฒ์ ๊ฒ์๋ฌ์ ธ ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ์ง๊ณ ์ถ์ ๋๊ฐ ์๋ค.
try {
someComplicatedIOFunction(); // may throw IOException
someComplicatedParsingFunction(); // may throw ParsingException
someComplicatedSecurityFunction(); // may throw SecurityException
// phew, made it all the way
} catch (Exception e) { // I'll just catch all exceptions
handleError(); // with one generic handler!
}
ํ์ง๋ง ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๋ฉด ์ ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ผ๋ฐ์ ์ธ ์ต์
์
์ด๋ ์ฐ๋ก์ด๋ธ(throwable)์ ์บ์นํ๋ ๊ฒ์ ์ ์ ํ์ง ๋ชปํ
์ ํ์ด๋ค. (preferably not Throwable, because it includes Error exceptions as well.) ๋งค์ฐ ์ํํ ์ฝ๋๋ก
์๋ฅผ ๋ค์ด ํด๋์ค์บ์คํธ์ต์
์
ClassCastException
๊ฐ์ ๋ฐํ์์ต์
์
RuntimeExceptions
๋ฑ์ ์ ํ ์์ํ์ง ๋ชปํ ์ต์
์
์ด
์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์ ์๋ฌ ํธ๋ค๋ง์์์ผ ์บ์น๋ ๊ฒ์ด๋ค. ์ด๋ฐ ๋ฐฉ์์ ์ฝ๋๊ฐ ๋ค์ํ ์คํจ ์ํฉ์ ๋์ฒํ์ง ๋ชปํ๊ฒ ํ๋๋ฐ, ์ด๋ ๋๊ตฐ๊ฐ
๋น์ ์ ์ฝ๋๊ฐ ํธ์ถํ๋ ๊ณณ์ ์๋ก์ด ์ข
๋ฅ์ ์ต์
์
์ ๋ง๋ค์์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ ์๋ก์ด ์๋ฌ๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ค๋ค์ผ ํ๋ค๋ ๋ฉ์์ง๋ฅผ
๋น์ ์๊ฒ ์ ๋ฌํ์ง ๋ชปํ๋ค๋ ์๋ฏธ๋ค. ๊ฒ๋ค๊ฐ ์ด์จ๋ ๊ทธ๋ ๊ฒ ๋ค๋ฅธ ์ข
๋ฅ์ ์ต์
์
์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์๋ ์ ๋๋ค.
์ด ๊ท์น์๋ ์์ฃผ ๋๋ฌธ ์์ธ๊ฐ ์๋ค. UI์ ๋ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค๋ ์ง, ๋ฐฐ์น ์ก(batch job)์ ๊ณ์ ๋๋ ค์ผ ํ๋ค๋ ์ง ํ๋ ๊ฒฝ์ฐ์ ๋ชจ๋ ์ข ๋ฅ์ ์๋ฌ๋ฅผ ์บ์นํ ์ต์์ ์ฝ๋๋ ํ ์คํธ ์ฝ๋๊ฐ ํ์ํ ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ์ผ๋ฐ์ ์ธ ์ต์ ์ ์ด๋ ์ฐ๋ก์ด๋ธ์ ์บ์นํด์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด๋ ๋๋ค. ํ์ง๋ง ์ด์ ๊ฐ์ ์ฒ๋ฆฌ๋ ์ธ์ ๋ ์ฃผ์ํด์ผ ํ๋ฉฐ ์ ์ด ์ํฉ์ ์ด๋ฐ ์ฒ๋ฆฌ๊ฐ ์์ ํ์ง ์ค๋ช ํ๋ ์ฝ๋ฉํธ๋ฅผ ๊ผญ ๋ฌ์์ผ ํ๋ค.
์ผ๋ฐ์ ์ต์ ์ ์ ์บ์นํ๋ ๋์๋ค:
-
ํ๋์ ํธ๋ผ์ด
try
๋ฌธ ๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ ์บ์น ๋ธ๋ก์ ์์ฑํ๋ค. ๋ณด๊ธฐ์ ์ด์ํ ์๋ ์์ง๋ง ์ฌ์ ํ ํ ๋ฒ์ ๋ชจ๋ ์ต์ ์ ์ ์บ์นํ๋ ๊ฒ๋ณด๋ค ๋ซ๋ค. ์ด ๋ ๊ฐ ์บ์น ๋ธ๋ก ์์ ์ค๋ณต ์ฝ๋๋ฅผ ๋๋ฌด ๋ง์ด ์์ฑํ์ง ์๋๋ก ์ฃผ์ํ์. -
์กฐ๋ฐํ๊ฒ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ๋ ๋ง์ ํธ๋ผ์ด ๋ธ๋ก์ผ๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง(refactoring)ํ๋ผ. Split up the IO from the parsing, handle errors separately in each case.
-
์ต์ ์ ์ ๋ค์ ์ฐ๋ก์ฐ(rethrow)ํ๋ผ. ๋ง์ ๊ฒฝ์ฐ ์ด์ฐจํผ ํด๋น ๋จ๊ณ์์ ์ต์ ์ ์ ์บ์นํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ธ๋ ์ฐ๋ฆฌ์ ์น๊ตฌ์์ ๋ช ์ฌํ์. ์ปดํ์ผ๋ฌ๊ฐ ๋น์ ์ด ์ต์ ์ ์ ์บ์นํ์ง ์๊ณ ์๋ค๊ณ ๋ถ๋ง์ ํ๋ฉด ์ฐํธ๋ฆฌ์ง ๋ง๊ณ ์์ด๋ผ. ์ปดํ์ผ๋ฌ๋ ๋น์ ์ ์ฝ๋์์ ๋ฐ์ํ ์ ์๋ ๋ฐํ์ ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ํด๊ฒฐํด์ฃผ๊ณ ์ ํ ๋ฟ์ด๋ค.
ํ์ด๋๋ผ์ด์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ฝ๋ ์ ๋ ๋ ์คํ๋ ์ฝ๋๋ฅผ ์ง๋๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.
์ฅ์ : ํนํ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ํฌํจํด ์ฌ๋ฌ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ํ ๋ ํธ๋ฆฌํ๋ค.
๋จ์ : ์ธ์ ํ์ด๋๋ผ์ด์ ๊ฐ ํธ์ถ๋ ์ง, ์ฌ์ง์ด ํ์ด๋๋ผ์ด์ ๊ฐ ํธ์ถ์ด ๋๋์ง ์ ๋๋์ง๋ ์ ํํ ์๊ธฐ๊ฐ ์ด๋ ต๋ค.
๊ฒฐ๋ก : ํ์ด๋๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ด๋๋ผ์ด์ ๊ฐ ํ ์ผ์ ์ฌ๋ฐ๋ฅธ ์ต์
์
์ฒ๋ฆฌ๋ฅผ ํตํด ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
์ ํ์ํ๋ค๋ฉด close()
๋ฉ์๋๋ ๊ทธ ๋น์ทํ ๊ฒ์ ์ ์ํ๊ณ ์ ํํ ์ธ์ ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋์ด์ผ ํ๋์ง๋ฅผ ๋ฌธ์๋ก ์์ฑํ๋ผ.
See InputStream for an example. In this case it is appropriate but not required to print a short
log message from the finalizer, as long as it is not expected to flood the logs.
ํจํค์ง foo
์ ํด๋์ค Bar
๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ํฌํธ๋ฅผ ํ ๋ ๋ ๊ฐ์ง ์ ํ์ง๊ฐ ์๋ค.
-
import foo.*;
์ฅ์ : ์ํฌํธ๋ฌธ์ ์๋ฅผ ์ค์ผ ์ ์๋ค.
-
import foo.Bar;
์ฅ์ : ์ ํํ ์ด๋ค ํด๋์ค๊ฐ ์ฌ์ฉ๋๋์ง ์ ์ ์๋ค. ์ ์ง๋ณด์์ ์ ๋ฆฌํ๋ค.
๊ฒฐ๋ก : ๋ชจ๋ ์๋๋ก์ด๋ ํ๋ก์ ํธ์์๋ ํ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ผ. ํน๋ณํ ์์ธ๋ฅผ ๋๋ค๋ฉด ์๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(java.util.*
,
java.io.*
, etc.)๋ ์ ๋ ํ
์คํธ ์ฝ๋(junit.framework.*
) ์ ๋๋ค.
์๋๋ก์ด๋์ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด์ ์ฌ์ฉํ ๋์๋ ์ง์ผ์ผ ํ ์ปจ๋ฒค์ ์ด ์๋ค. ์ปจ๋ฒค์ ์ ํต์ฌ์ ์ธ ์ฌํญ์ด ๋ฐ๋์ด ์ด์ ์ ์ฝ๋๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ณ ์ฌ๋ผ์ง(deprecated) ํจํด์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๊ฐ ์๋ค. ๊ทธ๋ ๊ฒ ์ง์ฌ์ ธ ์๋ ์ฝ๋๋ฅผ ๋ค๋ฃฐ ๋๋ ํ์ฌ ์ ์ง๋๊ณ ์๋ ์คํ์ผ์ ๊ณ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ผ๋ ์๋ก์ด ์ฝ๋๋ฅผ ์งค ๋๋ ์ ๋ ์ฌ๋ผ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ.
๋ชจ๋ ํ์ผ์ ์ ์๊ถ์ ๋ํ ๊ธฐ์ ๋ก ์์ํด์ผ ํ๋ค. ๊ทธ ๋ค๋ก ํจํค์ง์ ์ํฌํธ์ ๊ดํ ๋ฌธ๊ตฌ๊ฐ ์ด์ด์ง๋๋ฐ ๊ฐ ๋ธ๋ก์ ํ ์ค์ ๋์ด๋ค. ๊ทธ ์๋๋ก ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๋ค. ๊ทธ ๋ค์ ์๋ฐ๋ ์ฝ๋ฉํธ๋ก ๊ฐ ํด๋์ค์ ์ธํฐํ์ด์ค๊ฐ ๋ฌด์์ ํ๋์ง๋ฅผ ๊ธฐ์ ํ๋ผ.
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.foo;
import android.os.Blah;
import android.view.Yada;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Does X and Y and provides an abstraction for Z.
*/
public class Foo {
...
}
๋น์ ์ด ๋ง๋ ๋ชจ๋ ํด๋์ค์ ์ด๋ฆ์ผ๋ก ๋ดค์ ๋ ๊ธฐ๋ฅ์ด ์๋ช ํ์ง ์์(nontrivial) ํผ๋ธ๋ฆญ ๋ฉ์๋์๋ ๊ฐ ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ฌด์จ ์ผ์ ํ๋์ง ์ ์ด๋ ํ ์ค ์ด์์ ์๋ฐ๋ ์ฝ๋ฉํธ๋ฅผ ๋ฌ์. ์ด ๋ ๊ฐ ์ฝ๋ฉํธ๋ 3์ธ์นญ ๋จ์ํ ๋์ฌ๋ก ์์ํด์ผ ํ๋ค.
์:
/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
...
}
๋๋
/**
* Constructs a new String by converting the specified array of
* bytes using the platform's default character encoding.
*/
public String(byte[] bytes) {
...
}
์ฝ๋ฉํธ์ ๋ด์ฉ์ด ๋จ์ง "Foo๋ฅผ ์ค์ ํ๋ค(sets Foo)" ๋ฑ ์๋ช ํ ์ด๋ฆ์ ๊ฒ(get)๊ณผ ์ (set) ๋ฉ์๋์๋ ์๋ฐ๋ ์ฝ๋ฉํธ๋ฅผ ๋ฌ ํ์๊ฐ ์๋ค. ํ์ง๋ง ํด๋น ๋ฉ์๋๊ฐ ์กฐ๊ธ ๋ ๋ณต์กํ ์ผ, ์๋ฅผ ๋ค์ด ์ ์ฝ ์กฐ๊ฑด์ ๊ฐํํ๋ค๊ฑฐ๋ ์ค๋ํ ๋ถ์์ฉ์ ์ผ๊ธฐํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ผญ ๋ฌธ์ํ๋ฅผ ํด์ผ ํ๋ค. ๋ํ "Foo"๋ผ๋ ์์ฑ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ์๋ช ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ํ๊ฐ ํ์ํ๋ค.
๋น์ ์ด ์์ฑํ๋ ๋ชจ๋ ๋ฉ์๋๋ค์, ๊ทธ๊ฒ์ด ํผ๋ธ๋ฆญ์ด๋ ์๋๋ , ์๋ฐ๋ ์ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค. API์ ์ผ๋ถ๊ฐ ๋๋ ํผ๋ธ๋ฆญ ๋ฉ์๋์ ๊ฒฝ์ฐ๋ ๋น์ฐํ ์๋ฐ๋ ์ ํ์๋ก ํ๋ค.
์๋๋ก์ด๋๋ ํ์ฌ ์๋ฐ๋ ์ฝ๋ฉํธ๋ฅผ ์ฌ์ฉํจ์ ์์ด ํน์ ํ ์คํ์ผ์ ์ ์ํ๊ณ ์์ง ์์ง๋ง ์๋ฐ๋ ํด์ ์ํ ๋ฌธ์ํ(How to Write Doc Comments for the Javadoc Tool) ์ ์ง์ ์ฌํญ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข๋ค.
๊ฐ๋ฅํ ํ๋ ๋ด์์ ๋ฉ์๋๋ ํ ์ฃผ์ ์ ๋ง๊ฒ ์งง๊ฒ ์์ฑ๋์ด์ผ ํ๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ธด ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ณ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ๊ธธ์ด์ ์ ํํ ์ ํด์ง ์ ํ์ ์๋ค. ํ ๋ฉ์๋์ ๊ธธ์ด๊ฐ 40์ค์ ๋์ด๊ฐ๊ฒ ๋๋ฉด ์ ์ฒด ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๋ฅผ ํด์น์ง ์๋ ์ ์์ ์ฝ๋๋ฅผ ๋๋ ์ ์๋์ง ์๊ฐํด๋ณด๋ผ.
ํ๋๋ ํ์ผ์ ์๋จ์ด๋, ๊ทธ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฉ์๋ ๋ฐ๋ก ์ง์ ์ ์ ์๋์ด์ผ ํ๋ค.
์ง์ญ(local) ๋ณ์์ ์ค์ฝํ๋ ์ต์ํ์ผ๋ก ์ ์ง๋์ด์ผ ํ๋๋ฐ ๊ทธ๋ผ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ ํธ์ด์ฑ์ด ๋์์ง ๋ฟ๋ง ์๋๋ผ ์๋ฌ์ ๊ฐ๋ฅ์ฑ๋ ๋ฎ์ถ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ชจ๋ ๋ณ์๋ ๊ทธ ๋ณ์๊ฐ ์ฌ์ฉ๋๋ ๋ฒ์๋ฅผ ๋ชจ๋ ๊ฐ์ ์ ์๋ ๊ฐ์ฅ ์์ชฝ์ ๋ธ๋ก์์ ์ ์ธ๋์ด์ผ ํ๋ค.
์ง์ญ ๋ณ์๋ ์ฒ์ ์ฌ์ฉ๋๋ ์์ ์ ์ ์ธ๋์ด์ผ ํ๋ค. ๊ฑฐ์ ๋ชจ๋ ์ง์ญ ๋ณ์์ ์ ์ธ์ ์ด๊ธฐํ๊ฐ ๋๋ฐ๋๋ ๊ฒ์ด ์ณ๋ค. ๋ณ์๋ฅผ ์ ์ธํ๋ ์์ ์์ ์ด๋ค ๊ฐ์ผ๋ก ์ด๊ธฐํํ ์ง ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๊ทธ๋ฐ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ ์์ ๊น์ง ๋ณ์์ ์ ์ธ์ ๋ฏธ๋ค์ผ ํ๋ค.
์ด ๊ท์น์ ํ ๊ฐ์ง ์์ธ๊ฐ ์๋ค๋ฉด ํธ๋ผ์ดtry
-์บ์นcatch
๋ฌธ์ ์ฌ์ฉํ ๋๋ค. ๋ง์ฝ ์ด๋ค ๋ณ์๊ฐ ์์ธ ์ฒ๋ฆฌ๋๋
๋ฉ์๋์ ๋ฐํ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ ๊ฒฝ์ฐ ํธ๋ผ์ด ๋ธ๋ก ์์์ ์ด๊ธฐํ๋์ด์ผ ํ ๊ฒ์ด๋ค. ๋ง์ฝ ๋ค์ ์์ ๊ฐ์ด ๊ทธ ๋ณ์๊ฐ ํธ๋ผ์ด ๋ธ๋ก ๋ฐ๊นฅ์์
์ฌ์ฉ๋์ด์ผ ํ๋ค๋ฉด ํด๋น ๋ณ์๋ ํธ๋ผ์ด ๋ธ๋ก ์ด์ ์ ์ด๊ธฐํ ์์ด ์ ์ธ๋ ์ ์๋ค.
// Instantiate class cl, which represents some sort of Set
Set s = null;
try {
s = (Set) cl.newInstance();
} catch(IllegalAccessException e) {
throw new IllegalArgumentException(cl + " not accessible");
} catch(InstantiationException e) {
throw new IllegalArgumentException(cl + " not instantiable");
}
// Exercise the set
s.addAll(Arrays.asList(args));
ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ์๋ ํธ๋ผ์ด-์บ์น ๋ธ๋ก ์์ฒด๋ฅผ ๋ฉ์๋์ ์ธ์บก์๋ ์ด์ ํจ์ผ๋ก์จ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ๋ ๊ฒ์ ํผํ ์ ์๋ค.
Set createSet(Class cl) {
// Instantiate class cl, which represents some sort of Set
try {
return (Set) cl.newInstance();
} catch(IllegalAccessException e) {
throw new IllegalArgumentException(cl + " not accessible");
} catch(InstantiationException e) {
throw new IllegalArgumentException(cl + " not instantiable");
}
}
...
// Exercise the set
Set s = createSet(cl);
s.addAll(Arrays.asList(args));
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ๋๋ ๋ณ์๋ ๊ผญ ๊ทธ๋ฌ์ง ๋ง์์ผ ํ ์ด์ ๊ฐ ์๋ ํ ๋ฐ๋ณต๋ฌธ ๋ด๋ถ์์ ์ ์ธ๋์ด์ผ ํ๋ค.
for (int i = 0; i < n; i++) {
doSomething(i);
}
๊ฐ์ ์๋ค.
for (Iterator i = c.iterator(); i.hasNext(); ) {
doSomethingElse(i.next());
}
์ํฌํธ๋ฌธ์ ๋ค์์ ์์๋ก ์ ๋ ฌํ๋ค.
-
์๋๋ก์ด๋ ์ํฌํธ
-
์จ๋ํํฐ ์ํฌํธ(
com
,junit
,net
,org
) -
java
์javax
IDE ์ค์ ๊ณผ ์ ํํ ๋ง์ถ๊ธฐ ์ํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค:
-
๊ฐ๊ฐ์ ๊ทธ๋ฃน ๋ด์์๋ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌํ๋ค. ๋๋ฌธ์๊ฐ ์๋ฌธ์ ์์ ์จ๋ค. (์ฆ Z๊ฐ a๋ณด๋ค ์์ด๋ค.)
-
์ฃผ์ ๊ทธ๋ฃน์ ํ ์ค ๋์ด์ค๋ค. (
android
,com
,junit
,net
,org
,java
,javax
).
์๋ ์ํฌํธ์ ์์์๋ ์ ํด์ง ์คํ์ผ์ด ์์๋ค. IDE๊ฐ ์๋์ ์ผ๋ก ์ํฌํธ๋ฌธ์ ์์๋ฅผ ๋ฐ๊พธ๊ฑฐ๋, ์๋๋ฉด ๊ฐ๋ฐ์๋ค์ด ์๋ ๊ด๋ฆฌ ์ต์ ์ ๋นํ์ฑํํ๊ณ ์์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ฐ์ ์์๋ค. ์ด๋ฐ ๋ฐฉ์์ด ์ฉ ์ข์๋ณด์ด์ง ์์๊ธฐ ๋๋ฌธ์ ์จ๊ฐ ๋ฐฉ์์ ํ๋ณด์ ๋๊ณ ์๋ฐ๋ง์ ์คํ์ผ์ ์ ํด๋ณด๊ธฐ๋ก ํ๊ณ ๊ฒฐ๊ตญ "์์น์ ์ ํ๊ณ ์ผ๊ด์ฑ์ ์ ์งํ์"๋ ๊ธฐ์กฐ์ ๋ง์ถ ๊ฒฐ์ ์ ๋ด๋ ธ๋ค. ๊ทธ๋์ ํ ๊ฐ์ง ์คํ์ผ์ ์ ํ๊ณ , ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๊ฐ์ ํ ๋ค IDE์๊ฒ ๊ทธ ์คํ์ผ์ ๋ฐ๋ฅด๊ฒ ํ๋ค. ๋ณ๋์ ๋ ธ๋ ฅ์์ด IDE ์ฌ์ฉ์๋ค์ด ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋๊ฐ์ ๋ฐ๋ผ ๋ชจ๋ ํจํค์ง์ ์ํฌํธ๋ฌธ์ด ์ด ํจํด์ ๋ง์ถฐ์ง๊ธธ ๊ธฐ๋ํ๋ค.
๊ทธ๋ ๊ฒ ์ ํด์ง ์คํ์ผ์ ๋ค์์ ๋ชฉ์ ์ ๋ง์กฑ์ํค๊ณ ์ ํ๋ค:
-
์ฌ๋๋ค์ด ๋จผ์ ๋ณด๊ธฐ ์ํ๋ ์ํฌํธ๋ ์์์ ์์นํ๋ค. (์:
android
) -
๊ทธ๋ค์ง ๋ณผ ํ์๊ฐ ์๋ ์ํฌํธ๋ ํ๋จ์ ์์นํ๋ค. (์:
java
) -
์ฌ๋๋ค์ด ์คํ์ผ์ ์ฝ๊ฒ ๋ฐ๋ฅผ ์ ์๋ค.
-
๋ค์ํ IDE๋ ์คํ์ผ์ ์ฝ๊ฒ ๋ฐ๋ฅผ ์ ์๋ค.
์คํํฑ(static) ์ํฌํธ์ ์์น๋ ๋ค์ ๋ ผ๋์ ์ฌ์ง๊ฐ ์์๋ค. ์ฌ๋ฌ ์ํฌํธ ์ฌ์ด์ ๋ฐฐ์นํ์๋ ์๊ฒฌ๋ ์์๊ณ ๋ค๋ฅธ ์ํฌํธ๋ค์ ์ต์๋จ์ด๋ ์ตํ๋จ์ ๋์๋ ์๊ฒฌ๋ ์์๋ค. ๋ํ, ๋ชจ๋ IDE๊ฐ ์ด ์์๋ฅผ ์งํค๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง ์ฐพ์ง ๋ชปํ๋ค.
๋ง์ ์ฌ๋๋ค์ด ๊ทธ๋ ๊ฒ ์ค์ํ๊ฒ ์๊ฐํ์ง ์๋ ๋ฌธ์ ์ธ ๋งํผ ์์์ ํ๋จํ๋ ์ผ๊ด์ฑ๋ง ์ ์งํ๋ฉด ๋๋ค.
๋ธ๋ก ๋ค์ฌ์ฐ๊ธฐ์๋ 4๊ฐ์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. ํญ์ ์ฌ์ฉํ์ง ์๋๋ค. ์ด๋ป๊ฒ ํด์ผ ํ ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋น์ ์ด ๋ค๋ฃจ๊ณ ์๋ ์ฝ๋์ ๊ธฐ์กด ๋ฐฉ์์ ์ ์งํ๋ผ.
ํจ์ ํธ์ถ์ด๋ ๊ฐ์ ํ ๋นํ ๋ ๋ฑ์ ์ค๋ฐ๊ฟ์ ํ ๋๋ 8๊ฐ์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. ์๋๋ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ์๋ค.
Instrument i =
someLongExpression(that, wouldNotFit, on, one, line);
๊ทธ๋ฆฌ๊ณ ์๋๋ ์๋ชป๋ ์๋ค.
Instrument i =
someLongExpression(that, wouldNotFit, on, one, line);
-
ํผ๋ธ๋ฆญ์ด๋ ์คํํฑ์ด ์๋ ํ๋์ ์ด๋ฆ์ m์ผ๋ก ์์ํ๋ค.
-
์คํํฑ ํ๋ ์ด๋ฆ์ s๋ก ์์ํ๋ค.
-
๋ค๋ฅธ ํ๋๋ ์๋ฌธ์๋ก ์์ํ๋ค.
-
ํผ๋ธ๋ฆญ ์คํํฑ ํ๋(์์)๋ ๋ชจ๋ ๋๋ฌธ์์ ์ธ๋์ค์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ค.
์:
public class MyClass {
public static final int SOME_CONSTANT = 42;
public int publicField;
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
}
๋ค์๊ณผ ๊ฐ์ด, ํผ์์ ํ ์ค์ ์ฐจ์งํ๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ ์ด์ ์ค์ ์ฝ๋์ ๋ถ์ฌ ์ฌ์ฉํ๋ผ.
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ๋๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์น์ด๋ค. ๋จ, ์กฐ๊ฑด๋ฌธ์ ๋ชจ๋ ๋ด์ฉ์ด ํ ์ค๋ก ๊ธฐ์ ์ด ๊ฐ๋ฅํ๋ฉด, ํ ์ค์ ์ฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์๋๋ ๊ฐ๋ฅํ ์๋ค.
if (condition) {
body();
}
์๋์ ์๋ ๊ฐ๋ฅํ๋ค.
if (condition) body();
ํ์ง๋ง ์๋์ ์๋ ์๋ชป๋์๋ค.
if (condition)
body(); // bad!
์ฝ๋์ ํ ํ์ ๊ธธ์ด๋ ์ต๋ 100๊ธ์๋ก ์ ํ๋์ด์ผ ํ๋ค.
๋ง์ ํ ๋ก ์ด ์์์ง๋ง ์ต์ข ์ ์ผ๋ก ์ต๋ 100๊ธ์์์ ์ ํํด์ผ ํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ๋ค.
์์ธ: ์ปค๋งจ๋๋ URL์ ํฌํจํ ์ฝ๋ฉํธ์ ๊ฒฝ์ฐ ํ ์ค์ 100๊ธ์๊ฐ ๋๋๋ผ๋ ๋ณต์ฌ, ๋ถ์ฌ๋ฃ๊ธฐ ๋ฑ์ ํธ์ด๋ฅผ ์ํด ๊ธธ์ด๋ฅผ ์ ํํ์ง ์๋๋ค.
์์ธ: ์ํฌํธ๋ฌธ์ ๊ฒฝ์ฐ ์ฌ๋์ด ์ง์ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ๊ฐ ์ ๊ธฐ ๋๋ฌธ์ 100๊ธ์ ์ด์์ ์ฝ๋๋ฅผ ํ์ฉํ๋ค. This also simplifies tool writing.
์ฃผ์์ ๋ค๋ฅธ ๋ชจ๋ํ์ด์ด(modifier)๋ณด๋ค ์ ํํ๋ค. @Override
๊ฐ์ ๋จ์ํ ์ฃผ์์ ๋ค๋ฅธ ์ธ์ด ์์(language element)์ ๊ฐ์
์ค์ ์์นํด๋ ๋๋ค. ์ฃผ์์ด ์ฌ๋ฌ ๊ฐ์ด๊ฑฐ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋ ์ฃผ์์ธ ๊ฒฝ์ฐ, ์ํ๋ฒณ ์์๋๋ก ํ ์ค์ ํ๋์ฉ ์ ๋ ๊ฒ์ด ์์น์ด๋ค.
์๋ฐ์์ ์ ์ ์๋(predefined) ์ธ ๊ฐ์ง ์ฃผ์์ ๋ํด ์๋๋ก์ด๋๊ฐ ์ ํ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
-
@Deprecated
: @Deprecated ์ฃผ์์ ์ฃผ์ ์ฒ๋ฆฌ๋ ์์์ ์ฌ์ฉ์ด ์์ ๋์ด์ผ ํ ๋ ์ฌ์ฉ๋๋ค. ๋ง์ฝ @Deprecated ์ฃผ์์ ์ฌ์ฉํ๊ฒ ๋ค๋ฉด @deprecated ์๋ฐ๋ (Javadoc) ํ๊ทธ๋ฅผ ๋ง๋ค์ด ๋์์ผ๋ก ์ฌ์ฉ๋ ๋ฉ์๋๋ฅผ ๋ช ์ํด์ผ ํ๋ค. ์ถ๊ฐ์ ์ผ๋ก, @Deprecated ์ฒ๋ฆฌ๋ ๋ฉ์๋๋ค์ ์ฌ์ ํ ๋์ํด์ผ ํ๋ค๋ ์ฌ์ค๋ ์์ง ๋ง๋ผ.์ด์ ์ฝ๋์์ @deprecated ์๋ฐ๋ ํ๊ทธ๋ฅผ ๋ณธ๋ค๋ฉด @Deprecated ์ฃผ์์ ๋ฌ์๋์.
-
@Override
: @Override ์ฃผ์์ ์ํผํด๋์ค์ ๊ตฌํ ๋๋ ์ ์ธ๋์ด ์๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋(override)ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด,@inheritdocs
์๋ฐ๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ , ์ธํฐํ์ด์ค๊ฐ ์๋ ํด๋์ค๋ก๋ถํฐ ์์์ ๋ฐ์ ๊ฒฝ์ฐ์ ๊ฐ ๋ฉ์๋๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ค๋ ๊ฒ์ ์ฃผ์์ผ๋ก ํ์ํด์ผ ํ๋ค. -
@SuppressWarnings
: @SuppressWarnings ์ฃผ์์ ๊ฒฝ๊ณ (warning)์ ์์ ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ํฉ์์ ์ฌ์ฉ๋์ด์ผ ํ๋ค. ๋ฐ์ํ๋ ๋ชจ๋ ๊ฒฝ๊ณ ๊ฐ ์ฝ๋ ์์ ์ค์ฌํ๋ ๋ฌธ์ ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด ํ์ํ ์ฃผ์์ด๋ค.@SuppressWarnings ์ฃผ์์ "๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ" ์ํฉ์ ์ค๋ช ํ๋
TODO
์ฃผ์๊ณผ ๊ฐ์ด ์์ฑ๋์ด์ผ ํ๋๋ฐ ์ด๋ฅผ ํตํด ์ด๋ค ํด๋์ค๊ฐ ์ด์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ ํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.// TODO: The third-party class com.third.useful.Utility.rotate() needs generics @SuppressWarnings("generic-cast") List<String> blix = Utility.rotate(blax);
@SuppressWarnings ์ฃผ์์ด ๋ค์ด๊ฐ์ผ ํ๋ ๊ฒฝ์ฐ์, ์ฃผ์์ด ์ ์ฉ๋๋ ๋ฒ์์ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง(refactoring)๋์ด์ผ ํ๋ค.
๋ณ์์ ๋ฉ์๋, ํด๋์ค์ ์ด๋ฆ์ ์ง์ ๋ ๋๋ฌธ์์ด์ ์ฝ์ด(abbreviation)๋ฅผ ์ผ๋ฐ์ ์ธ ๋จ์ด๋ก ์ทจ๊ธํ๋ผ. ๋ ๊ฐ๋ ์ฑ์ด ์ข์ ์ด๋ฆ์ ์ง์ ์ ์๋ค.
์ข์ ์ | ๋์ ์ |
---|---|
XmlHttpRequest | XMLHTTPRequest |
getCustomerId | getCustomerID |
class Html | class HTML |
String url | String URL |
long id | long ID |
JDK์ ์๋๋ก์ด๋ ์ฝ๋๋ ์ด ๋๋ฌธ์์ด์ ๊ด๋ จ๋ ๋ฌธ์ ์์ ๊ต์ฅํ ์ผ๊ด์ ์ด์ง ๋ชปํ ํธ์ด๋ค. ๋ฐ๋ผ์ ์ฌ์ค์ ๋น์ ์ด ์ ํ ๋ชจ๋ ์ฝ๋์์ ์ด ๊ท์น์ ์งํค๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฐ ๋งํผ, ์ด๊ธ๋๋ฅผ ์ง๋ ๋ฌผ๊ณ , ๋ชจ๋ ๋๋ฌธ์์ด๋ฅผ ์ผ๋ฐ ๋จ์ด๋ก ์ทจ๊ธํ์.
TODO ์ฝ๋ฉํธ๋ ์ผ์์ ์ด๊ฑฐ๋ ๋จ๊ธฐ์ ์ธ ํด๊ฒฐ์ฑ , ์๋ฒฝํ์ง ์์ง๋ง ์ฐ์ ์ ๊ด์ฐฎ์ ์ฝ๋ ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
TODO๋ ๋ชจ๋ ๋๋ฌธ์๋ก ์์ฑ๋์ด์ผ ํ๋ฉฐ ํญ์ ์ฝ๋ก (:)์ด ๋ค๋ฐ๋ผ์ผ ํ๋ค.
// TODO: Remove this code after the UrlTable2 has been checked in.
๋ ๋ค๋ฅธ ์๋ค.
// TODO: Change this to use a flag instead of a constant.
"์ธ์ ๊น์ง ์ด๋ค ๊ฒ์ ํด์ผ ํ๋ค"๋ ์์ผ๋ก TODO๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์์ฃผ ์์ธํ ์ผ์ ์ด๋("2005๋ 11์๊น์ง ์์ ") ์์ธํ ํ ์ผ("๋ชจ๋ ๊ด๊ณ์๋ค์ด 7๋ฒ์ ์ ํ๋กํ ์ฝ์ ์ดํดํ ๋ค์์ผ ์ด ์ฝ๋๋ฅผ ์ญ์ ")์ ๋ณ๊ธฐํ๋ค.
๋ก๊ทธ๋ ํ์์ ์ธ ์์ ์ด์ง๋ง ์ง์์์๊ฒ ์ฝ๋ฉํ์ง ์์ผ๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ฃผ๊ณ ๊ทธ ์๊ธฐ๋ฅ์ ์ฝ๊ฒ ์์ด๋ฒ๋ฆฌ๊ฒ ๋๋ค. ์๋ฐ์ ๋ก๊ทธ ํผ์ค๋ฆฌํฐ(log facility)๋ 5๋จ๊ณ์ ๋ก๊ทธ๋ฅผ ์ง์ํ๋ค.
-
ERROR
: ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ๋ฐ๊ฒฌํ ์ ์๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฑฐ๋ ๋ฐ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ํ๊ฑฐ๋, ๋ฐ์ดํฐ ํํฐ์ ์ ์น ๋ ๋ฆฌ๊ฑฐ๋ ์๋๋ฉด ๊ธฐ๊ธฐ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋(์๋๋ฉด ๊ทธ๋ณด๋ค ๋ ๋์ ์ํฉ์ด๊ฑฐ๋) ํ๋ ์ ๋๋ก ์์ฃผ ์น๋ช ์ ์ธ ์ผ์ด ๋ฐ์ํ์ ๋ ์ฌ์ฉํ๋ ๋จ๊ณ๋ค. ์ด ๋จ๊ณ์ ๋ก๊ทธ๋ ์ด๋ ์ํฉ์์๋ (๋ฆด๋ฆฌ์ฆ ๋น๋์์๋ ๋๋ฒ๊ทธ ๋น๋์์๋ ) ํ์์ ์ด๋ฉฐ ๋ก๊ทธ๋๋ ์ํฉ์ ํต๊ณ ์๋ฒ์ ๋ณด๊ณ ํ๋ ๊ฒ์ด ์ข๋ค. -
WARNING
: ์ฌ๊ฐํ๊ฑฐ๋ ์์ํ์ง ๋ชปํ ์ผ์ด ๋ฐ์ํ์ ๋, ์ฆ ์ฌ์ฉ์์๊ฒ ๊ฐ์์ ์ธ ๊ฒฐ๊ณผ๊ฐ ์์ง๋ง ๋ณ๋์ ์ก์ (์ข ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ฑ์ ์ฌ์์ํ๊ฑฐ๋ ์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์์ํ๋ ์ ๋) ๋๋ ๋ฐ์ดํฐ ์์ค์ด ์์ด ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ ์ํฉ ๋ฑ์ ์ฌ์ฉํ๋ ๋จ๊ณ๋ค. ์ด ๋จ๊ณ์ ๋ก๊ทธ ๋ํ ์ด๋ ์ํฉ์์๋ ํ์์ ์ด๋ฉฐ ํต๊ณ ์๋ฒ์ ๋ณด๊ณ ๋ฅผ ๊ณ ๋ คํด๋ณผ ๋งํ ๋์์ด๋ค. -
INFORMATIVE
: ๊ผญ ์๋ฌ๊น์ง๋ ์๋๋๋ผ๋ ๊ทธ ํจ๊ณผ๊ฐ ๋ค๋ฐฉ๋ฉด์ผ๋ก ํผ์ง๋ ์ํฉ์ฒ๋ผ ๋ง์ ์์ ์ฌ๋๋ค์ด ์ฃผ์งํ๊ณ ์์ด์ผ ํ๋ ์ํฉ์ ์ฌ์ฉํ๋ ๋จ๊ณ๋ค. ๋ค๋ฅธ ๋ชจ๋์ ์ํ ์ค๋ณต ๋ก๊ทธ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ๋จ๊ณ์ ๋ก๊ทธ๋ ํด๋น ์์ญ์์ ๋ก๊ทธ๋ฅผ ํ๊ธฐ์ ๊ฐ์ฅ ์ ์ ํ ๊ถํ์ ๊ฐ์ง๋(most authoritative) ๋ชจ๋์ ์ํด ์์ฑ๋๋ ๊ฒ์ด ์ข๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํญ์ ๊ธฐ๋ก๋์ด์ผ ํ๋ ๋ก๊ทธ๋ค. -
DEBUG
: ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฒ๊ทธํ๊ฑฐ๋ ์กฐ์ฌํ ๋ ๊ด๋ จ์ด ์์ ์๋ ์๋ ๋ถ๋ถ์ ๋ํ ๊ธฐ๋ก์ ์ฌ์ฉํ๋ ๋จ๊ณ๋ค. ํด๋น ์ง์ ์ ๋ํด ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป๋๋ฐ ํ์ํ ์ ๋๋ก๋ง ๊ธฐ๋กํด์ผ ํ๋ฉฐ ์ ์ฒด ๋ก๊ทธ ์์ ๋นํด ์ด ๋จ๊ณ์ ๋ก๊ทธ๊ฐ ๋๋ฌด ๋ง์์ง ๊ฒฝ์ฐ์ VERBOSE ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.๋ฆด๋ฆฌ์ฆ ๋น๋์์๋ ํ์ํ๋ค๋ฉด ๊ธฐ๋ก๋์ด์ผ ํ์ง๋ง
if (LOCAL_LOG)
๋๋if (LOCAL_LOGD)
๋ธ๋ก ๋ฑ์ผ๋ก ๊ฐ์ธ์LOCAL_LOG[D]
๋ฅผ ์ ์ํ๋ ํด๋์ค๋ ์๋ธ์ปดํฌ๋ํธ ๋ฑ์ด ์ํ๋ค๋ฉด ๋ชจ๋ ๋๋ฒ๊ทธ ๋ก๊ทธ๋ฅผ ๋นํ์ฑํํ ์ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์if (LOCAL_LOG)
๋ธ๋ก ์์๋ ์ ํจํ ๋ก์ง์ด ๋ค์ด๊ฐ์๋ ์ ๋๊ณ ๋ก๊ทธ์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฌธ์์ด์if (LOCAL_LOG)
๋ธ๋ก ์์ ๋ค์ด๊ฐ ์์ด์ผ ํ๋ค. The logging call should not be re-factored out into a method call if it is going to cause the string building to take place outside of the if(LOCAL_LOG)
block.์์ง๋
if (localLOGV)
๊ฐ์ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ฐ ๋น๋ก ํ์ค์์ ๋ฒ์ด๋๋ ๋ค์ด๋ฐ์ด์ง๋ง ํ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ค. -
VERBOSE
: ๋๋จธ์ง ๋ชจ๋ ๊ฒ์ ๋ก๊ทธํ ๋ ์ฐ๋ ๋จ๊ณ๋ค. ์ด ๋ก๊ทธ๋ ๋๋ฒ๊ทธ ๋น๋์์๋ง ๊ธฐ๋ก๋์ด์ผ ํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํ์ผ์์ ์ ์ธ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์if (LOCAL_LOGV)
๋ธ๋ก ๋๋ ๊ทธ์ ๋์น์ธ ๋ธ๋ก ๋ฑ์ผ๋ก ๋๋ฌ์ธ์ฌ์ผ ํ๋ค. DEBUG์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฆด๋ฆฌ์ฆ ๋น๋์์๋ ๋ชจ๋ ๋ฌธ์์ด์ด ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ ๊ด๋ จ๋ ๋ฌธ์์ด๋ค์if (LOCAL_LOGV)
๋ธ๋ก ๋ด๋ถ์ ์์ฑ๋์ด์ผ ํ๋ค.
๋ ธํธ:
-
VERBOSE ๋ก๊ทธ๊ฐ ์๋ ์ด์, ๊ฐ๋ฅํ ํ ํ๋์ ๋ชจ๋ ์์์ ํน์ ์๋ฌ๋ ๋จ ํ ๋ฒ๋ง ๋ณด๊ณ ๋์ด์ผ ํ๋ค. ํ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ จ์ ํจ์ ํธ์ถ ๊ณผ์ ์์๋ ๊ฐ์ฅ ๋ด๋ถ์ ์์นํ๋ ํจ์๋ง์ด ์๋ฌ๋ฅผ ๋ฐํํด์ผ ํ๊ณ ๊ทธ ํจ์๋ฅผ ํธ์ถํ๋ ๋์ผ ๋ชจ๋ ๋ด์ ๋ค๋ฅธ ๋ถ๋ถ์์๋, ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ฌธ์ ๋ฅผ ๊ณ ๋ฆฝํ๋๋ฐ ์ถฉ๋ถํ ๋์์ด ๋๋ ๊ฒฝ์ฐ์๋ง, ํ์ํ ๋ก๊ทธ๋ฅผ ๋ง๋ถ์ด๋ ํ์์ด ๋์ด์ผ ํ๋ค.
-
๋ชจ๋ ์ฒด์ธ์์ ์์ ๋ ๋ฒจ์ ๋ชจ๋์์ ์จ ๋ฐ์ดํฐ๊ฐ ํ์ ๋ ๋ฒจ ๋ชจ๋์์ ์ ํจํ์ง ์์ ๊ฒ์ผ๋ก ํ์ธ๋ ๋์, ๋ก๊ทธ๊ฐ ๋์ง ์๊ณ ์๋ ํจ์๋ฅผ ํธ์ถํ ๋์์ด ๊ทธ ์ฌ์ค์ ์ ์ ์๋ ๊ฒฝ์ฐ์๋ง DEBUG ๋ก๊ทธ๊ฐ ํ์ํ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ์ต์ ์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์(์ต์ ์ ์์ฒด๊ฐ ๋ชจ๋ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.) ๋ก๊ทธ ์ ๋ณด๊ฐ ์ค์ง ์๋ฌ ์ฝ๋๋ฅผ ๋ด๊ณ ์๋ ๊ฒฝ์ฐ์๋ ๋ก๊ทธ๋ฅผ ํ ํ์๊ฐ ์๋ค. ์ด ๊ท์น์ ํ๋ ์์ํฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ์ํธ์์ฉ์ ์์ด ํนํ ์ค์ํ๋ฐ, ์จ๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์์ธ ์ํฉ์ ํ๋ ์์ํฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ํฉ์์ DEBUG ๋จ๊ณ๋ฅผ ๋๋ ๋ก๊ทธ๊ฐ ํ์ํ์ง ์๋ค. INFORMATIVE ์ด์์ ๋ก๊ทธ๊ฐ ํ์ํ ์ ์ผํ ์ํฉ์ ๋ชจ๋์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ด ์ํ ๋ ๋ฒจ ๋๋ ๊ทธ๋ณด๋ค ํ์ ๋ ๋ฒจ์์ ์ค๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ ๋์ด๋ค.
-
์ด๋ค ๋ก๊ทธ๊ฐ ๋ค๋ฐ์ ์ผ๋ก ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ๋นํ๋๋ ์ํฉ์ด๋ผ๋ฉด, ๊ฐ์ (๋๋ ์์ฃผ ๋น์ทํ) ์ ๋ณด๊ฐ ์ฌ๋ฌ ๋ฒ ๊ธฐ๋ก๋์ด ๋ก๊ทธ๊ฐ ๋์ณ๋๋ ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋น์จ ์ ํ(rate-limiting) ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ๋ฉด ์ข๋ค.
-
๋คํธ์ํฌ์ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ์ํฉ์ ์์ฃผ ๋ฐ์ํ๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ๊ฒ ๋ก๊ทธ๋์ด์๋ ์ ๋๋ค. ๋คํธ์ํฌ์ ์ฐ๊ฒฐ์ด ๋๊น์ผ๋ก์จ ์ฑ ๋ด๋ถ์์ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ์๋ DEBUG ๋๋ VERBOSE ๋จ๊ณ์ ๋ก๊ทธ๊ฐ ์ ์ ํ๋ค. ๋ฆด๋ฆฌ์ฆ ๋น๋์์๋ ๋ก๊ทธ๋ ํ์๊ฐ ์์ ๋งํผ ์ฌ๊ฐํ๊ฑฐ๋ ์์ํ์ง ๋ชปํ ์ํฉ์ด ๋ฐ์ํ๋ฉด ๊ทธ ์ ๋์ ๋ฐ๋ผ ๋ก๊ทธ ๋จ๊ณ๋ฅผ ์ค์ ํ๋ฉด ๋๋ค.
-
์จ๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์กด์ฌํ๋, ๋๋ ์จ๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๊ทผ ๊ฐ๋ฅํ ํ์ผ์์คํ ์ ๋ํด์๋ INFORMATIVE๋ณด๋ค ์์ ๋จ๊ณ์์ ๋ก๊ทธํ๋ฉด ์ ๋๋ค.
-
์ ๋ขฐํ์ง ๋ชปํ๋ ๋ชจ๋ ์์ค(๊ณต์ ์ ์ฅ์์ ๋ชจ๋ ํ์ผ๋ค๊ณผ ๋คํธ์ํฌ๋ฅผ ํตํ ๋ชจ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ํฌํจ)๋ก๋ถํฐ ์จ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ์์ ๊ฒ์ ์ถฉ๋ถํ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ DEBUG๋ณด๋ค ์์ ๋จ๊ณ์์ ๋ก๊ทธ๋์ด์๋ ์ ๋๋ฉฐ ๋ก๊ทธ๋ฅผ ํ๋ ๊ฒฝ์ฐ์๋ ์ต๋ํ ์ ํ๋์ด์ผ ํ๋ค.
-
+
์ฐ์ฐ์๊ฐ ๋ฌธ์์ดString
์ ์ฌ์ฉ๋๋ฉด ๋ด๋ถ์ ์ผ๋ก 16๊ธ์์ ๊ธฐ๋ณธ ๋ฒํผ ์ฌ์ด์ฆ๋ฅผ ๊ฐ๋ ์คํธ๋ง๋น๋StringBuilder
๋ฅผ ํฌํจํด ์์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ฌ๋ฌ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค๋ ์ฌ์ค์ ์ ๋ ํ๋ผ. ์ฌ์ค ๊ธฐ๋ณธ+
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ช ์์ ์ผ๋ก(explicitly) ์คํธ๋ง๋น๋๋ฅผ ์ ์ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํจ์จ์ ์ผ ์ ์๋ค. Also keep in mind that code that callsLog.v()
is compiled and executed on release builds, including building the strings, even if the logs aren't being read. -
๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ณด๋๋ก ๋ฆด๋ฆฌ์ฆ ๋น๋์์ ๋ฐ์์ํค๋ ๋ชจ๋ DEBUG ๋จ๊ณ๊น์ง์ ๋ก๊ทธ๋ ๊ทธ ์๋ฏธ๋ฅผ ์จ๊ธฐ์ง ์์ผ๋ฉด์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ดํดํ ์ ์๊ฒ๋ ๊ฐ๊ฒฐํด์ผ ํ๋ค.
-
๊ฐ๋ฅํ๋ค๋ฉด ๋ก๊ทธ๋ ํ ์ค์์ ๋๋๋ ๊ฒ์ด ์ข๋ค. 80
100์ ์ ๋์ ๋ก๊ทธ๊น์ง๋ ์ถฉ๋ถํ ํ์ฉ๋ ๋งํ๋ฉฐ ํ๊ทธ ๊ธธ์ด๋ฅผ ํฌํจํด 130160์ ์ ๋๋๋ ๋ก๊ทธ๋ ๋๋๋ก ํผํด์ผ ํ๋ค. -
์ฑ๊ณต(successes)์ ๋ณด๊ณ ํ๋ ๋ก๊ทธ๋ VERBOSE๋ณด๋ค ์์์ ๋จ๊ณ์์ ์ฌ์ฉ๋์ด์๋ ์ ๋๋ค.
-
์ฌ์์ฐํ๊ธฐ ์ด๋ ค์ด ์ด์๋ฅผ ์ ๊ฒํ๊ธฐ ์ํ ์ผ์์ ์ธ ๋ก๊ทธ๋ DEBUG ๋๋ VERBOSE ๋จ๊ณ์ ๋จธ๋ฌผ๋ฌ์ผ ํ๋ฉฐ, ์ปดํ์ผ ํ์์ ์ ๋ถ ๋นํ์ฑํ๋ ์ ์๊ฒ๋ ์กฐ๊ฑด๋ฌธ
if
๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ผ ํ๋ค. -
๋ก๊ทธ๋ฅผ ํตํ ๋ณด์ ๋ฌธ์ ์ ์ ๊ฒฝ์จ์ผ ํ๋ค. ๋ณดํธ๋์ด์ผ ํ๋ ์ ๋ณด๋ ๋ฌผ๋ก ๊ฐ์ธ ์ ๋ณด ์ญ์ ๋ก๊ทธ์ ํฌํจ๋์ด์๋ ์ ๋๋ค. ์ด ๊ท์น์ ํนํ๋ ํ๋ ์์ํฌ ์ฝ๋๋ฅผ ์งค ๋ ๋์ฑ ์ค์ํ๋ฐ ํ๋ ์์ํฌ ์ฝ๋๋ฅผ ์งค ๋๋ ์ด๋ค ์ ๋ณด๊ฐ ๊ฐ์ธ ์ ๋ณด์ธ์ง, ๋๋ ๋ณดํธ๋์ด์ผ ํ๋ ์ ๋ณด์ธ์ง ๋ฏธ๋ฆฌ ์๊ธฐ๊ฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
-
System.out.println()
๋๋printf()
๋ฑ์ ์ ๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค.System.out
๊ณผSystem.err
์/dev/null
๋ก ๋ฆฌ๋ค์ด๋ ํธ๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฐ ๊ฐ์์ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์์๋ ์ฌ์ ํ ์ ํจํ๊ฒ ์คํ๋๋ ๋ฌธ์ฅ๋ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. -
๋ก๊ทธ์ ํฉ๊ธ๋ฅ ์, ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ก๊ทธ๊ฐ ๋น์ ์ ๋ก๊ทธ๋ฅผ ๋ฐฉํดํด๋ ์ ๋๋ฏ์ด ๋น์ ์ ๋ก๊ทธ๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ก๊ทธ๋ฅผ ๋ถํ์ํ๊ฒ ๊ฐ๋ก๋ง์์๋(push out of the buffer) ์ ๋๋ค๋ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก, ํญ์ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ์. ์ฝ๋๋ฅผ ์์ ํ ์ผ์ด ์๊ธด๋ค๋ฉด ๋ช ๋ถ์ด๋ผ๋ ํฌ์ํด ์ฃผ๋ณ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์์ ํ ๋ ์ด๋ค
์คํ์ผ์ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ผ. ์ด๋ค ์ฝ๋๊ฐ if
๋ฌธ ์ฃผ๋ณ์ผ๋ก ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋น์ ๋ ๊ทธ๋ ๊ฒ ํด์ผ ํ๋ค. ๊ทธ ์ฝ๋์ ์ฃผ์์ด
๋ณํ๋ก ๋ง๋ค์ด์ง ์์ ์์ ๋ค์ด ์๋ค๋ฉด ๋น์ ์ ์ฃผ์ ๋ํ ๋ณํ ์์ ์์ ์์ฑํ๋ผ.
์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ํฌ์ธํธ๋ ์ฝ๋ฉ์ ์์ด ๊ณตํต์ ์ธ ์ดํ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ฌ๋๋ค์ด ๋น์ ์ด ์ด๋ป๊ฒ(how) ๋งํ๊ณ ์๋์ง๋ณด๋ค ๋ฌด์์(what) ๋งํ๊ณ ์๋์ง์ ์ง์คํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ์ด ์ ๋ฐ์ ์ธ ์คํ์ผ ๊ท์น์ผ๋ก ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ ์ดํ๋ฅผ ์ ์ํ์ง๋ง ํน์ ํ ๊ฒฝ์ฐ์ ์คํ์ผ ๋ํ ์ค์ํ ๋ฒ์ด๋ค. ์๋กญ๊ฒ ์ง๋ฃ์ ์ฝ๋๊ฐ ๊ธฐ์กด์ ์ฝ๋์ ์ฌํ๊ฒ ๋ค๋ฅธ ์คํ์ผ์ด๋ผ๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๋๋ฅผ ์ฝ์ด๋ด๋ ค๊ฐ๋๋ฐ ์ ์ง ์์ ๋ถํธ์ ๊ฒช๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ ์ํฉ์ ๋๋๋ก ํผํ์.
ํ
์คํธ ๋ฉ์๋์ ์ด๋ฆ์ ๋ถ์ผ ๋๋ ๋ฌด์์ ํ
์คํธํ๊ณ ์๋์ง์ ํ
์คํธ์ ๋์์ด ๋๋ ํน์ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ธ๋์ค์ฝ์ด_
๋ฅผ
์ฌ์ฉํ๋ฉด ๋๋ค. ์ด ์คํ์ผ์ ๋ฐ๋ฅด๋ฉด ์ด๋ค ์ผ์ด์ค๋ฅผ ํ
์คํธํ๋์ง ์์๋ณด๊ธฐ๊ฐ ์ฝ๋ค.
์:
testMethod_specificCase1 testMethod_specificCase2
void testIsDistinguishable_protanopia() {
ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
}