item 15 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- ์ด์คํ๊ฒ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋
๋ฐ๋ก ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ด๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ผ๋ง๋ ์ ์จ๊ฒผ๋๋๋ค. - ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ด๋ถ ๊ตฌํ์ ์๋ฒฝํ ์จ๊ฒจ, ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ๋ถ๋ฆฌํ๋ค.
- ์ค์ง API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์ ๋ฐฉ์์๋ ์ ํ ๊ฐ์์น ์๋๋ค.
์ ๋ณด ์๋, ํน์ ์บก์ํ๋ผ๊ณ ํ๋ ์ด ๊ฐ๋ ์ ์ํํธ์จ์ด ์ค๊ณ์ ๊ทผ๊ฐ์ด ๋๋ ์๋ฆฌ๋ค.
- ์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ธ๋ค. ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์์คํ ๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถ๋ค. ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ ๋ณด ์๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ๋์ฌ์ฃผ์ง๋ ์์ง๋ง, ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค. ์์ฑ๋ ์์คํ ์ ํ๋กํ์ผ๋งํด ์ต์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์ ํ ๋ค์(์์ดํ 67), ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํด๋น ์ปดํฌ๋ํธ๋ง ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ํํธ์จ์ด ์ฌ์ฌ์ฉ์ฑ์ ๋์ธ๋ค. ์ธ๋ถ์ ๊ฑฐ์ ์์กดํ์ง ์๊ณ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ฐ๋ฐ๋์ง ์์ ๋ฏ์ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํฐ ์์คํ ์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถฐ์ค๋ค. ์์คํ ์ ์ฒด๊ฐ ์์ง ์์ฑ๋์ง ์์ ์ํ์์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ธฐ๋ณธ ์์น์ ๊ฐ๋จํ๋ค. ๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํ๋ค.
๋ฌ๋ฆฌ ๋งํ๋ฉด, ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ก ๋์ํ๋ ํ ํญ์ ๊ฐ์ฅ ๋ฎ์ ์ ๊ทผ ์์ค์ ๋ถ์ฌํด์ผ ํ๋ค๋ ๋ป์ด๋ค. - ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ public์ผ๋ก ์ ์ธํ๋ฉด ๊ณต๊ฐ API๊ฐ ๋๋ฉฐ, package-private์ผ๋ก ์ ์ธํ๋ฉด ํด๋น ํจํค์ง ์์์๋ง ์ด์ฉํ ์ ์๋ค. ํจํค์ง ์ธ๋ถ์์ ์ธ ์ด์ ๊ฐ ์๋ค๋ฉด package private์ผ๋ก ์ ์ธํ์.
- ํด๋์ค์ ๊ณต๊ฐ API๋ฅผ ์ธ์ฌํ ์ค๊ณํ ํ, ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private์ผ๋ก ๋ง๋ค์. ๊ทธ๋ฐ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํ์ฌ (private ์ ํ์๋ฅผ ์ ๊ฑฐํด) package-private์ผ๋ก ํ์ด์ฃผ์.
- public ํด๋์ค์ protected ๋ฉค๋ฒ๋ ๊ณต๊ฐ API์ด๋ฏ๋ก ์์ํ ์ง์๋ผ์ผ ํ๋ค. ๋ํ ๋ด๋ถ ๋์ ๋ฐฉ์์ API ๋ฌธ์์ ์ ์ด ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํด์ผ ํ ์๋ ์๋ค(์์ดํ 19). ๋ฐ๋ผ์ protected ๋ฉค๋ฒ์ ์๋ ์ ์์๋ก ์ข๋ค.
-
public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํ๋คํ๋๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋, final์ด ์๋ ์ธ์คํด์ค ํ๋๋ฅผ public์ผ๋ก ์ ์ธํ๋ฉด ๊ทธ ํ๋์ ๋ด์ ์ ์๋ ๊ฐ์ ์ ํํ ํ์ ์๊ฒ ๋๋ค. ๋ํpublic ๊ฐ๋ณ ํ๋๋ฅผ ๊ฐ๋ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ง ์๋ค.
- ์๋ฐ 9์์๋ ๋ชจ๋ ์์คํ ์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋๋ฉด์ ๋ ๊ฐ์ง ์๋ฌต์ ์ ๊ทผ ์์ค์ด ์ถ๊ฐ๋์๋ค. ํจํค์ง๊ฐ ํด๋์ค๋ค์ ๋ฌถ์์ด๋ฏ, ๋ชจ๋์ ํจํค์ง๋ค์ ๋ฌถ์์ด๋ค.
- ๋ชจ๋์ ์์ ์ ์ํ๋ ํจํค์ง ์ค ๊ณต๊ฐ(export)ํ ๊ฒ๋ค์ (๊ด๋ก์ moduleinfo.java ํ์ผ์) ์ ์ธํ๋ค.
- protected ํน์ public ๋ฉค๋ฒ๋ผ๋ ํด๋น ํจํค์ง๋ฅผ ๊ณต๊ฐํ์ง ์์๋ค๋ฉด ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ค. ๋ฌผ๋ก ๋ชจ๋ ์์์๋ exports๋ก ์ ์ธํ๋์ง ์ฌ๋ถ์ ์๋ฌด๋ฐ ์ํฅ๋ ๋ฐ์ง ์๋๋ค.
- ๋ชจ๋ ์์คํ ์ ํ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์์ผ๋ฉด์๋ ๊ฐ์ ๋ชจ๋์ ์ด๋ฃจ๋ ํจํค์ง ์ฌ์ด์์๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค
ํ๋ก๊ทธ๋จ ์์์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ํ๋ผ. ๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ต์ํ์ public API๋ฅผ ์ค๊ณํ์. ๊ทธ ์ธ์๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ๊ฐ ์๋์น ์๊ฒ API๋ก ๊ณต๊ฐ๋๋ ์ผ์ด ์๋๋ก ํด์ผ ํ๋ค. public ํด๋์ค๋ ์์์ฉ public static final ํ๋ ์ธ์๋ ์ด๋ ํ public ํ๋๋ ๊ฐ์ ธ์๋ ์ ๋๋ค. public static final ํ๋๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ณ์ธ์ง ํ์ธํ๋ผ.