item 64 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ฐธ์กฐํ•˜๋ผ

  • ์•„์ดํ…œ 51 ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•˜๋ผ ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์œผ๋กœ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ผ ๋Š” ๋‚ด์šฉ์ด ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์„œ๋“œ์— HashMap์„ ๋„˜๊ธธ ์ผ์€ ์ „ํ˜€ ์—†๋‹ค. ๋Œ€์‹  Map์„์‚ฌ์šฉํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ค Map ๊ตฌํ˜„์ฒด๋„ ์ธ์ˆ˜๋กœ ๊ฑด๋„ฌ ์ˆ˜ ์žˆ๋‹ค. (TreeMap, ConcurrentHashMap)
  • ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹ ์—ํด๋ž˜์Šค๋ฅผ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํŠน์ • ๊ตฌํ˜„์ฒด๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๊ผด์ด๋ฉฐ ํ˜น์‹œ๋ผ๋„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ช…์‹œํ•œ ํŠน์ • ๊ตฌํ˜„์ฒด์˜ ๊ฐ์ฒด๋กœ ์˜ฎ๊ฒจ ๋‹ด๋Š๋ผ ๋น„์‹ผ ๋ณต์‚ฌ ๋น„์šฉ์„ ์น˜๋Ÿฌ์•ผ ํ•œ๋‹ค.
  • ์ด ๋‚ด์šฉ์„ ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฐธ์กฐํ•˜๋ผ ๊ณ ๊นŒ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ํ•ฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฟ ์•„๋‹ˆ๋ผ ๋ฐ˜ํ™˜๊ฐ’, ๋ณ€์ˆ˜, ํ•„๋“œ๋ฅผ ์ „๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋ผ.

  • ๊ฐ์ฒด์˜ ์‹ค์ œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ƒํ™ฉ์€ ์˜ค์ง ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•  ๋•Œ ๋ฟ์ด๋‹ค.

Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ LinkedHashSet ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ž

// ์ข‹์€ ์˜ˆ. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.
Set<Son> sonSet = new LinkedHashSet<>();

// ๋‚˜์œ ์˜ˆ. ํด๋ž˜์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

๋งŒ์•ฝ LinkedHashSet์„ TreeSet์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

//์ข‹์€ ์˜ˆ
Set<Son> sonSet = new TreeSet<>();

//๋‚˜์œ ์˜ˆ
LinkedHashSet<Son> sonSet = new TreeSet<>(); //์ปดํŒŒ์ผ ์—๋Ÿฌ!
  • ์œ„์˜ ์ข‹์€ ์˜ˆ๋Š” Set ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํƒ€์ž„/๋Ÿฐํƒ€์ž„์— ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋‚˜์œ ์˜ˆ๋Š” LinkedHashSet ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— TreeSet์„ LinkedHashSet๋กœ ํ˜•๋ณ€ํ™˜ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ๋‘๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ํ›จ์”ฌ ์œ ์—ฐํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

๋‚˜์ค‘์— ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๊ต์ฒดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๊ทธ์ € ์ƒˆ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž(ํ˜น์€ ๋‹ค๋ฅธ ์ •์  ํŒฉํ„ฐ๋ฆฌ)๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

Set<Son> sonSet = new HashSet<>();
  • ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ์ „ํ˜€ ์†๋Œ€์ง€ ์•Š๊ณ  ์ƒˆ๋กœ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋กœ์˜ ๊ต์ฒด๊ฐ€ ์™„๋ฃŒ๋๋‹ค.
  • ์ฃผ๋ณ€ ์ฝ”๋“œ๋Š” ์˜› ํด๋ž˜์Šค์˜ ์กด์žฌ๋ฅผ ์• ์ดˆ๋ถ€ํ„ฐ ๋ชฐ๋ž์œผ๋‹ˆ ์ด๋Ÿฌํ•œ ๋ณ€ํ™”์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ๋„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์žฅ์ 

  • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ปดํŒŒ์ผ์—๋Ÿฌ/๋Ÿฐํƒ€์ž„์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ฑฑ์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๋‹จ์ 

  • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํŠน์ • ๊ตฌํ˜„์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

  • ์›๋ž˜์˜ ํด๋ž˜์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ ์ด์™ธ์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ฃผ๋ณ€ ์ฝ”๋“œ๊ฐ€ ์ด๊ธฐ๋Šฅ์— ๊ธฐ๋Œ€์–ด ๋™์ž‘ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋„ ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
  • ์„ ์–ธ ํƒ€์ž…๊ณผ ๊ตฌํ˜„ ํƒ€์ž…์„ ๋™์‹œ์— ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋‹ˆ ๋ณ€์ˆ˜๋ฅผ ๊ตฌํ˜„ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•ด๋„ ๊ดœ์ฐฎ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ธฐ์กด ํƒ€์ž…์—์„œ๋งŒ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ฑฐ๋‚˜ ๊ธฐ์กด ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์— ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ฒผ๋‹ค๊ณ  ํ•  ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ฝ”๋“œ์—์„œ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์ ํ•ฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ 3๊ฐ€์ง€

  1. String, Integer, Long๊ณผ ๊ฐ™์ด ๊ฐ’ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.

    • Integer, Long๊ณผ ๊ฐ™์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” Number์™€ ๊ฐ™์€ ์ƒ์œ„ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
    • ํ˜•๋ณ€ํ™˜์ด ๋ฐœ์ƒ ํ•  ๋•Œ ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ์‚ญ๋˜์–ด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ƒ์œ„ ํƒ€์ž… ๋ณด๋‹ค๋Š” ๋ณธ๋ž˜์˜ ํด๋ž˜์Šค๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  2. OutputStream ๋“ฑ java.io ํŒจํ‚ค์ง€์˜ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ํ”„๋ ˆ์ด์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋“ค์ด๋‹ค.

    • ํŠน์ • ๊ตฌํ˜„ ํด๋ž˜์Šค ๋ณด๋‹ค๋Š” (๋ณดํ†ต์€ ์ถ”์ƒ ํด๋ž˜์Šค์ธ) ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ฐธ์กฐํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.
  3. ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์—†๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋“ค์ด๋‹ค.

    • PriorityQueue ํด๋ž˜์Šค๋Š” Queue ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์—†๋Š” comparator ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ