item 71 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
ํ์ ์๋ ๊ฒ์ฌ ์์ธ ์ฌ์ฉ์ ํผํ๋ผ
๊ฒ์ฌ ์์ธ ํํผ ๋ฐฉ๋ฒ
1. ๋น๊ฒ์ฌ ์์ธ
- API๋ฅผ ์ ๋๋ก ์ฌ์ฉํด๋ ๋ฐ์ํ ์ ์๋ ์์ธ์ด๊ฑฐ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ฏธ ์๋ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด ์ ๋ ๋ถ๋ด์ฏค์ ๋ฐ์๋ค์ผ ์ ์์ ๊ฒ์ด๋ค.
- ํ์ง๋ง ์ด ๊ฒฝ์ฐ๋ค์ด ์๋๋ผ๋ฉด ๋น๊ฒ์ฌ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. (item70)
์๋ ๋ ์ฝ๋๋ ํ๋ก๊ทธ๋๋จธ(API ์ฌ์ฉ์)๊ฐ ๊ฒ์ฌ ์์ธ๋ฅผ ์ฑ ์์ง๋ ์ฌ๋ก๋ค.
// ํ๋ก๊ทธ๋๋จธ๊ฐ ๋น๊ฒ์ฌ ์์ธ๋ฅผ ํธ์ถํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ
} catch (TheCheckedException e) {
throw new AssertionError();
}
// ์๋ฌ ์คํ ์ฝ๋๋ฅผ ํธ์ถํ๊ณ ์์คํ
์ ์ข
๋ฃ์ํจ๋ค.
} catch (TheCheckedException e) {
e.printStackTrace();
System.exit(1);
}
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ ์ด์ ๋น๊ฒ์ฌ ์์ธ๋ก API๋ฅผ ๋ง๋ค๋ฉด ๋์ ๊ฒ์ด๋ค.
2. Optional
- ๊ฒ์ฌ ์์ธ๋ฅผ ํํผํ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ์ ํ ๊ฒฐ๊ณผ ํ์ ์ ๋ด์ ์ต์ ๋์ ๋ฐํํ๋ ๊ฒ์ด๋ค. (item55) ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง๋ ๋์ ๋จ์ํ ๋น ์ต์ ๋์ ๋ฐํํ๋ฉด ๋๋ค.
- ํ์ง๋ง ์ด ๋ฐฉ์์ ๋จ์ ์ด ์๋ค. ์์ธ๊ฐ ๋ฐ์ํ ์ด์ ๋ฅผ ์๋ ค์ฃผ๋ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค๋ ์ ์ด๋ค. (์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฒด์ ์ธ ์์ธ ํ์ ๊ณผ ๊ทธ ํ์ ์ด ์ ๊ณตํ๋ ๋ฉ์๋๋ค์ ํ์ฉํด ๋ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค.(item70))
3. ๋ฉ์๋ ์ชผ๊ฐ๊ธฐ
- ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง๋ ๋ฉ์๋๋ฅผ 2๊ฐ๋ก ์ชผ๊ฐ์ด ๋น๊ฒ์ฌ ์์ธ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค. ์ชผ๊ฐ์ง ์ฒซ ๋ฒ์งธ ๋ฉ์๋๋ ์์ธ๊ฐ ๋์ ธ์ง์ง ์ฌ๋ถ๋ฅผ boolean๊ฐ์ผ๋ก ๋ฐํํ๋ค.
// ๋ฉ์๋ ์ชผ๊ฐ๊ธฐ before
try {
Obj.action(args);
} catch (TheCheckedException e) {
//do something
}
// ๋ฉ์๋ ์ชผ๊ฐ๊ธฐ after
if (obj.actionPermitted(args)) {
obj.action(args);
} else {
//do something
}
- action ๋ด์ ๋ก์ง์ 2๊ฐ ๋งค์๋ (actionPermitted, action) ์ผ๋ก ๋๋ ๋ชจ์ต์ด๋ค.
- ๊น๋ํจ์ ์ด๋์ ๋ ํฌ๊ธฐํ๊ณ ์ ์ฐํจ์ ์ป์๋ค. ํํธ actionPermitted๋ ์ํ ๊ฒ์ฌ ๋ฉ์๋์ ํด๋นํ๋ฏ๋ก ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ํ์๊ฐ ์๋ค.
- ์ธ๋ถ ๋๊ธฐํ ์์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๊ฑฐ๋ ์ธ๋ถ ์์ธ์ ์ํด ์ํ๊ฐ ๋ณํ ์ ์๋ค๋ฉด ์ด ๋ฆฌํฉํฐ๋ง์ ์ ์ ํ์ง ์๋ค. (item69)
- actionPermitted์ action ํธ์ถ ์ฌ์ด์ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณํ ์ ์๊ณ , ๋ ๋ ๋ฉ์๋๊ฐ ๋์ผํ ๋ก์ง์ ์ค๋ณตํด์ ๊ฐ์ง๊ณ ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํต์ฌ ์ ๋ฆฌ
- ๊ผญ ํ์ํ ๊ณณ์๋ง ์ฌ์ฉํ๋ค๋ฉด ๊ฒ์ฌ ์์ธ๋ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ฌ์ฃผ์ง๋ง ๋จ์ฉํ๋ฉด ์ฐ๊ธฐ ๊ณ ํต์ค๋ฌ์ด API๋ฅผ ๋ณ๋๋ค. API ํธ์ถ์๊ฐ ์์ธ ์ํฉ์์
- ๋ณต๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋น๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง์. ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๊ณ ํธ์ถ์๊ฐ ๊ทธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ธธ ๋ฐ๋๋ค๋ฉด, ์ต์ ๋ ์ฌ์ฉ์ ๊ฒํ ํด๋ณด์.
- ๊ทธ๋๋ ์ฌ์์น ์์ผ๋ฉด ๊ทธ๋์์ผ ๊ฒ์ฌ ์์ธ๋ฅผ ์ฌ์ฉํ์.
์๋ฐ์์ ์์ธ๋ RuntimeException์ ์์ํ์ง ์๊ณ ๊ผญ ์ฒ๋ฆฌํด์ผ ํ๋ Checked Exception(๊ฒ์ฌ ์์ธ)๊ณผ ๋ฐ๋๋ก ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์์๋ ๋๋ Unchecked Exception(๋น ๊ฒ์ฌ ์์ธ) ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๊ฒ์ฌ ์์ธ - ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฒ๋ฆฌํ์ฌ ์์ ์ฑ์ ๋์ด๊ฒ๋ ํด์ค๋ค. ๊ฒ์ฌ ์์ธ๋ฅผ ๊ณผํ๊ฒ ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์ฐ๊ธฐ ๋ถํธํ API๊ฐ ๋๋ค.
- ์ด๋ค ๋ฉ์๋๊ฐ ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง ์ ์๋ค๊ณ ์ ์ธ๋๋ค๋ฉด ์ด๋ฅผ ํธ์ถํ๋ ์ฝ๋์์๋ catch ๋ธ๋ก์ ๋์ด ๊ทธ ์์ธ๋ฅผ ๋ถ์ก์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ ๋ฐ๊นฅ์ผ๋ก ๋์ ธ ๋ฌธ์ ๋ฅผ ์ ํํด์ผ๋ง ํ๋ค.
- ๊ฒ์ฌ์์ธ๋ฅผ ๋์ง๋ ๋ฉ์๋๋ ์คํธ๋ฆผ ์์์ ์ง์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ (์์ดํ 45-48) ์๋ฐ 8๋ถํฐ๋ ๋ถ๋ด์ด ๋์ฑ ์ปค์ก๋ค.
public static void throwsException(int millisecond) throws IOException {
File file = new File("/test.txt");
// createNewFile()์์ IOException์ด ๋ฐ์ํ๋ฏ๋ก ํจ์ ์ ์ธ๋ถ์ throws๋ฅผ ๋ช
์ํ์๋ค.
boolean b = file.createNewFile();
- ๋จผ์ ์ด๋ ๊ฒ throws์ ๋ช ์๋ฅผ ํด์ผ ํ๋ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋ํ ์ฐจ์ด๋ฅผ ์์๋ณด์.
- ๋ช ์๋ฅผ ํด์ผ ํ๋ ๊ฒ์ ๊ฒ์ฌ ์์ธ ์ฆ Checked Exception์ด๋ค. ๋ชฉ์ ์ ํจ์ ์ํ ์ค์ ๋ ๋งํ ์์ธ์ด๋ ํธ์ถํ๋ ์ธก์์๋ ์ด๋ฅผ ๋๋นํ๋ผ.
- ์ฆ ์์ธ๊ฐ ์๋์ง ๊ฒ์ฌํ๊ณ ์์ธ ๋ฐ์ ์ ์กฐ์นํ๋ผ ์ด๋ค.
- InterruptedException์ด ๊ทธ ๋ํ์ ์ธ ์์ด๋ค.
์๋ ์์ ๋ฅผ ํด์ํด๋ณด๋ฉด ์ด๋ ๋ค sleep() ํจ์๋ interrupt() ํจ์ ํธ์ถ ์ InterruptedException์ด ๋ฐ์ํ ์ ์์ผ๋ ๋๋นํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
public static void sleep(int millisecond) {
try {
Thread.sleep(millisecond);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
- ์ด ์ฝ๋์ ๊ฐ์ด ํธ์ถ๋ถ์์ try - catch๋ก ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ํด๋น ํจ์์์ throws ํด์ผ ํ๋ค.
- (throwsException ํจ์ ์์ ์ฒ๋ผ) ๊ทธ๋ ๋ค ์ด ์๋ฏธ๋ ํธ์ถ๋ถ์์ ์ฒ๋ฆฌํ์ง ์๊ณ ์ด ํจ์๋ฅผ ํธ์ถํ๋ ํธ์ถ์์๊ฒ ์ฑ ์์ ๋ ๋๊ธฐ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
- ๊ทธ๋ฌ๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ์์ธ๋ฅผ ๊ฒ์ถํ ์ ์๋ ์ต ์ ๋ฐฉ์ ์์น์์ ์ก์์ Logging์ ํ๋ ๋ก์ง์ ์ด๋ฅผ ๋ฐ์ํ๋ ํ๋ ๊ฒ์ด ์ข๋ค.
- ์ด Checked Exception์ ํต์ ๋ฐ์ํ๋๋ผ๋ ์์ฉํ๋ก๊ทธ๋จ์ ๊ณ์ ์ด์ํ ์ ์๋ ์ํฉ์์ ์ฌ์ฉํ๋ค.