item 11 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ11 equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ

  • equals๋ฅผ ์žฌ์ •์˜ํ•œ ํด๋ž˜์Šค ๋ชจ๋‘์—์„œ hashCode๋„ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด hashCode ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์–ด๊ธฐ๊ฒŒ ๋˜์–ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ HashMap ์ด๋‚˜ HashSet ๊ฐ™์€ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ด๋‹ค.

Object ๋ช…์„ธ

equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ทธ ๊ฐ์ฒด์˜ hashCode ๋ฉ”์„œ๋“œ๋Š” ๋ช‡ ๋ฒˆ์„ ํ˜ธ์ถœํ•ด๋„ ์ผ๊ด€๋˜๊ฒŒ ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์ด ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ๋„ ์ƒ๊ด€์—†๋‹ค. equals(Object)๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode๋Š” ๋˜‘๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. equals(Object)๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋”๋ผ๋„, ๋‘ ๊ฐ์ฒด์˜ hashCode๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋‹จ, ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.

  • hashCode ์žฌ์ •์˜๋ฅผ ์ž˜๋ชปํ–ˆ์„ ๋•Œ ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์กฐํ•ญ์€ ๋‘ ๋ฒˆ์งธ๋‹ค. ์ฆ‰, ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

์ตœ์•…์˜ ํ•ด์‹œ ์ฝ”๋“œ

@Override public int hashCode() { return 42; }
  • Object ๋ช…์„ธ์˜ 2๋ฒˆ์งธ ์กฐํ•ญ์€ ๋งŒ์กฑํ•œ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๋ฒ„ํ‚ท ํ•˜๋‚˜์— ๋‹ด๊ฒจ ๋งˆ์น˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(linked list)์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ํ‰๊ท  ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด O(1)์ธ ํ•ด์‹œํ…Œ์ด๋ธ”์ด O(n)์œผ๋กœ ๋Š๋ ค์ ธ์„œ, ๊ฐ์ฒด๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋„์ €ํžˆ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์ „ํ˜•์ ์ธ ํ•ด์‹œ ์ฝ”๋“œ

@Override public int hashCode() {
    int result = Short.hashCode(areaCode);
    result = 31 * result + Short.hashCode(prefix);
    result = 31 * result + Short.hashCode(lineNum);
    return result;
}
  • ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ hashCode์˜ ์„ธ ๋ฒˆ์งธ ๊ทœ์•ฝ์ด ์š”๊ตฌํ•˜๋Š” ์†์„ฑ์ด๋‹ค. ์ด์ƒ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ (์„œ๋กœ ๋‹ค๋ฅธ) ์ธ์Šคํ„ด์Šค๋“ค์„ 32๋น„ํŠธ ์ •์ˆ˜ ๋ฒ”์œ„์— ๊ท ์ผํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.

ํ•ด์‹œ ์ฝ”๋“œ ์ž‘์„ฑ ํŒ

@Override public int hashCode() {
    return Objects.hash(lineNum, prefix, areaCode);
}
  1. ํ•œ์ค„์งœ๋ฆฌ ํ•ด์‹œ ์ฝ”๋“œ. ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ์•„์‰ฝ์ง€๋งŒ ์“ธ๋งŒ ํ•˜๋‹ค.
  2. ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ด๊ณ  ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋น„์šฉ์ด ํฌ๋‹ค๋ฉด, ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์บ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  3. ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ต์‹œ๊ณ  ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ํ•ด์‹ฑ์€ ๋นจ๋ผ์ง€๊ฒ ์ง€๋งŒ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  4. hashCode๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์ƒ์„ฑ ๊ทœ์น™์„ API ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์„ธํžˆ ๊ณตํ‘œํ•˜์ง€ ๋ง์ž. ๊ทธ๋ž˜์•ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด ๊ฐ’์— ์˜์ง€ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ , ์ถ”ํ›„์— ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

equals๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
์žฌ์ •์˜ํ•œ hashCode๋Š” Object์˜ API ๋ฌธ์„œ์— ๊ธฐ์ˆ ๋œ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•˜๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ๋˜๋„๋ก ํ•ด์‹œ์ฝ”๋“œ๋„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ