item 7 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์ดํ 7 ๋ค ์ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ผ
Effective Java 3e ์์ดํ 7๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
์๋ฐ์ฒ๋ผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ๊ฐ์ถ ์ธ์ด๋ก ๋์ด์ค๋ฉด ํ๋ก๊ทธ๋๋จธ์ ์ถ์ด ํจ์ฌ ํ์ํด์ง๋ค.
๊ทธ๋์ ์์นซ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ ์ด์ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ค๊ณ ์คํดํ ์ ์๋๋ฐ ์ ๋ ์ฌ์ค์ด ์๋๋ค
public Class Stack {
public Object pop() {
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
...
}
์์ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ์คํ ํด๋์ค์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด Stack ํด๋์ค๋ฅผ ์ค๋ ์คํํ๋ค ๋ณด๋ฉด ์ ์ฐจ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋ ๊ฒฐ๊ตญ ์ฑ๋ฅ์ด ์ ํ๋ ๊ฒ์ด๋ค.
์ด ์ฝ๋์์๋ ์คํ์ด ์ปค์ก๋ค๊ฐ ์ค์ด๋ค์์ ๋ ์คํ์์ ๊บผ๋ด์ง ๊ฐ์ฒด๋ค์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ์ํ์ง ์๋๋ค. ์ฌ๊ธฐ์ ๋ค ์ด ์ฐธ์กฐ๋ ๋ฌธ์ ๊ทธ๋๋ก ์์ผ๋ก ๋ค์ ์ฐ์ง ์์ ์ฐธ์กฐ๋ฅผ ๋ปํ๋ค. ์์ ์ฝ๋์์๋ elements ๋ฐฐ์ด์ 'ํ์ฑ ์์ญ'๋ฐ์ ์ฐธ์กฐ๋ค์ด ๋ชจ๋ ์ฌ๊ธฐ์ ํด๋นํ๋ค.
๊ฐ์ฒด ์ฐธ์กฐ ํ๋๋ฅผ ์ด๋ ค๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ทธ ๊ฐ์ฒด๋ฟ ์๋๋ผ ๊ทธ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ชจ๋ ๊ฐ์ฒด(๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ ๊ฐ์ฒด๋ค์ด ์ฐธ์กฐํ๋ ๋ชจ๋ ๊ฐ์ฒด)๋ฅผ ํ์ํด๊ฐ์ง ๋ชปํ๋ค.
JCF ์์ ๊ด๋ฆฌ๋๋ ๋ฆฌ์คํธ์ ํ๋๋ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํด์ผ ํ ๊น?
ํด๋ฒ์ ๊ฐ๋จํ๋ค. ํด๋น ์ฐธ์กฐ๋ฅผ ๋ค ์ผ์ ๋ null ์ฒ๋ฆฌ(์ฐธ์กฐ ํด์ )ํ๋ฉด ๋๋ค.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // ๋ค ์ด ์ฐธ์กฐ ํด์
return result;
}
๋ค ์ด ์ฐธ์กฐ๋ฅผ null ์ฒ๋ฆฌํ๋ฉด ๋ค๋ฅธ ์ด์ ๋ ๋ฐ๋ผ์จ๋ค. ๋ง์ฝ null ์ฒ๋ฆฌํ ์ฐธ์กฐ๋ฅผ ์ค์๋ก ์ฌ์ฉํ๋ ค ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ฆ์ NullPointerException์ ๋์ง๋ฉฐ ์ข ๋ฃ ๋๋ค.
ํ์ง๋ง ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ดํ์ null ์ฒ๋ฆฌํ ํ์๋ ์๋ค. ์ด๋ ๋ฐ๋์งํ์ง๋ ์๊ณ ์ฝ๋๋ฅผ ์ง์ ๋ถํ๊ฒ ๋ง๋ค ๋ฟ์ด๋ค.
๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ null ์ฒ๋ฆฌํ๋ ์ผ์ ์์ธ์ ์ธ ๊ฒฝ์ฐ์ฌ์ผ ํ๋ค. ๋ค ์ด ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๊ทธ ์ฐธ์กฐ๋ฅผ ๋ด์ ๋ณ์๋ฅผ ์ ํจ ๋ฒ์(scope)๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด null ์ฒ๋ฆฌ๋ ์ธ์ ํด์ผ ํ ๊น? Stack ํด๋์ค๋ ์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ทจ์ฝํ ๊ฑธ๊น?
๋ฐ๋ก ์คํ์ด ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์คํ์ (๊ฐ์ฒด ์์ฒด๊ฐ ์๋๋ผ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ด๋) elements ๋ฐฐ์ด๋ก ์ ์ฅ์ ํ์ ๋ง๋ค์ด ์์๋ค์ ๊ด๋ฆฌํ๋ค.
๋นํ์ฑ ์์ญ์ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ธ๋ชจ์๋ค๋ ๊ฑด ํ๋ก๊ทธ๋๋จธ๋ง ์๋ ์ฌ์ค์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋ก๊ทธ๋๋จธ๋ ๋นํ์ฑ ์์ญ์ด ๋๋ ์๊ฐ null ์ฒ๋ฆฌํด์ ํด๋น ๊ฐ์ฒด๋ฅผ ๋๋ ์ฐ์ง ์์ ๊ฒ์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์๋ ค์ผ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ํด๋์ค๋ผ๋ฉด ํ๋ก๊ทธ๋๋จธ๋ ํญ์ฑ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ฃผ์ํด์ผ ํ๋ค.
์บ์ ์ญ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ผ์ผํค๋ ์ฃผ๋ฒ์ด๋ค. ์ด ์ข๊ฒ ์บ์ ์ธ๋ถ์์ ํค(Key)๋ฅผ ์ฐธ์กฐํ๋ ๋์๋ง(๊ฐ์ด ์๋๋ค) ์ํธ๋ฆฌ๊ฐ ์ด์ ์๋ ์บ์๊ฐ ํ์ํ ์ํฉ์ด๋ผ๋ฉด WeakHashMap์ ์ฌ์ฉํด ์บ์๋ฅผ ๋ง๋ค์
WeakHashMap๋ ์ธ์ ์ฌ์ฉํ ์ ์์๊น?
LinkedHashMap์ removeEldestEntry ๋ฉ์๋๋ฅผ ์จ์ ํ์์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์์ ์ธ ๋ฒ์งธ ์ฃผ๋ฒ์ ๋ฐ๋ก ๋ฆฌ์ค๋ ํน์ ์ฝ๋ฐฑ์ด๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๋ฐฑ์ ๋ฑ๋ก๋ง ํ๊ณ ๋ช ํํ ํด์งํ์ง ์๋๋ค๋ฉด ๋ญ๊ฐ ์กฐ์นํด์ฃผ์ง ์๋ ํ ์ฝ๋ฐฑ์ ๊ณ์ ์์ฌ๊ฐ ๊ฒ์ด๋ค. ์ด ๋ํ WeakHashMap์ ํค๋ก ์ ์ฅํ๋ฉด ํด๊ฒฐ ๊ฐ๋ฅ ํ๋ค.
์ฝ๋ฐฑ์ ๋ฑ๋ก๋ง ํ๊ณ ๋ช ํํ ํด์ง ํ์ง ์๋ ์ผ์ด์ค๋ ์ด๋ค ์ผ์ด์ค ์ผ๊น?
์ ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ ๋์๋ ๊ฒ์ผ๋ก ์ ๋๋ฌ๋์ง ์์ ์์คํ ์ ์๋ ๊ฐ ์ ๋ณตํ๋ ์ฌ๋ก๋ ์๋ค. ์ด๋ฐ ๋์๋ ์ฒ ์ ํ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ํ ํ๋กํ์ผ๋ฌ ๊ฐ์ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ๋์ํด์ผ๋ง ๋ฐ๊ฒฌ๋๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ์ด๋ฐ ์ข ๋ฅ์ ๋ฌธ์ ๋ ์๋ฐฉ๋ฒ์ ์ตํ๋๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค.