item 7 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ITEM7 ๋‹ค์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์–ธ์–ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์•„์ฃผ ๊นŒ๋‹ค๋กญ๋‹ค.
๋•Œ๋ฌธ์— ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ๋‹ค ์‚ฌ์šฉํ•œ ํ›„ null ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

Stack์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ์˜ˆ์ œ

public class Stack { 
    private Object[] elements; 
    ... 
    public Object pop() { 
        if (size == 0) 
            throw new EmptyStackException(); 
        return elements[--size]; // ๋ฌธ์ œ์  
    } 
    ... 
}

์œ„ ์ฝ”๋“œ๋Š” pop() ๋ฉ”์†Œ๋“œ์—์„œ size๋ฅผ ๊ฐ์†Œ์‹œํ‚ค์ง€๋งŒ ํ•ด๋‹น ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ์—์„œ pop์„ ํ•  ๊ฒฝ์šฐ null ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€ ์ฝ”๋“œ

Object result = elements[--size]; 
elements[size] = null; 
return result;

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์˜ ์ด์ ์€ null ์ฒ˜๋ฆฌํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์ฐธ์กฐํ• ๋•Œ NullpointerException์„ ๋˜์ง€๋ฉฐ ์ž˜๋ชป๋œ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.
์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ์บ์‹œ์—ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฃผ๋ฒ”์ด๋‹ค.
์บ์‹œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์บ์‹œ์— ๋„ฃ์–ด๋‘๊ณ  ์žŠ๋Š” ๋“ฑ ๋ฌธ์ œ์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž WeakHashMap์„ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ๋‹ค ์“ด ์—”ํŠธ๋ฆฌ๋Š” ์ฆ‰์‹œ ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์„ธ ๋ฒˆ์งธ ์ฃผ๋ฒ”์€ ๋ฆฌ์Šค๋„ˆ ํ˜น์€ ์ฝœ๋ฐฑ์ด๋‹ค.
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝœ๋ฐฑ์„ ๋“ฑ๋ก๋งŒ ํ•˜๊ณ  ํ•ด์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ณ„์†ํ•ด์„œ ์ฝœ๋ฐฑ์ด ์Œ“์—ฌ๊ฐ„๋‹ค.
์ด๋Ÿด ๋•Œ weak reference๋กœ ์ €์žฅํ•˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ฆ‰์‹œ ์ˆ˜๊ฑฐํ•ด๊ฐ„๋‹ค.


์ •๋ฆฌ

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๊ฒ‰์œผ๋กœ ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์•„ ์ˆ˜๋…„๊ฐ„ ์ž ๋ณตํ•˜๋Š” ์‚ฌ๋ก€๋„ ์žˆ๋‹ค.
์ฝ”๋“œ๋ฆฌ๋ทฐ๋‚˜ ํž™ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐ™์€ ๋””๋ฒ„๊น… ๋„๊ตฌ๋ฅผ ๋™์›ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ˆ๋ฐฉ๋ฒ•์„ ์ตํ˜€๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.