item 76 lsucret - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item 76] ๊ฐ€๋Šฅํ•œ ํ•œ ์‹คํŒจ ์›์ž์ ์œผ๋กœ ๋งŒ๋“ค๋ผ

์‹คํŒจ ์›์ž์  ๋ฉ”์„œ๋“œ

ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ

์‹คํŒจ ์›์ž์  ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด

๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ•œ๋‹ค.

์‹คํŒจํ•˜๋ฉด ์ƒˆ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์„ ์ˆœ ์žˆ์œผ๋‚˜, ๊ธฐ์กด ๊ฐ์ฒด๊ฐ€ ๋ถˆ์•ˆ์ •ํ•œ ์ƒํƒœ์— ๋น ์ง€๋Š” ์ผ์€ ์—†๋‹ค.

๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

1. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

// p.37 Stack ์ฐธ์กฐ
public Object pop() {
	if (size == 0)
		throw new EmptyStackException();
	Object result = elements[--size];
	elements[size] = null; // ๋‹ค ์“ด ์ฐธ์กฐ ํ•ด์ œ
	return result;
}
  • ์ฒ˜์Œ์˜ if๋ฌธ์—์„œ size๊ฐ€ 0์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€๋งŒ ์ด ์ฝ”๋“œ๊ฐ€ ์—†์–ด๋„ ์Šคํƒ์ด ๋น„์—ˆ๋‹ค๋ฉด(๋” ๋นผ๋‚ผ๊ฒŒ ์—†์œผ๋ฉด) ์—ฌ์ „ํžˆ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ pop์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ArrayOutOfBoundsException์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ์ƒํ™ฉ์— ์–ด์šธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.(item 73)

2. ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์•ž์— ์œ„์น˜์‹œํ‚จ๋‹ค.

๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์—๋Š” ์ธ์ˆ˜์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์ƒํƒœ๋ฅผ ๋ฐ”๊พธ๊ธฐ ์ „์— ๋จผ์ € ์‹คํŒจ์‹œํ‚ค๋Š” ์ „๋žต์ด๋‹ค.

ex) TreeMap์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์šฐ์„  ์›์†Œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์œ„์น˜๋ฅผ ์ฐพ๊ณ , ํŠธ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝ ํ•  ๊ฒƒ์ด๋‹ค.
์ด ๋•Œ, ์—‰๋šฑํ•œ ํƒ€์ž…์˜ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค๋ฉด ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์ค‘์— ClassCastException์ด ๋˜์ ธ์งˆ ๊ฒƒ์ด๋‹ค.

3. ์ž„์‹œ ๋ณต์‚ฌ๋ณธ์—์„œ ์ž‘์—… ์ˆ˜ํ–‰ ํ›„, ์ž‘์—…์ด ์„ฑ๊ณตํ•œ ํ›„ ์›๋ž˜ ๊ฐ์ฒด์™€ ๊ต์ฒดํ•œ๋‹ค.

ex) ์ •๋ ฌ ๋ฉ”์„œ๋“œ์—์„œ, ์ •๋ ฌ ์ˆ˜ํ–‰ ์ „ ์›์†Œ๋“ค์„ ๋ฐฐ์—ด์— ์˜ฎ๊ฒจ ๋‹ด๋Š” ๊ฒฝ์šฐ,
๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์—์„œ ์›์†Œ๋“ค์— ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์—ฌ ์„ฑ๋Šฅ๋„ ๋†’์•„์ง€๋ฉฐ,
์ •๋ ฌ์— ์‹คํŒจํ•˜๋”๋ผ๋„ ์ž…๋ ฅ ๋ฆฌ์ŠคํŠธ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4. ๋ณต๊ตฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๋ณต๊ตฌ ์ฝ”๋“œ: ์ž‘์—… ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์‹คํŒจ๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์ž‘์—… ์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์คŒ.

์ฃผ๋กœ (๋””์Šคํฌ ๊ธฐ๋ฐ˜์˜) ๋‚ด๊ตฌ์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ์“ฐ์ด๋ฉฐ, ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

  • ์‹คํŒจ ์›์ž์„ฑ์€ ๊ถŒ์žฅ๋˜๋Š” ๋•๋ชฉ์ด๋‚˜, ํ•ญ์ƒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ์‹คํŒจ ์›์ž์„ฑ์„ ๋Š˜ ๋‹ฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ์‹คํŒจ ์›์ž์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋น„์šฉ์ด๋‚˜, ๋ณต์žก๋„ ํฐ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฉ”์„œ๋“œ ๋ช…์„ธ์— ๊ธฐ์ˆ ํ•œ ์˜ˆ์™ธ๋Š” ์‹คํŒจ ์›์ž์„ฑ์ด ์ง€์ผœ์ ธ์•ผ ํ•˜๋Š”๊ฒŒ ๊ธฐ๋ณธ ๊ทœ์น™์ด๋ฉฐ, ์ด ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์‹คํŒจ ์‹œ์˜ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ API ์„ค๋ช…์— ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

์ •๋ฆฌ

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