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์— ํ‚ค๋กœ ์ €์žฅํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ ํ•˜๋‹ค.

์ฝœ๋ฐฑ์„ ๋“ฑ๋ก๋งŒ ํ•˜๊ณ  ๋ช…ํ™•ํžˆ ํ•ด์ง€ ํ•˜์ง€ ์•Š๋Š” ์ผ€์ด์Šค๋Š” ์–ด๋–ค ์ผ€์ด์Šค ์ผ๊นŒ?

์ •๋ฆฌ

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