item 15 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 15๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
์ด์คํ๊ฒ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ๋ฐ๋ก ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ด๋ถ ๊ตฌํ ์ ๋ณด
๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ผ๋ง๋ ์ ์จ๊ฒผ๋๋์ด๋ค.
-
์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ธ๋ค.
์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. -
์์คํ ๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถ๋ค.
๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค. - ์ ๋ณด ์๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ๋์ฌ ์ฃผ์ง๋ ์์ง๋ง, ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค.
-
์ํํธ์จ์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค.
์ธ๋ถ์ ๊ฑฐ์ ์์กดํ์ง ์๊ณ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ฐ๋ฐ๋์ง ์์ ๋ฏ์ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค. ํฐ ์์คํ ์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถฐ์ค๋ค.
๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํ๋ค. ๋ฌ๋ฆฌ ๋งํ๋ฉด, ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ก ๋์ํ๋ ํ ํญ์ ๊ฐ์ฅ ๋ฎ์ ์ ๊ทผ ์์ค
์ ๋ถ์ฌํด์ผ ํ๋ค๋ ๋ป์ด๋ค.
- private : ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํฑ ๋ ๋ฒจ ํด๋์ค์์๋ง ์ ๊ทผํ ์ ์๋ค.
- package-private : ๋ฉค๋ฒ๊ฐ ์์๋ ํจํค์ง ์์ ๋ชจ๋ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค.
- protected : package-private์ ์ ๊ทผ ๋ฒ์๋ฅผ ํฌํจํ๋ฉฐ ์ด ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํด๋์ค์ ํ์ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์๋ค.
- public : ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์๋ค.
ํด๋์ค์ ๊ณต๊ฐ API๋ฅผ ์ธ์ฌํ ์ค๊ณํ ํ, ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private์ผ๋ก ๋ง๋ค์.
๊ทธ๋ฐ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํ์ฌ (private ์ ํ์๋ฅผ ์ ๊ฑฐํด) package-private
์ผ๋ก ํ์ด์ฃผ์
๊ทธ๋ฐ๋ฐ ๋ฉค๋ฒ ์ ๊ทผ์ฑ์ ์ขํ์ง ๋ชปํ๊ฒ ๋ฐฉํดํ๋ ์ ์ฝ
์ด ํ๋ ์๋ค. ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์
ํ ๋๋ ๊ทธ ์ ๊ทผ ์์ค์ ์์ ํด๋์ค ์์ ๋ณด๋ค ์ข๊ฒ ์ค์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด ์ ์ฝ์ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ ๊ท์น(๋ฆฌ์ค์ฝํ ์นํ ์์น
)์ ์งํค๊ธฐ ์ํด ํ์ํ๋ค.
public ๊ฐ๋ณ ํ๋๋ฅผ ๊ฐ๋ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ง ์๋ค.
์ฌ์ง์ด ํ๋๊ฐ final
์ด๋ฉด์ ๋ถ๋ณ ๊ฐ์ฒด
๋ฅผ ์ฐธ์กฐ ํ๋๋ผ๋ ๋ฌธ์ ๋ ์ฌ์ ํ ๋จ๋๋ค. ๋ด๋ถ ๊ตฌํ์ ๋ฐ๊พธ๊ณ ์ถ์ด๋ ๊ทธ public ํ๋๋ฅผ ์์ ๋ ๋ฐฉ์์ผ๋ก๋ ๋ฆฌํฉํฐ๋ง ํ ์ ์๊ฒ ๋๋ค.
ํด๋น ํด๋์ค๊ฐ ํํํ๋ ์ถ์ ๊ฐ๋
์ ์์ฑํ๋ ๋ฐ ๊ผญ ํ์ํ ๊ตฌ์ฑ์์ ๋ก์จ์ ์์ ๋ผ๋ฉด public static final
ํ๋๋ก ๊ณต๊ฐํด๋ ์ข๋ค.
๊ธธ์ด๊ฐ 0์ด ์๋ ๋ฐฐ์ด์ ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ ์ฃผ์ํ์. ๋ฐ๋ผ์ ํด๋์ค์์ public static final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์ ๋๋ค. ์ด๋ฐ ํ๋๋ ์ ๊ทผ์๋ฅผ ์ ๊ณตํ๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ๊ทธ ๋ฐฐ์ด์ ๋ด์ฉ์ ์์ ํ ์ ์๊ฒ ๋๋ค. ์์ปจ๋ ๋ค์ ์ฝ๋์๋ ๋ณด์ ํ์ ์ด ์กด์ฌํ๋ค.
// ๋ณด์ ํ์ ์ด ์จ์ด ์๋ค.
public static final Thing[] VALUES = { ... };
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ์ฝ๋์ public
๋ฐฐ์ด์ private
์ผ๋ก ๋ง๋ค๊ณ public ๋ถ๋ณ ๋ฆฌ์คํธ
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
๋ ๋ฒ์งธ๋ ๋ฐฐ์ด์ private
์ผ๋ก ๋ง๋ค๊ณ ๊ทธ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ public ๋ฉ์๋
๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค(๋ฐฉ์ด์ ๋ณต์ฌ)
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values)_ {
return PRIVATE_VALUES.clone();
}
์๋ฐ 9์์๋ ๋ชจ๋ ์์คํ
์ด๋ผ๋ ๊ฐ๋
์ด ๋์
๋๋ฉด์ ๋ ๊ฐ์ง ์๋ฌต์ ์ ๊ทผ ์์ค
์ด ์ถ๊ฐ๋์๋ค. ํจํค์ง๊ฐ ํด๋์ค๋ค์ ๋ฌถ์
์ด๋ฏ, ๋ชจ๋์ ํจํค์ง๋ค์ ๋ฌถ์
์ด๋ค.
๋ชจ๋ ์์คํ ์์ ๋์ ๋ ๋ ๊ฐ์ง ์๋ฌต์ ์ ๊ทผ ์์ค์ด๋?
- ๋ชจ๋์ ํจํค์ง ์ค ๊ณต๊ฐํ ๊ฒ๋ค์ ์ ํํด์ ์ธ๋ถ๋ก ๊ณต๊ฐํ ์ ์๋ค. public ๋๋ protected ์ ๊ทผ ์ ํ์๋ผ๋ ๋ชจ๋์์ ํด๋น ํจํค์ง๋ฅผ ๊ณต๊ฐํ์ง ์์ผ๋ฉด, ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋์ JAR ํ์ผ์ ์์ ์ ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋์คํจ์ค์ ๋๋ฉด, ๋ชจ๋ ์์ ๋ชจ๋ ํจํค์ง๋ ๋ชจ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค. ์ฆ, ๋ชจ๋์์ ๊ณต๊ฐ ํ๋์ง ์ฌ๋ถ์ ์๊ด์์ด ์ธ๋ถ์์ public ๋๋ protected ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ๋ฐ์์๋ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
JDK ์ธ์๋ ๋ชจ๋ ๊ฐ๋ ์ด ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง์ง ์์ธกํ๊ธฐ๋ ์์ง ์ด๋ฅธ ๊ฐ์ด ์๋ค. ๊ทธ๋ฌ๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋น๋ถ๊ฐ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
ํ๋ก๊ทธ๋จ ์์์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ํ๋ผ.
๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ต์ํ์ public API๋ฅผ ์ค๊ณํ์. ๊ทธ ์ธ์๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ๊ฐ ์๋์น ์๊ฒ API๋ก ๊ณต๊ฐ ๋๋ ์ผ์ด ์๋๋ก ํด์ผ ํ๋ค. public ํด๋์ค๋ ์์์ฉ public static final ํ๋ ์ธ์๋ ์ด๋ ํ public ํ๋๋ ๊ฐ์ ธ์๋ ์ ๋๋ค. public static final ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ณ ์ธ์ง ํ์ธํ๋ผ.