item 19 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์์ฉ ํด๋์ค
๋ ์ฌ์ ์ํ ์ ์๋ ๋ฉ์๋๋ค์ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ด์ฉํ๋์ง(์๊ธฐ์ฌ์ฉ
) ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ค. ๋ง๋ถ์ฌ์ ์ด๋ค ์์๋ก ํธ์ถ
ํ๋์ง, ๊ฐ๊ฐ์ ํธ์ถ ๊ฒฐ๊ณผ๊ฐ ์ด์ด์ง๋ ์ฒ๋ฆฌ์ ์ด๋ค ์ํฅ
์ ์ฃผ๋์ง๋ ๋ด์์ผ ํ๋ค.
ํ์ง๋ง ์ด๋ฐ ์์ "์ข์ API ๋ฌธ์๋ '์ด๋ป๊ฒ'๊ฐ ์๋ '๋ฌด์'์ ํ๋์ง๋ฅผ ์ค๋ช
ํด์ผ ํ๋ค
"๋ผ๋ ๊ฒฉ์ธ ๊ณผ๋ ๋์น๋์ง ์๋? ๊ทธ๋ ๋ค. ์์์ด ์บก์ํ
๋ฅผ ํด์น๊ธฐ ๋๋ฌธ์ ์ผ์ด๋๋ ์ํ๊น์ด ํ์ค์ด๋ค.
@implSpec
ํ๊ทธ๋ ์๋ฐ 8
์์ ์ฒ์ ๋์
๋์ด ์๋ฐ 9๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฌ์ฉ ๋๊ธฐ ์์ํ๋ค.
ํจ์จ์ ์ธ ํ์ ํด๋์ค๋ฅผ ํฐ ์ด๋ ค์ ์์ด ๋ง๋ค ์ ์๊ฒ ํ๋ ค๋ฉด ํด๋์ค์ ๋ด๋ถ ๋์ ๊ณผ์ ์ค๊ฐ์ ๋ผ์ด๋ค ์ ์๋ ํ
(hook)
์ ์ ์ ๋ณํ์ฌ protected
๋ฉ์๋ ํํ๋ก ๊ณต๊ฐํด์ผ ํ ์๋ ์๋ค.
java.util.AbstractList์ removeTange ๋ฉ์๋๋ฅผ ์๋ก ์ดํด๋ณด์
protected void removeRange(int fromIndex, int toIndex)
...
์ด ๋ฆฌ์คํธ๋ ํน์ ์ด ๋ฆฌ์คํธ์ ๋ถ๋ถ๋ฆฌ์คํธ์ ์ ์๋ clear ์ฐ์ฐ์ด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
List ๊ตฌํ์ฒด์ ์ต์ข
์ฌ์ฉ์๋ removeRange
๋ฉ์๋์ ๊ด์ฌ์ด ์๋ค. ๊ทธ๋ผ์๋ ์ด ๋ฉ์๋๋ฅผ ์ ๊ณตํ ์ด์ ๋ ๋จ์ง ํ์ ํด๋์ค์์ ๋ถ๋ถ๋ฆฌ์คํธ์ clear
๋ฉ์๋๋ฅผ ๊ณ ์ฑ๋ฅ์ผ๋ก ๋ง๋ค๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด์๋ค. removeRange ๋ฉ์๋๊ฐ ์๋ค๋ฉด ํ์ ํด๋์ค์์ clear ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ ๊ณฑ์ ๋น๋กํด ์ฑ๋ฅ์ด ๋๋ ค์ง๊ฑฐ๋ ๋ถ๋ถ๋ฆฌ์คํธ์ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์๋ก ๊ตฌํํด์ผ ํ์ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์์์ฉ ํด๋์ค๋ฅผ ์ค๊ณํ ๋ ์ด๋ค ๋ฉ์๋๋ฅผ protected๋ก ๋ ธ์ถํด์ผ ํ ์ง๋ ์ด๋ป๊ฒ ๊ฒฐ์ ํ ๊น?
์ ๋ต์ ์๋ค. ์ฌ์ฌ์๊ณ ํด์ ์ ์์ธก
ํด๋ณธ ๋ค์, ์ค์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ํ ํด๋ณด๋ ๊ฒ์ด ์ต์ ์ด๋ค.
์์์ฉ ํด๋์ค๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฒ์ด '์ ์ผ
'ํ๋ค. ๊ผญ ํ์ํ protected ๋ฉค๋ฒ๋ฅผ ๋์ณค๋ค๋ฉด ํ์ ํด๋์ค๋ฅผ ์์ฑํ ๋ ๊ทธ ๋น์๋ฆฌ๊ฐ ํ์ฐํ ๋๋ฌ๋๋ค. ๊ฑฐ๊พธ๋ก, ํ์ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค ๋๊น์ง ์ ํ ์ฐ์ด์ง ์๋ protected ๋ฉค๋ฒ๋ ์ฌ์ค private
์ด์ฌ์ผ ํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์์์ฉ์ผ๋ก ์ค๊ณํ ํด๋์ค๋ ๋ฐฐํฌ ์ ์ ๋ฐ๋์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๊ฒ์ฆํด์ผ ํ๋ค.
๋ํ, ์์์ฉ ํด๋์ค์ ์์ฑ์๋ ์ง์ ์ ์ผ๋ก๋ ๊ฐ์ ์ ์ผ๋ก๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋
๋ฅผ ํธ์ถํด์๋ ์ ๋๋ค.
public class Super {
public Super() {
overrideMe();
}
public void overrideMe() { ... }
}
public final class Sub extends Super {
Sub() {
instant = Instant.now();
}
@Override
public void overrideMe() {
System.out.println(instant);
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.overrideMe();
}
}
์ด ํ๋ก๊ทธ๋จ์ด instant๋ฅผ ๋ ๋ฒ ์ถ๋ ฅํ๋ฆฌ๋ผ ๊ธฐ๋ํ๊ฒ ์ง๋ง, ์ฒซ ๋ฒ์งธ๋ null
์ ์ถ๋ ฅํ๋ค. ์์ ํด๋์ค์ ์์ฑ์๋ ํ์ ํด๋์ค์ ์์ฑ์๊ฐ ์ธ์คํด์ค ํ๋๋ฅผ ์ด๊ธฐํํ๊ธฐ๋ ์ ์ overrideMe
๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ด๋ค.
clone
๊ณผ readObject
๋ฉ์๋๋ ์์ฑ์์ ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ธ๋ค. ๋ฐ๋ผ์ ์์์ฉ ํด๋์ค์์ Cloneable์ด๋ Serializable์ ๊ตฌํํ ์ง ์ ํด์ผ ํ๋ค๋ฉด, ์ด๋ค์ ๊ตฌํํ ๋ ๋ฐ๋ฅด๋ ์ ์ฝ๋ ์์ฑ์์ ๋น์ทํ๋ค๋ ์ ์ ์ฃผ์ํ์. ์ฆ, clone๊ณผ readObject ๋ชจ๋ ์ง์ ์ ์ผ๋ก๋ ๊ฐ์ ์ ์ผ๋ก๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, Serializable
์ ๊ตฌํํ ์์์ฉ ํด๋์ค๊ฐ readResolve
๋ writeReplace
๋ฉ์๋๋ฅผ ๊ฐ๋๋ค๋ฉด ์ด ๋ฉ์๋๋ค์ private์ด ์๋ protected
๋ก ์ ์ธํด์ผ ํ๋ค. private์ผ๋ก ์ ์ธํ๋ค๋ฉด ํ์ ํด๋์ค์์ ๋ฌด์๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์ญ์ ์์์ ํ์ฉํ๊ธฐ ์ํด ๋ด๋ถ ๊ตฌํ์ ํด๋์ค API๋ก ๊ณต๊ฐํ๋ ์ ์ค ํ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ทธ ์ธ์ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฒด ํด๋์ค๋ ์ด๋จ๊น?
์ ํต์ ์ผ๋ก ์ด๋ฐ ํด๋์ค๋ final๋ ์๋๊ณ ์์์ฉ์ผ๋ก ์ค๊ณ๋๊ฑฐ๋ ๋ฌธ์ํ๋์ง๋ ์์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์์์ฉ์ผ๋ก ์ค๊ณํ์ง ์์ ํด๋์ค๋ ์์์ ๊ธ์ง
ํ๋ ๊ฒ์ด๋ค. ์์์ ๊ธ์งํ๋ ๋ฐฉ๋ฒ์ ํด๋์ค๋ฅผ final
๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋๋ ๋ชจ๋ ์์ฑ์๋ฅผ private
์ด๋ package-private
์ผ๋ก ์ ์ธํ๊ณ public ์ ์ ํฉํฐ๋ฆฌ
๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ตฌ์ฒด ํด๋์ค๊ฐ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์๋๋ฐ ์์์ ๊ธ์งํ๋ฉด ์ฌ์ฉํ๊ธฐ์ ์๋นํ ๋ถํธํด์ง๋ค. ์ด๋ฐ ํด๋์ค๋ผ๋ ์์์ ๊ผญ ํ์ฉ ํด์ผ๊ฒ ๋ค๋ฉด ํฉ๋นํ ๋ฐฉ๋ฒ์ด ํ๋ ์๋ค. ํด๋์ค ๋ด๋ถ์์๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋
๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋ง๋ค๊ณ ์ด ์ฌ์ค์ ๋ฌธ์
๋ก ๋จ๊ธฐ๋ ๊ฒ์ด๋ค. ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์๊ธฐ ์ฌ์ฉ ์ฝ๋
๋ฅผ ์๋ฒฝํ ์ ๊ฑฐ
ํ๋ผ๋ ๋ง์ด๋ค.
ํด๋์ค์ ๋์์ ์ ์งํ๋ฉด์ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ ๊ธฐ๊ณ์ ์ธ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ๋จผ์ ๊ฐ๊ฐ์ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ ์์ ์ ๋ณธ๋ฌธ ์ฝ๋๋ฅผ private '๋์ฐ๋ฏธ ๋ฉ์๋
'๋ก ์ฎ๊ธฐ๊ณ ์ด ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ์์ ํ๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ค๋ฅธ ์ฝ๋๋ค๋ ๋ชจ๋ ์ด ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋๋ก ์์ ํ๋ฉด ๋๋ค.
๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ฌ๋ก๋ ์ด๋ค๊ฒ ์์๊น?
์ ๋ฆฌ
์์์ฉ ํด๋์ค
๋ฅผ ์ค๊ณ ํ๊ธฐ๋ ๊ฒฐ์ฝ ๋ง๋ง์น ์๋ค. ํด๋์ค ๋ด๋ถ์์ ์ค์ค๋ก๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง(์๊ธฐ์ฌ์ฉ ํจํด
) ๋ชจ๋ ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ฉฐ, ์ผ๋จ ๋ฌธ์ํ
ํ ๊ฒ์ ๊ทธ ํด๋์ค๊ฐ ์ฐ์ด๋ ํ ๋ฐ๋์ ์ง์ผ์ผ ํ๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ๊ทธ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋ฏฟ๊ณ ํ์ฉํ๋ ํ์ ํด๋์ค๋ฅผ ์ค๋์
ํ๊ฒ ๋ง๋ค ์ ์๋ค. ๋ค๋ฅธ ์ด๊ฐ ํจ์จ ์ข์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋๋ก ์ผ๋ถ ๋ฉ์๋๋ฅผ protected
๋ก ์ ๊ณตํด์ผ ํ ์๋ ์๋ค. ๊ทธ๋ฌ๋ ํด๋์ค๋ฅผ ํ์ฅํด์ผ ํ ๋ช
ํํ ์ด์ ๊ฐ ๋ ์ค๋ฅด์ง ์์ผ๋ฉด ์์์ ๊ธ์ง
ํ๋ ํธ์ด ๋์ ๊ฒ์ด๋ค. ์์์ ๊ธ์งํ๋ ค๋ฉด ํด๋์ค๋ฅผ final
๋ก ์ ์ธํ๊ฑฐ๋ ์์ฑ์
๋ชจ๋๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค๋ฉด ๋๋ค.