Skip to content

Latest commit

ย 

History

History
60 lines (44 loc) ยท 2.74 KB

Item_11._override_hashCode.md

File metadata and controls

60 lines (44 loc) ยท 2.74 KB

Item 11. equals๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๊ฑฐ๋ฉด hashCode๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ผ

hashCode

public int hashCode() {}
  • Object ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜
    • ์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ฐ˜๋“œ์‹œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๋ฐ˜ํ™˜๋จ

hashCode๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•  ๋•Œ?

  • equals ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๋•Œ
    • ์ด๋Š” ๊ณง ๋ฌผ๋ฆฌ์  ๋™์ผ์„ฑ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๋…ผ๋ฆฌ์  ๋™์ผ์„ฑ๋„ ๋”ฐ์ ธ์•ผ ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ์ด ๊ฒฝ์šฐ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™์ผํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ™์€ hashCode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ด์•ผ ํ•จ
    • ์ฆ‰, equals์ด ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ hashCode ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ

hashCode ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ข‹์€ ์˜ˆ

์ „ํ†ต์ ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹

@Override
public int hashCode() {
	int result = 0;
	result = 31 * result + Integer.hashCode(number);
	result = 31 * result + String.hashCode(string);
	...
	return result;
}
  1. int ๋ณ€์ˆ˜ result๋ฅผ ์„ ์–ธํ•˜๊ณ  0์œผ๋กœ ์ดˆ๊ธฐํ™”
  2. ์ˆœ์ฐจ์ ์œผ๋กœ equals์˜ ๋น„๊ต ๋Œ€์ƒ์ด ๋˜๋Š” ํ•„๋“œ๋“ค์˜ hash code๋ฅผ ๊ตฌํ•˜๊ณ  result์— ๋”ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์ด์ „์˜ result๋ฅผ ๊ทธ๋ƒฅ ๋”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 31์„ ๊ณฑํ•œ ๊ฐ’์„ ๋”ํ•จ
    • hash code๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•?
      • primitive type์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํƒ€์ž…์˜ Wrapper ํด๋ž˜์Šค์˜ hashCode ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , reference type์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ์ฒด์˜ hashCode ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , null์ธ ๊ฒฝ์šฐ 0์„ ์‚ฌ์šฉ
    • 31์„ ๊ณฑํ•œ ๊ฐ’์„ ๋”ํ•˜๋Š” ์ด์œ ?
      • ๋‹จ์ˆœํžˆ result๋งŒ ๋”ํ•˜๋ฉด ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ’์€ ๊ฐ™์œผ๋‚˜ ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์ด ๊ฐ™์€ hash code๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๊ทœ์•ฝ์— ์–ด๊ธ‹๋‚จ
      • ์ฆ‰, ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•„๋“œ์˜ ์ˆœ์„œ๋„ ๋ฐ์— ๊ณ ๋ ค ๋Œ€์ƒ์ด ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํ™€์ˆ˜์ด์ž ์†Œ์ˆ˜์ธ 31์„ ์ด์šฉ
  3. result๋ฅผ ๋ฐ˜ํ™˜

Guava์˜ Hashing์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • google์ด ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ Guava์˜ Hashing ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด hashCode๋ฅผ ์ƒ์„ฑ

Objects์˜ hash ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

@Override
public int hashCode() {
	return Objects.hash(field1, field2, field3, ...);
}
  • ์ „ํ†ต์ ์ธ ๋ฐฉ์‹๋ณด๋‹ค ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์€ ๋›ฐ์–ด๋‚˜์ง€๋งŒ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •, ์ž…๋ ฅ๊ฐ’ ์ค‘ primitive type์€ boxingํ•˜๊ณ  ๋‹ค์‹œ unboxingํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋˜์–ด ์ „ํ†ต์  ๋ฐฉ์‹๋ณด๋‹ค ์„ฑ๋Šฅ์€ ์กฐ๊ธˆ ๋–จ์–ด์ง

AutoValue ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ IDE์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” hashCode๋ฅผ ์ด์šฉ

  • ์‚ฌ๋žŒ์ด ๊ตฌํ˜„ํ•˜๋‹ค๊ฐ€ ์‹ค์ˆ˜ํ•  ์œ„ํ—˜์„ ์ค„์—ฌ์ค€๋‹ค๋Š” ์ ์—์„œ ์ข‹์Œ
  • AutoValue๋Š” ํšจ์œจ์ ์œผ๋กœ equals์™€ hashCode๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ”„๋ ˆ์ž„์›Œํฌ