Item 11. equals๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ ๊ฑฐ๋ฉด 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 ;
}
int ๋ณ์ result๋ฅผ ์ ์ธํ๊ณ 0์ผ๋ก ์ด๊ธฐํ
์์ฐจ์ ์ผ๋ก equals์ ๋น๊ต ๋์์ด ๋๋ ํ๋๋ค์ hash code๋ฅผ ๊ตฌํ๊ณ result์ ๋ํ๋๋ฐ, ์ด ๋ ์ด์ ์ result๋ฅผ ๊ทธ๋ฅ ๋ํ๋ ๊ฒ์ด ์๋๋ผ 31์ ๊ณฑํ ๊ฐ์ ๋ํจ
hash code๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ?
primitive type์ ๊ฒฝ์ฐ ํด๋น ํ์
์ Wrapper ํด๋์ค์ hashCode ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , reference type์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์ hashCode ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , null์ธ ๊ฒฝ์ฐ 0์ ์ฌ์ฉ
31์ ๊ณฑํ ๊ฐ์ ๋ํ๋ ์ด์ ?
๋จ์ํ result๋ง ๋ํ๋ฉด ๊ตฌ์ฑํ๋ ๊ฐ์ ๊ฐ์ผ๋ ๊ฐ์ ์์๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ๊ฐ์ hash code๋ฅผ ๋ฐํํ๊ฒ ๋๊ณ , ์ด๋ ๊ท์ฝ์ ์ด๊ธ๋จ
์ฆ, ํด์๊ฐ์ ๊ณ์ฐํ๋ ํ๋์ ์์๋ ๋ฐ์ ๊ณ ๋ ค ๋์์ด ๋๋๋ก ํ๊ธฐ ์ํด ํ์์ด์ ์์์ธ 31์ ์ด์ฉ
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
๋ฅผ ์ฌ์ ์ํ ์ ์๋๋ก ๋๋ ํ๋ ์์ํฌ