item 15 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- ์ค๊ณ๊ฐ ์๋ ์ปดํฌ๋ํธ๋ ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ด๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์ผ๋ง๋ ์ ์จ๊ฒผ๋์ง ์ด๋ค.
- ๋ด๋ถ ๊ตฌํ์ ์๋ฒฝํ ์จ๊ฒจ ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ ๋ถ๋ฆฌํ๋ค.
- API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์ ๋ฐฉ์์๋ ์ ํ ๊ฐ์์น ์๋๋ค.
์ ๋ณด ์๋, ์บก์ํ
- ์์คํ ์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ๋ค์ ์๋ก ๋ ๋ฆฝ์์ผ์ ๊ฐ๋ฐ, ํ ์คํธ, ์ต์ ํ, ์ ์ฉ, ๋ถ์, ์์ ์ ๊ฐ๋ณ์ ์ผ๋ก ํ ์ ์๋ค.
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐ
- ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์์
- ์ฑ๋ฅ ์ต์ ํ์ ๋์
- ์ฌ์ฌ์ฉ์ฑ ํฅ์ - ์ธ๋ถ์ ๊ฑฐ์ ์์กดํ์ง ์๊ณ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์์ผ๋ฏ๋ก
- ๋๊ท๋ชจ ์์คํ ์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถ๋ค. ์์ฑ๋์ง ์๋๋ผ๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๊ฒ์ฆ
- ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ(์ ๊ทผ ํ์ฉ ๋ฒ์)์ ๋ช ์ํ๋ค.
- Object์ protected ๋ฉ์๋์ธ clone์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ค.
- ์ ๊ทผ ์ ํ์๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์ ๋ณด ์๋์ ํต์ฌ
๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํ๋ค.
- ๊ฐ์ฅ ๋ฐ๊นฅ์ด๋ผ๊ณ ์๋ฏธํ๋ ํฑ๋ ๋ฒจ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ๊ธฐ์ค์ package-private์ public
- ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ public์ผ๋ก ์ ์ธํ๋ฉด ๊ณต๊ฐ API๊ฐ ๋๋ฉฐ private์ผ๋ก ์ ์ธํ๋ฉด ํด๋น ํจํค์ง ์์์๋ง ์ฌ์ฉ
ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ private ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์์ private static์ผ๋ก ์ค์ฒฉ์์ผ๋ณด์.
ํฑ๋ ๋ฒจ๋ก ๋๋ฉด ๊ฐ์ ํจ์บ์ง์ ๋ชจ๋ ํด๋์ค๊ฐ ์ ๊ทผํ ์ ์์ง๋ง private static์ผ๋ก ์ค์ฒฉ์ํค๋ฉด ๋ฐ๊นฅ ํด๋์ค ํ๋์์๋ง ์ ๊ทผํ ์ ์๋ค. public์ผ ํ์๊ฐ ์๋ ํด๋์ค์ ์ ๊ทผ ์์ค์ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ก ์ขํ๋ ์ผ์ด๋ค.
- ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋๋ ๊ทธ ์ ๊ทผ ์์ค์ ์์ ํด๋์ค์์๋ณด๋ค ์ข๊ฒ ์ค์ ํ ์ ์๋ค.
- ์์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์์ด์ผํ๋ค๋ ๊ท์น(๋ฆฌ์ค์ฝํ ์นํ ์์น)์ ์งํค๊ธฐ ์ํด ํ์ํจ.
- ์ด๋ ํด๋์ค๋ ์ธํฐํ์ด์ค๊ฐ ์ ์ํ ๋ชจ๋ ๋ฉ์๋๋ฅผ public์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
- ์ฝ๋๋ฅผ ํ ์คํธํ๋ ค๋ ๋ชฉ์ ์ผ๋ก ์ ๋นํ ์์ค๊น์ง๋ ๋ํ๋ ๋จ
- public ํด๋์ค์ private ๋ฉค๋ฒ๋ฅผ package-private๊น์ง ํ์ด์ฃผ๋ ๊ฒ์ ํ์ฉํ ์ ์์ง๋ง ๊ทธ ์ด์์ ์๋จ
- API๋ก ๋ง๋ค์ด์๋ ์๋๋ค.
- ํ๋๊ฐ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ final์ด ์๋ ์ธ์คํด์ค ํ๋๋ฅผ public์ผ๋ก ์ ์ธํ๋ฉด ๊ทธ ํ๋์ ๋ด์ ์ ์๋ ๊ฐ์ ์ ํํ ํ์ ์๊ฒ๋จ
- ํ๋์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ๋ถ๋ณ์์ ๋ณด์ฅํ ์ ์๊ฒ ๋๋ฏ๋ก ํ๋๊ฐ ์์ ๋ ๋(๋ฝ ํ๋) ๋ค๋ฅธ ์์ ์ ํ ์ ์๊ฒ ๋๋จ
public ๊ฐ๋ณ ํ๋๋ฅผ ๊ฐ๋ค ๋ถ์ด๋ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ง ์๋ค. ์ ์ ํ๋์์๋ ๋ง์ฐฌ๊ฐ์ง ์
- ํด๋น ํด๋์ค๊ฐ ํํํ๋ ์ถ์ ๊ฐ๋ ์ ์์ฑํ๋ ๋ฐ ๊ผญ ํ์ํ ๊ตฌ์ฑ์์๋ก์จ์ ์์๋ผ๋ฉด public static final ํ๋๋ก ๊ณต๊ฐํด๋ ์ข๋ค.
- ๊ด๋ก์ ์ด๋ฐ ์์์ ์ด๋ฆ์ ๋๋ฌธ์ ์ํ๋ฒณ, ๋จ์ด ์ฌ์ด (_) ์ถ๊ฐ
- ๋ฐ๋์ ๊ธฐ๋ณธ ํ์ ๊ฐ์ด๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ค.
- ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค๋ฉด final์ด ์๋ ํ๋์ ์ ์ฉ๋๋ ๋ชจ๋ ๋ถ์ด์ต์ด ๊ทธ๋๋ก ์ ์ฉ๋๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง๋ ๋ชปํ์ง๋ง ์ฐธ์กฐ๋ ๊ฐ์ฒด ์์ฒด๋ ์์ ๋ ์ ์์ผ๋ ๊ฒฐ๊ณผ๊ฐ ์ข์ง ์์ ์ ์์.
- ํด๋์ค์์ public satic final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ๊ทธ ๋ฐฐ์ด์ ๋ด์ฉ์ ์์ ํ ์ ์๊ฒ ๋๋ฏ๋ก ๋ณด์ ํ์ ์ด ๋ฐ์.
public static final Thing[] VALUES = { };
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
- ํจํค์ง๊ฐ ํด๋์ค๋ค์ ๋ฌถ์์ด๋ฏ ๋ชจ๋์ ํจํค์ง๋ค์ ๋ฌถ์์ด๋ค.
- ๋ชจ๋์ ์์ ์ ์ํ๋ ํจํค์ง ์ค ๊ณต๊ฐ(export)ํ ๊ฒ๋ค์ ๊ด๋ก์ module-info.java ํ์ผ์ ์ ์ธํ๋ค.
- protected ํน์ public ๋ฉค๋ฒ๋ผ๋ ํด๋น ํจํค์ง๋ฅผ ๊ณต๊ฐํ์ง ์์๋ค๋ฉด ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ค.
- ๋ชจ๋ ์์์๋ exports๋ก ์ ์ธํ๋์ง ์ฌ๋ถ์ ์๋ฌด๋ฐ ์ํฅ๋ ๋ฐ์ง ์๋๋ค.
- ๋ชจ๋ ์์คํ ์ ํ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์์ผ๋ฉด์๋ ๊ฐ์ ๋ชจ๋์ ์ด๋ฃจ๋ ํจํค์ง ์ฌ์ด์์๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค.
์๋ฌต์ ์ ๊ทผ ์์ค๋ค์ ๊ฐ๊ฐ public ์์ค๊ณผ protected ์์ค๊ณผ ๊ฐ์ผ๋ ๊ทธ ํจ๊ณผ๊ฐ ๋ชจ๋ ๋ด๋ถ๋ก ํ์ ๋๋ ๋ณ์ข ์ธ ๊ฒ์ด๋ค.
์ด๋ฌํ ํํ๋ก ๊ณต์ ํด์ผ ํ๋ ์ํฉ์ ํํ์ง ์๋ค. ํจํค์ง๋ค ์ฌ์ด์์ ํด๋์ค๋ค์ ์ฌ๋ฐฐ์นํ๋ฉด ๋๋ถ๋ถ ํด๊ฒฐ๋๋ค.
- ํจํค์ง๋ค์ ๋ชจ๋ ๋จ์๋ก ๋ฌถ๊ณ ๋ชจ๋ ์ ์ธ์ ํจํค์ง๋ค์ ๋ชจ๋ ์์กด์ฑ์ ๋ช ์ํ๋ค.
- ์์ค ํธ๋ฆฌ๋ฅผ ์ฌ๋ฐฐ์น
- ๋ชจ๋ ์์ผ๋ก ๋ถํฐ (๋ชจ๋ ์์คํ ์ ์ ์ฉํ์ง ์๋) ์ผ๋ฐ ํจํค์ง๋ก์ ๋ชจ๋ ์ ๊ทผ์ ํน๋ณํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ค.
ํต์ฌ ์ ๋ฆฌ
public์ผ ํ์๊ฐ ์๋ ํด๋์ค์ ์ ๊ทผ ์์ค์ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ก ์ขํ๋ค. public ํด๋์ค๋ ๊ทธ ํจํค์ง์ API์ธ ๋ฐ๋ฉด package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ ๋ด๋ถ ๊ตฌํ์ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ ์ต์ํ์ public API๋ฅผ ์ค๊ณํ์.