2023. 2. 24. 08:37ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item15. ํด๋์ค๋ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ.
https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-2/dashboard
์ดํํฐ๋ธ ์๋ฐ 1๋ถ ๊ฐ์๋ฅผ ๋ชจ๋ ๋ค ๋ฃ๊ณ , ์ด์ 2๋ถ ๊ฐ์๋ฅผ ๋ฃ๊ธฐ ์์ํ๋ค! ๐ค
1๋ถ์ ๋ง์ฐฌ๊ฐ์ง๋ก 2๋ถ๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ค์ ๋ด์ฉ์ ๋ธ๋ก๊ทธ์ ์์ฑํด๋ ์์ ์ด๋ค.
2๋ถ์์๋ 4์ฅ ํด๋์ค์ ์ธํฐํ์ด์ค, 5์ฅ ์ ๋ค๋ฆญ์ ๋ํด์ ํ์ตํ๋ค..! ๊ฐ์ ์์ ์ ์ด 4๋ถ๊น์ง ์๋๋ฐ ์์ง 2๋ถ๊น์ง๋ง ๊ฐ์๊ฐ ๋์๋ค..
์ธ์ 3๋ถ ๋์ฌ์ง๋ ์์ง ๋ชจ๋ฅด๋๊ฑฐ ๊ฐ๊ธดํ๋ฐ... ํ
์๋ฌดํผ 3๋ถ ๋์ค๊ธฐ์ ๊น์ง 2๋ถ ๋ค ๋ฃ๊ณ 1๋ถ, 2๋ถ ๋ณต์ตํ๊ณ ์์ด์ผ์ง!
4์ฅ. ํด๋์ค์ ์ธํฐํ์ด์ค
item15. ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ.
์ฑ ์์ ์ด์คํ๊ฒ ์ค๊ณํ ์ปดํฌ๋ํธ์ ์ ์ค๊ณ๋ ์ปดํฌ๋ํธ์ ์ฐจ์ด๋ ๋ฐ๋ก ํด๋์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ด๋ถ ๊ตฌํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ผ๋ง๋ ์ ์จ๊ฒผ๋๋์ ์๋ค๊ณ ํ๋ค.
์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ด๋ถ ๊ตฌํ์ ์๋ฒฝํ ์จ๊ฒจ, ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ๊ณ ์ค์ง API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์์๋ ์ ํ ๊ฐ์์น ์๋๋ค.
์ด๋ฐ ๋ฐฉ์์ ์บก์ํ๋ผ๊ณ ๋ ํ๋ค.
๐พ ์บก์ํ, ์ฆ ์ ๋ณด ์๋์ ์ฅ์
1๏ธโฃ ์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ธ๋ค.
: ์ธํฐํ์ด์ค ์ค๊ณ๋ฅผ ๋ง์น๊ฒ ๋๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ชฝ๊ณผ ๊ฐ๋ฐํ๋ ์ชฝ์ด ๋ ๋ค ๋์์ ๊ฐ๋ฐํ ์ ์์ด์ ์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์๋ค. (๋ฌผ๋ก ํ ํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๊ณ ์๊ฐํ ๋์ด๋ค.)
2๏ธโฃ ์์คํ ๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถ๋ค.
: ํ๋ก์ ํธ์ ์ฒ์ ํฌ์ ๋์๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ด์ผํ๋ ๊ฒ์ ์ธํฐํ์ด์ค์ด๋ค. ์ด์ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ์ฝ๋ ํ์ ์ด ๊ต์ฅํ ํ๋ค์ด์ง๋๋ฐ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ข ๋ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
3๏ธโฃ ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค.
: ์ ๋ณด ์๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ๋์ฌ์ฃผ์ง๋ ์์ง๋ง, ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค. ํ๋กํ์ผ๋ง์ ํตํด ์ต์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํด๋น ์ปดํฌ๋ํธ๋ง ๊ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
4๏ธโฃ ์์คํ ๊ฐ๋ฐ ๋์ด๋๋ฅผ ๋ฎ์ถ๋ค.
: ์ ์ฒด ํฐ ์์คํ ์ ๋ง๋ค๊ธฐ ์ ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ฅผ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์์คํ ์ ์ฒด๊ฐ ์์ง ์์ฑ๋์ง ์์ ์ํ์์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฉ๐ป ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ ๊ทผ ์ ํ์ ์ฌ์ฉ ์์น
์๋ฐ์์๋ ์บก์ํ๋ฅผ ์ํด์ ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋๋ฐ ์ด๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ(์ ๊ทผ ํ์ฉ ๋ฒ์)๋ฅผ ๋ช ์ํ๋ค.
๊ฐ ์์์ ์ ๊ทผ์ฑ์ ๊ทธ ์์๊ฐ ์ ์ธ๋ ์์น์ ์ ๊ทผ ์ ํ์๋ก ์ ํด์ง๋ค. -> ์ด์ ์ด ์ ๊ทผ ์ ํ์๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์บก์ํ์ ํต์ฌ์ด๊ธฐ๋ ํ๋ค!!!
- ๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํ๋ค.
: ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ ํ ํญ์ ๊ฐ์ฅ ๋ฎ์ ์ ๊ทผ ์์ค์ ๋ถ์ฌํด์ผ ํ๋ค.
- ํฑ๋ ๋ฒจ ํด๋์ค์ ์ธํฐํ์ด์ค์ Package-private ๋๋ public์ ์ธ ์ ์๋ค.
: public์ผ๋ก ์ ์ธํ๋ฉด ๊ณต๊ฐ API๊ฐ๋๊ณ , package-private๋ก ์ ์ธํ๋ฉด ํด๋น ํจํค์ง ์์์๋ง ์ฌ์ฉํ ์ ์๋ค.
ํจํค์ง๋ฅผ ์ธ๋ถ์์ ์ฌ์ฉํ ์ด์ ๊ฐ ์๋ค๋ฉด package-private๋ก ์ ์ธํ์! ๊ทธ๋ฌ๋ฉด ํฌ๋ผ์ด์ธํธ์ ์๋ฌด๋ฐ ํผํด ์์ด๋ ๋ค์ ๋ฆด๋ฆฌ์ฆ์ ์์ , ๊ต์ฒด, ์ ๊ฑฐํ ์ ์๋ค. ๋ฐ๋ฉด์ public์ผ๋ก ์ ์ธํ๋ค๋ฉด API๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด์๋ ์์ํ ๊ด๋ฆฌํด์ผ ํ๋ค...๐ฎ
- ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ํด๋น ํด๋์ค์ private static์ผ๋ก ์ค์ฒฉ ์ํค์
/**
* item15. ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํํ๋ผ.
* package-private๋ฅผ ์ฌ์ฉํด๋ ๋์ง ์์๊น?
* ์๋ํ๋ฉด DefaultMemberService๋ MemberService์ ๊ตฌํ์ฒด๋ก ๋ด๋ถ์์๋ง ์์๋ ๋์ง ์๋๊ฐ? -> ์ธ๋ถ(ํด๋ผ์ด์ธํธ)์์๋ ์ ํ์๊ฐ ์์ง ์๋
*/
class DefaultMemberService implements MemberService
{
private String name;
/**
* ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private ํด๋์ค๋ ์ธํฐํ์ด์ค๋
* ํด๋น ํด๋์ค์ private static์ผ๋ก ์ค์ฒฉ ์ํค์ !
*/
private static class PrivateStaticClass
{
// ๋ณ๋์ ํด๋์ค๋ก ์กด์ฌํ๋ ๊ฒ์ ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ค๋ฉด ์ค์ฒฉ์ํค์~ ํด์ ๊ฐ์ ธ์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
// ์ด๋ ๊ฒ private static์ผ๋ก ์ค์ฒฉ์ํค๋ ๊ฒ์ด ๋ง๋ค. (DefaultMemberSerivce์ ๋
๋ฆฝ์ ์ธ ๊ด๊ณ)
}
private class PrivateClass
{
void doPrint() // ๋ด๋ถ ํด๋์ค๋ ์๊ธฐ ์์ ์ ๊ฐ์ธ๋ ์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ name์ ์ฌ์ฉํ ์ ์๋ค.
{
System.out.println("name = " + name);
}
}
public static void main(String[] args)
{
// final chapter03.item15.class_and_interface.member.DefaultMemberService chapter03.item15.class_and_interface.member.DefaultMemberService$PrivateClass.this$0
Arrays.stream(PrivateClass.class.getDeclaredFields()).forEach(System.out::println);
}
}
์ด๋ ๊ฒ ํฑ๋ ๋ฒจ๋ก ๋๋ฉด ๊ฐ์ ํจํค์ง์ ๋ชจ๋ ํด๋์ค๊ฐ ์ ๊ทผํ ์ ์์ง๋ง, private static์ผ๋ก ์ค์ฒฉ์ํค๋ฉด ๋ฐ๊นฅ ํด๋์ค ํ๋์์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ํด๋น ํด๋์ค์ private static์ผ๋ก ์ค์ฒฉ ์ํค๋๊ฒ ์ข๋ค.
์๋ํ๋ฉด public์ผ ํ์๊ฐ ์๋ ํด๋์ค์ ์ ๊ทผ ์์ค์ package private ํฑ ๋ ๋ฒจ ํด๋์ค๋ก ์ขํ๋ฉด
public ํด๋์ค๋ ๊ทธ ํจํค์ง์ API์ธ ๋ฐ๋ฉด, package-private ํฑ๋ ๋ฒจ์ ๋ด๋ถ ๊ตฌํ์ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฉ๐ป ๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค/์ธํฐํ์ด์ค)์ ์ ๊ทผ ์ ํ์ ์์น
๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค/์ธํฐํ์ด์ค)์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค์ 4๊ฐ์ง๊ฐ ์๋ค.
- private
: ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํฑ๋ ๋ฒจ ํด๋์ค์์๋ง ์ ๊ทผํ ์ ์๋ค.
- package-private
: ๋ฉค๋ฒ๊ฐ ์์๋ ํจํค์ง ์์ ๋ชจ๋ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค. ์ ๊ทผ ์ ํ์๋ฅผ ๋ช ์ํ์ง ์์์ ๋ ์ ์ฉ๋๋ ํจํค์ง ์ ๊ทผ ์์ค์ด๋ค.
- protected
: package-private์ ์ ๊ทผ ๋ฒ์๋ฅผํฌํจํ๋ฉฐ, ์ด ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํด๋์ค์ ํ์ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์๋ค.
- public
: ๋ชจ๋ ๊ณณ์์ ์ ๊ทผํ ์ ์๋ค.
๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค/์ธํฐํ์ด์ค)์ ์ ๊ทผ ์ ํ์ ์์น
- private์ package-private๋ ๋ด๋ถ ๊ตฌํ์ด๊ณ , public ํด๋์ค์ protected์ public์ ๊ณต๊ฐ API์ด๋ค.
- public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํ๋ค. -> ํด๋์ค์ ๊ณต๊ฐ API๋ฅผ ์ค๊ณํ ํ์ ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private๋ก ๋ง๋ค๊ณ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํด์๋ง package-private๋ก ํ์ด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋จ์ง ์ฝ๋๋ฅผ ํ ์คํธํ๋ ๋ชฉ์ ์ผ๋ก private๋ฅผ package-private๋ก ํ์ด์ฃผ๋ ๊ฒ์ ํ์ฉํ ์ ์์ง๋ง ํ ์คํธ๋ฅผ ์ํด์ ๋ฉค๋ฒ๋ฅผ ๊ณต๊ฐ API๋ก๋ง๋ค์ด์๋ ์๋๋ค!!
- ํด๋์ค์์ public static final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์๋๋ค!
๐ ๋ชจ๋ ์์คํ
์๋ฐ 9์์๋ ๋ชจ๋ ์์คํ ์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋๋ฉด์ ๋ ๊ฐ์ง์ ์๋ฌต์ ์ ๊ทผ ์์ค์ด ์ถ๊ฐ๋์๋ค.
๋ชจ๋์ด๋ ํจํค์ง์ ํจํค์ง๋ผ๊ณ ํ ์ ์๋๋ฐ ํจํค์ง๊ฐ ํด๋์ค๋ค์ ๋ฌถ์์ด๋ฏ์ด, ๋ชจ๋์ ํจํค์ง๋ค์ ๋ฌถ์์ด๋ค.
๋ชจ๋์ ์์ ์ด ์ํ๋ ํจํค์ง ์ค ๊ณต๊ฐ(export)ํ ๊ฒ๋ค์ module-info.javaํ์ผ์ ์ ์ธํ๋ค. protected ๋๋ public์ผ๋ก ์ ์ธ๋ ๋ฉค๋ฒ๋ค์ด๋ผ๋ ํด๋น ํจํค์ง๋ฅผ ๊ณต๊ฐํ์ง ์๋๋ค๋ฉด ๋ชจ๋ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ค. (๋ฌผ๋ก ๋ชจ๋ ์์์๋ exports ์ฌ๋ถ์๋ ์๊ด ์๋ค.)
์ด๋ ๊ฒ ๋ชจ๋ ์์คํ ์ ํ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์์ผ๋ฉด์๋ ๊ฐ์ ๋ชจ๋์ ์ด๋ฃจ๋ ํจํค์ง ์์์๋ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ค.
ํ์ง๋ง ์ด ๋ชจ๋์ jar ํ์ผ์ ์์ ์ ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋์คํจ์ค์ ๋๋ฉด ๊ทธ ๋ชจ๋ ์์ ๋ชจ๋ ํจํค์ง๋ ๋ง์น ๋ชจ๋์ด ์๋ ๊ฒ์ฒ๋ผ ํ๋ํ๋ค. ์ฆ, ๋ชจ๋์ด ๊ณต๊ฐํ๋์ง ์ฌ๋ถ์ ์๊ด์์ด public ํด๋์ค๊ฐ ์ ์ธํ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ๋ฐ์์๋ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค..!
โ ์ฌ์ค ๋ชจ๋์ ์ฅ์ ์ ์ ๋๋ก ๋๋ฆฌ๊ธฐ ์ํด์๋ ์ค์ ํด์ผ ํ ์ผ๋ค์ด ๋ง๋ค.
๋จผ์ ํจํค์ง๋ค์ ๋ชจ๋ ๋จ์๋ก ๋ฌถ๊ณ , ๋ชจ๋ ์ ์ธ์ ํจํค์ง๋ค์ ๋ชจ๋ ์์กด์ฑ์ ๋ช ์ํด์ผ ํ๊ณ , ๊ทธ ๋ค์ ์์ค ํธ๋ฆฌ๋ฅผ ์ฌ๋ฐฐ์นํ๊ณ .. ๋ชจ๋ ์์ผ๋ก๋ถํฐ ์ผ๋ฐ ํจํค์ง๋ก์ ๋ชจ๋ ์ ๊ทผ์ ํน๋ณํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ค...
๋ชจ๋์ ํ์ฉํ ๋ํ์ ์ธ ์๊ฐ jdk ์ธ๋ฐ jdk ์ธ์๋ ๋ชจ๋ ๊ฐ๋ ์ด ๋๋ฆฌ ์ด์ฉ๋๊ธฐ์๋ ์์ง ์ด๋ฅธ ๊ฐ์ด ์๊ณ ๋น๋ถ๊ฐ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๊ฒ ๋ค๋ผ๊ณ ... ์ฑ ์ ์จ์๋ค..ใ ใ
๐ ์ ๋ฆฌ
ํ๋ก๊ทธ๋จ ์์์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ํ๊ณ
๊ผญ ํ์ํ ๊ฒ๋ง ๊ณจ๋ผ์ ์ต์ํ์ public API๋ฅผ ์ค๊ณํด์ผ ํ๋ค.
๊ทธ ์ธ์๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉค๋ฒ๊ฐ ์๋์น ์๊ฒ API๋ก ๊ณต๊ฐ๋๋ ์ผ์ด ์๋๋ก ํด์ผ ํ๋ค.
public ํด๋์ค๋ ์์์ฉ public static final ํ๋ ์ธ์๋ ์ด๋ ํ public ํ๋๋ ๊ฐ์ ธ์๋ ์๋๋ค!!