์ด๋ฒ ๊ธ์ ํตํด '์ ๋ณด ์๋์ ์ฅ์ '๊ณผ 'ํด๋์ค์ ์ธํฐํ์ด์ค', '๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค, ์ธํฐํ์ด์ค)'์ ์ ๊ทผ ์ ํ์ ์์น์ ๋ํด์ ์์๋ณด์.
1. ์ ๋ณด ์๋์ ์ฅ์ ๐ธ
์ ๋ณด ์๋์ ์ฅ์ ์ ์ ๋ง ๋ง์๋ฐ ๊ทธ์ค ๋๋ถ๋ถ์ ๊ตฌํ๊ณผ API๋ฅผ ๋ถ๋ฆฌ์์ผ์ ์ป๋ ์ด์ ๊ณผ ์ฐ๊ด๋์ด ์๋ค. ์ ๋ณด ์๋์ ์ฅ์ ์ ์๋์ ๊ฐ๋ค.
- ์์คํ
๊ฐ๋ฐ ์๋๋ฅผ ๋์ธ๋ค.
์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. - ์์คํ
๊ด๋ฆฌ ๋น์ฉ์ ๋ฎ์ถ๋ค.
๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ํ์ ํ์ฌ ๋๋ฒ๊น ํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ต์ฒดํ๋ ๋ถ๋ด๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค. - ์ ๋ณด ์๋ ์์ฒด๊ฐ ์ฑ๋ฅ์ ๋์ฌ์ฃผ์ง๋ ์์ง๋ง, ์ฑ๋ฅ ์ต์ ํ์ ๋์์ ์ค๋ค.
์์ฑ๋ ์์คํ ์ ํ๋กํ์ผ๋งํด ์ต์ ํํ ์ปดํฌ๋ํธ๋ฅผ ์ ํ ๋ค์, ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํด๋น ์ปดํฌ๋ํธ๋ง ์ต์ ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. - ์ํํธ์จ์ด ์ฌ์ฌ์ฉ์ ๋์ธ๋ค.
์ธ๋ถ์ ๊ฑฐ์ ์์กดํ์ง ์๊ณ ๋ ์์ ์ผ๋ก ๋์ํ ์ ์๋ ์ปดํฌ๋ํธ๋ผ๋ฉด ๊ทธ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ฐ๋ฐ๋์ง ์์ ๋ฏ์ ํ๊ฒฝ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค. - ํฐ ์์คํ
์ ์ ์ํ๋ ๋์ด๋๋ฅผ ๋ฎ์ถฐ์ค๋ค.
์์คํ ์ ์ฒด๊ฐ ์์ง ์์ฑ๋์ง ์์ ์ํ์์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๊ฒ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ ๊ทผ ์ ํ์ ์ฌ์ฉ ์์น ๐ช
ํฑ๋ ๋ฒจ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค์ package-private์ public ๋ ๊ฐ์ง์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํจํค์ง ์ธ๋ถ์์ ์ธ ์ด์ ๊ฐ ์๋ค๋ฉด package-private๋ก ์ ์ธํ์. public์ผ๋ก ์ ์ธํ๋ฉด API๊ฐ ๋๋ฏ๋ก ํ์ ํธํ์ ์ํด ์์ํ ๊ด๋ฆฌํด์ค์ผ ํ๋ค.
๋ํ, ์๋์ ๊ฐ์ด ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์์ private static์ผ๋ก ์ค์ฒฉ์์ผ ๋ณด์.
public class DefaultMemberService implements MemberService {
private static class PrivateStaticClass {
}
}
private๊ฐ ์๋ private static์ธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ ์ ์๋ค. (ํด๋น ๋ด์ฉ์ ์์ดํ 24์์ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๋ค๋ฃฐ ๊ฒ์ด๋ค.)
- ์๋๋ถํฐ ๋ ๋ฆฝ์ ์ธ ํด๋์ค์ด๋ค.
- DefaultMemberService๊ฐ PrivateStaticClass๋ฅผ ์ฌ์ฉํ๋ ๋จ๋ฐํฅ ๊ด๊ณ์ด๋ค. (PrivateStaticClass๊ฐ DefaultMemberService๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.)
3. ๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค, ์ธํฐํ์ด์ค)์ ์ ๊ทผ ์ ํ์ ์์น ๐ป
๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ค์ฒฉ ํด๋์ค, ์ค์ฒฉ ์ธํฐํ์ด์ค)์ ๋ถ์ฌํ ์ ์๋ ์ ๊ทผ ์์ค์ 'private, package-private, protected, public' 4๊ฐ์ง์ด๋ค.
ํด๋์ค์ ๊ณต๊ฐ API๋ฅผ ์ธ์ฌํ ์ค๊ณํ ํ, ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private์ผ๋ก ๋ง๋ค์. ๊ทธ๋ฐ ๋ค์ ์ค์ง ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผ ํ๋ ๋ฉค๋ฒ์ ํํ์ฌ (private ์ ํ์๋ฅผ ์ ๊ฑฐํด) package-private์ผ๋ก ํ์ด์ฃผ์. ์ด๋, ๊ถํ์ ํ์ด์ฃผ๋ ์ผ์ ์์ฃผ ํ๊ฒ ๋๋ค๋ฉด ์์คํ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ถํดํด์ผ ํ๋ ๊ฒ์ ์๋์ง ๊ณ ๋ฏผํด ๋ณผ ํ์๊ฐ ์๋ค.
์ฝ๋๋ฅผ ํ ์คํธํ๋ ๋ชฉ์ ์ผ๋ก private๋ฅผ package-private๋ก ํ์ด์ฃผ๋ ๊ฒ์ ํ์ฉํ ์ ์๋ค. ํ์ง๋ง ํ ์คํธ๋ง์ ์ํด์ ๋ฉค๋ฒ๋ฅผ ๊ณต๊ฐ API๋ก ๋ง๋ค์ด์๋ ์ ๋๋ค. (๋ฌผ๋ก ํ ์คํธ๋ฅผ ๊ฐ์ ํจํค์ง์ ๋ง๋ ๋ค๋ฉด ๊ทธ๋ด ํ์๋ ์๋ค.)
public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋์ค์์ public static final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์ ๋๋ค. ์ด๋ฐ ํ๋๋ ์ ๊ทผ์๋ฅผ ์ ๊ณตํ๋ค๋ฉด ๊ทธ ๋ฐฐ์ด์ ๋ด์ฉ์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์๋์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1. public ๋ฐฐ์ด์ private๋ก ๋ง๋ค๊ณ public ๋ถ๋ณ ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ๊ธฐ
// ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์๋จ!
public static final Thing[] VALUES = {...};
// ํด๊ฒฐ์ฑ
1
private static final Thing[] PRIVATE_VALUES = {...};
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
2. public ๋ฐฐ์ด์ private๋ก ๋ง๋ค๊ณ ๊ทธ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ public ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ธฐ
// ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์๋จ!
public static final Thing[] VALUES = {...};
// ํด๊ฒฐ์ฑ
2
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
ํด๋น ๊ธ์ ๋ฐฑ๊ธฐ์ ๋์ '์ดํํฐ๋ธ ์๋ฐ ์๋ฒฝ ๊ณต๋ต'์ ์๊ฐํ๊ณ ์์ฑํ ๊ฒ์ ๋๋ค.