item 18 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์ ํด๋์ค์ ํ์ ํด๋์ค๋ฅผ ๋ชจ๋ ๊ฐ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํต์ ํ๋ ํจํค์ง
์์์๋ผ๋ฉด ์์๋ ์์ ํ ๋ฐฉ๋ฒ์ด๋ค. ํ์ฅํ ๋ชฉ์ ์ผ๋ก ์ค๊ณ ๋์๊ณ ๋ฌธ์ํ
๋ ์ ๋ ํด๋์ค๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ํ๋ค. ํ์ง๋ง ์ผ๋ฐ์ ์ธ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ํจํค์ง ๊ฒฝ๊ณ๋ฅผ ๋์ด, ์ฆ ๋ค๋ฅธ ํจํค์ง์ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์ํ๋ ์ผ์ ์ํํ๋ค.
๋ฉ์๋ ํธ์ถ๊ณผ ๋ฌ๋ฆฌ ์์์ ์บก์ํ
๋ฅผ ๊นจ๋จ๋ฆฐ๋ค. ๋ค๋ฅด๊ฒ ๋งํ๋ฉด, ์์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๊ตฌํ ๋๋๋์ ๋ฐ๋ผ ํ์ ํด๋์ค์ ๋์์ ์ด์์ด ์๊ธธ ์ ์๋ค.
public class InstrumentedHashSet<E> extends HashSet<E> {
private int addCount = 0;
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}
@Override
public boolean addAll(Collection<? extends E> c) {
addCount += c.size();
return super.addAll(c);
}
public int getAddCount() {
return addCount;
}
...
}
์ด ํด๋์ค๋ ์ ๊ตฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ๋๋ก ์๋ํ์ง ์๋๋ค. ์ด๋ป๊ฒ ์๋์ด ์๋๋์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
InstrumentedHashSet<String> s = new InstrumentedHashSet<>();
s.addAll(List.of("ํฑ", "ํํ", "ํ"));
์ด์ getAddCount
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด 3์ ๋ฐํํ๋ฆฌ๋ผ ๊ธฐ๋ํ๊ฒ ์ง๋ง, ์ค์ ๋ก๋ 6์ ๋ฐํํ๋ค.
๊ทธ ์์ธ์ HashSet
์ addAll
๋ฉ์๋๊ฐ add
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋ ๋ฐ ์๋ค. ์ด๋ฐ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ HahSet ๋ฌธ์์๋ (๋น์ฐํ) ์ฐ์ฌ ์์ง ์๋ค.
์ด์ฒ๋ผ ์์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฌ์ฉํ๋ '์๊ธฐ์ฌ์ฉ(self-use)
' ์ฌ๋ถ๋ ํด๋น ํด๋์ค์ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ํด๋นํ๋ฉฐ ๋ค์ ๋ฆด๋ฆฌ์ฆ์๋ ์ ์ง๋ ์ง๋ ์ ์ ์๋ค.
์๊ธฐ ์ฌ์ฉ์ด๋?
๋ค์ ๋ฆด๋ฆฌ์ค์์ ์์ ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ์ด๋จ๊น?
๋ค์ ๋ฆด๋ฆฌ์ค์์ ์ฐ๋ คํ ์ผ์ด ์๊ธฐ๋ฉด ํ์ ํด๋์ค์์ ์ฌ์ ์ํ์ง ๋ชปํ ๊ทธ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํด 'ํ์ฉ๋์ง ์์
'์์๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค. ์ค์ ๋ก๋ ์ปฌ๋ ์
ํ๋ ์์ํฌ ์ด์ ๋ถํฐ ์กด์ฌํ๋ Hashtable
๊ณผ Vector
๋ฅผ ์ปฌ๋ ์
ํ๋ ์์ํฌ์ ํฌํจ์ํค์ ์ด์ ๊ด๋ จํ ๋ณด์ ๊ตฌ๋ฉ๋ค์ ์์ ํด์ผ ํ๋ ์ฌํ๊ฐ ๋ฒ์ด์ก๋ค.
Hashtable๊ณผ Vector์ ๋ณด์ ์ฌ๋ก๋ ์ด๋ค๊ฒ์ด ์๋๊ฐ?
๋คํํ ์ด์์ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํผํด ๊ฐ๋ ๋ฌ์์ด ์๋ค. ๊ธฐ์กด ํด๋์ค๊ฐ ์๋ก์ด ํด๋์ค์ ๊ตฌ์ฑ ์์๋ก ์ฐ์ธ๋ค๋ ๋ป์์ ์ด๋ฌํ ์ค๊ณ๋ฅผ ์ปดํฌ์ง์
์ด๋ผ ํ๋ค. ์ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋๋ค์ (private ํ๋๋ก ์ฐธ์กฐํ๋) ๊ธฐ์กด ํด๋์ค์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ์ด ๋ฐฉ์์ ์ ๋ฌ(forwarding)
์ด๋ผ ํ๋ฉฐ, ์ ํด๋์ค์ ๋ฉ์๋๋ค์ ์ ๋ฌ ๋ฉ์๋(forwarding method)
๋ผ ๋ถ๋ฅธ๋ค.
์ปดํฌ์ง์
๊ณผ ์ ๋ฌ์ ์กฐํฉ์ ๋์ ์๋ฏธ๋ก ์์(delegation)
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์์ ๋ฐ๋์ ํ์ ํด๋์ค๊ฐ ์์ ํด๋์ค์ '์ง์ง'ํ์ ํ์
์ธ ์ํฉ์์๋ง ์ฐ์ฌ์ผ ํ๋ค. ๋ค๋ฅด๊ฒ ๋งํ๋ฉด, ํด๋์ค B๊ฐ ํด๋์ค A์ is-a ๊ด๊ณ์ผ ๋๋ง ํด๋์ค A๋ฅผ ์์ํด์ผ ํ๋ค. = ๋ฆฌ์ค์ฝํ ์นํ ๋ฒ์น
์ปดํฌ์ง์
์ ์จ์ผ ํ ์ํฉ์์ ์์์ ์ฌ์ฉํ๋ ๊ฑด ๋ด๋ถ ๊ตฌํ์ ๋ถํ์ํ๊ฒ ๋
ธ์ถํ๋ ๊ผด์ด๋ค. ๊ทธ ๊ฒฐ๊ณผ API๊ฐ ๋ด๋ถ ๊ตฌํ์ ๋ฌถ์ด๊ณ ๊ทธ ํด๋์ค์ ์ฑ๋ฅ๋ ์์ํ ์ ํ๋๋ค. ๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋
ธ์ถ๋ ๋ด๋ถ์ ์ง์ ์ ๊ทผํ ์ ์๋ค๋ ์ ์ด๋ค. ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ๋ ํด๋ผ์ด์ธํธ์์ ์์ ํด๋์ค๋ฅผ ์ง์ ์์ ํ์ฌ ํ์ ํด๋์ค์ ๋ถ๋ณ์
์ ํด์น ์ ์๋ค๋ ์ฌ์ค์ด๋ค.
๋ถ๋ณ์์ ํด์น๋ ์ฌ๋ก๋?
์ปดํฌ์ง์ ๋์ ์์์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ์ ์ ๋ง์ง๋ง์ผ๋ก ์๋ฌธํด์ผ ํ ์ง๋ฌธ์ ์๊ฐํ๋ค.
ํ์ฅํ๋ ค๋ ํด๋์ค์ API์ ์๋ฌด๋ฐ ๊ฒฐํจ์ด ์๋๊ฐ? ๊ฒฐํจ์ด ์๋ค๋ฉด, ์ด ๊ฒฐํจ์ด ์ฌ๋ฌ๋ถ ํด๋์ค์ API๊น์ง ์ ํ๋ผ๋ ๊ด์ฐฎ์๊ฐ? ์ปดํฌ์ง์ ์ผ๋ก๋ ์ด๋ฐ ๊ฒฐํจ์ ์จ๊ธฐ๋ ์๋ก์ด API๋ฅผ ์ค๊ณํ ์ ์์ง๋ง, ์์์ ์์ ํด๋์ค์ API๋ฅผ '๊ทธ ๊ฒฐํจ๊น์ง๋'๊ทธ๋๋ก ์น๊ณํ๋ค.
์์์ ๊ฐ๋ ฅํ์ง๋ง ์บก์ํ๋ฅผ ํดํด๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์์์ ์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ์์ํ is-a ๊ด๊ณ์ผ ๋๋ ์์ฌํ ์๋ง์ ์๋ ๊ฒ, ํ์ ํด๋์ค์ ํจํค์ง๊ฐ ์์ ํด๋์ค์ ๋ค๋ฅด๊ณ , ์์ ํด๋์ค๊ฐ ํ์ฅ์ ๊ณ ๋ คํด ์ค๊ณ๋์ง ์์๋ค๋ฉด ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์์์ ์ทจ์ฝ์ ์ ํผํ๋ ค๋ฉด ์์ ๋์ ์ปดํฌ์ง์ ๊ณผ ์ ๋ฌ์ ์ฌ์ฉํ์. ํนํ ๋ํผ ํด๋์ค๋ก ๊ตฌํํ ์ ๋นํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๋์ฑ ๊ทธ๋ ๋ค. ๋ํผ ํด๋์ค๋ ํ์ ํด๋์ค๋ณด๋ค ๊ฒฌ๊ณ ํ๊ณ ๊ฐ๋ ฅํ๋ค.