item 11 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- equals๋ฅผ ์ฌ์ ์ํ ํด๋์ค ๋ชจ๋์์ hashCode๋ ์ฌ์ ์ํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด hashCode ์ผ๋ฐ ๊ท์ฝ์ ์ด๊ธฐ๊ฒ ๋์ด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ HashMap ์ด๋ HashSet ๊ฐ์ ์ปฌ๋ ์ ์ ์์๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์ด๋ค.
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);
}
- ํ์ค์ง๋ฆฌ ํด์ ์ฝ๋. ์ฑ๋ฅ์ด ์ฝ๊ฐ ์์ฝ์ง๋ง ์ธ๋ง ํ๋ค.
- ํด๋์ค๊ฐ ๋ถ๋ณ์ด๊ณ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด, ๋งค๋ฒ ์๋ก ๊ณ์ฐํ๊ธฐ๋ณด๋ค๋ ์บ์ฑํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ฑ๋ฅ์ ๋์ธ๋ต์๊ณ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ ๋ ํต์ฌ ํ๋๋ฅผ ์๋ตํด์๋ ์ ๋๋ค. ํด์ฑ์ ๋นจ๋ผ์ง๊ฒ ์ง๋ง ์ถฉ๋์ด ๋ฐ์ํด ํด์ ํ ์ด๋ธ์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค.
- hashCode๊ฐ ๋ฐํํ๋ ๊ฐ์ ์์ฑ ๊ท์น์ API ์ฌ์ฉ์์๊ฒ ์์ธํ ๊ณตํํ์ง ๋ง์. ๊ทธ๋์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ด ๊ฐ์ ์์งํ์ง ์๊ฒ ๋๊ณ , ์ถํ์ ๊ณ์ฐ ๋ฐฉ์์ ๋ฐ๊ฟ ์๋ ์๋ค.
equals๋ฅผ ์ฌ์ ์ํ ๋๋ hashCode๋ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํ๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค.
์ฌ์ ์ํ hashCode๋ Object์ API ๋ฌธ์์ ๊ธฐ์ ๋ ์ผ๋ฐ ๊ท์ฝ์ ๋ฐ๋ผ์ผ ํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ผ๋ฉด ๋๋๋ก ํด์์ฝ๋๋ ์๋ก ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํ๋ค.