-
์์ดํ 11. equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hashCode๋ ์ฌ์ ์ํ๋ผDevBook/Effective Java 2023. 5. 7. 12:57
๐์ํฉ
- equals๋ฅผ ์ฌ์ ์ํ ํด๋์ค ๋ชจ๋์์ hashCode๋ ์ฌ์ ์ํด์ผ ํจ
์ด์
- hashCode ์ผ๋ฐ ๊ท์ฝ์ ์ด๊ธฐ๊ฒ ๋์ด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ HashMap์ด๋ HashSet ๊ฐ์ ์ปฌ๋ ์ ์ ์์๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋จ
- ๊ท์ฝ
๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ
- hashCode๋ฅผ ์๋ชป ์ฌ์ ์ํ์ ๋ ๋ฌธ์ ๊ฐ ๋๋ ์กฐํญ์ ๋ ๋ฒ์งธ์
- hashCode๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด ๋ ผ๋ฆฌ์ ๋์น์ธ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํ์ฌ ๋ ๋ฒ์งธ ๊ท์ฝ์ ์งํค์ง ๋ชปํจ --> ์ฆ, ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํจ
์์
Map<PhoneNumber, String> map = new HashMap<>(); map.put(new PhoneNumber(010, 1234, 5678), "java"); //PhoneNumber ํด๋์ค์ equals๋ฅผ ์ฌ์ ์ํ๋๋ฐ hashCode๋ฅผ ์ฌ์ ์ํ์ง ์์ ๊ฒฝ์ฐ map.get(new PhoneNumber(010, 1234, 5678)); //์์ ๊ฐ : java, ์ค์ ๊ฐ : null
- PhoneNumber ํด๋์ค์ hashCode๋ฅผ ์ฌ์ ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ ผ๋ฆฌ์ ๋์น์ธ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ get ๋ฉ์๋๋ ์๋ฑํ ํด์ ๋ฒํท์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ผ๋ ค ํจ
- ๋ง์ฝ ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ๋ฒํท์ ๋ด์๋๋ผ๋ get ๋ฉ์๋๋ ์ฌ์ ํ null์ ๋ฐํํจ
- HashMap์ ํด์์ฝ๋๊ฐ ๋ค๋ฅธ ์ํธ๋ฆฌ๋ผ๋ฆฌ๋ ๋์น์ฑ ๋น๊ต๋ฅผ ์๋์กฐ์ฐจ ํ์ง ์๋๋ก ์ต์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์
=> ์ด ๋ฌธ์ ๋ ์ ์ ํ hashCode ๋ฉ์๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ํด๊ฒฐ๋จ!
๐๋ฐฉ๋ฒ
์ฌ๋ฐ๋ฅธ hashCode ๋ฉ์๋๋ ์ด๋ค ๋ชจ์ต์ด์ด์ผ ํ ๊น?
1)
์ฝ๋11-1 ์ต์ ์ hashCode ๊ตฌํ - ์ฌ์ฉ ๊ธ์ง!
@Override public int hashCode() { return 42; }
๋ฌธ์ ์
- ๋ชจ๋ ๊ฐ์ฒด์์ ๋๊ฐ์ ๊ฐ์ ๋ฐํํ๋ฏ๋ก ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํด์ํ ์ด๋ธ์ ๋์ผํ ๋ฒํท์ ๋ด๊ฒจ ๋ง์น ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ฒ๋ผ ๋์ํจ
- ํ๊ท ์ํ ์๊ฐ์ด O(1)์ธ ํด์ํ ์ด๋ธ์ด O(n)์ผ๋ก ๋๋ ค์ง
2)
- ์ข์ ํด์ ํจ์๋ผ๋ฉด ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค์ ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํจ
- ์ด์์ ์ธ ํด์ ํจ์๋ ์ฃผ์ด์ง ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ค์ 32๋นํธ ์ ์ ๋ฒ์์ ๊ท ์ผํ๊ฒ ๋ถ๋ฐฐํด์ผ ํจ
- ์ด์์ ์๋ฒฝํ ์คํํ๊ธฐ๋ ์ด๋ ต์ง๋ง ๋น์ทํ๊ฒ ๋ง๋๋ ๊ฐ๋จํ ์๋ น์ ๋ค์๊ณผ ๊ฐ์
ํด๋น ์๋ น์ ์ ์ฉํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์
์ฝ๋ 11-2 ์ ํ์ ์ธ hashCode ๋ฉ์๋
@Override public int hashCode() { int result = Short.hashCode(areaCode); result = 31 * result + Short.hashCode(prefix); result = 31 * result + Short.hashCode(lineNum); return result; }
์ถ๊ฐ
- ํด์ ์ถฉ๋์ด ๋ ์ ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ๊ตฌ์๋ฐ์ com.google.common.hash.Hashing ์ฐธ๊ณ
3)
- Objects ํด๋์ค๋ ์์์ ๊ฐ์๋งํผ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด์ฃผ๋ ์ ์ ๋ฉ์๋์ธ hash๋ฅผ ์ ๊ณตํจ
- ํ์ง๋ง hash๋ ์๋๊ฐ 2) ๋ณด๋ค ๋ ๋๋ฆผ
- ์ ๋ ฅ ์ธ์๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด์ด ๋ง๋ค์ด์ง๊ณ , ์ ๋ ฅ ์ค ๊ธฐ๋ณธ ํ์ ์ด ์๋ค๋ฉด ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ์ ๊ฑฐ์ณ์ผ ํจ
- ๋ฐ๋ผ์ hash ๋ฉ์๋๋ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ์ง ์์ ์ํฉ์์๋ง ์ฌ์ฉํ์
์ฝ๋ 11-3 ํ ์ค์ง๋ฆฌ hashCode ๋ฉ์๋ - ์ฑ๋ฅ์ด ์ด์ง ์์ฌ์
@Override public int hashCode() { return Objects.hash(lineNum, prefix, areaCode); }
4)
- ํด๋์ค๊ฐ ๋ถ๋ณ์ด๊ณ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด, ๋งค๋ฒ ์๋ก ๊ณ์ฐํ๊ธฐ๋ณด๋ค๋ ์บ์ฑํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํจ
- ๊ฒฝ์ฐ์ ๋ฐ๋ฅธ ๋ฐฉ์
- ํด๋น ํ์ ์ ๊ฐ์ฒด๊ฐ ์ฃผ๋ก ํด์์ ํค๋ก ์ฌ์ฉ๋๋ค๋ฉด? --> ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง ๋ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด๋ฌ์ผ ํจ
- ํด์์ ํค๋ก ์ฌ์ฉ๋์ง ์๋๋ค๋ฉด? --> hashCode๊ฐ ์ฒ์ ๋ถ๋ฆด ๋ ๊ณ์ฐํ๋ ์ง์ฐ ์ด๊ธฐํ ์ ๋ต ๊ณ ๋ คํด์ผ ํจ
- ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํ๋ ค๋ฉด ๊ทธ ํด๋์ค๋ฅผ thread-safeํ๊ฒ ๋ง๋ค๋๋ก ์ ๊ฒฝ์จ์ผ ํจ (์์ดํ 83)
์ฝ๋ 11-4 ํด์์ฝ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํ๋ hashCode ๋ฉ์๋ - ์ค๋ ๋ ์์ ์ฑ๊น์ง ๊ณ ๋ คํด์ผ ํจ
private int hashCode; //์๋์ผ๋ก 0์ผ๋ก ์ด๊ธฐํ๋จ @Override public int hashCode() { int result = hashCode; if (result == 0) { result = Short.hashCode(areaCode); result = 31 * result + Short.hashCode(prefix); result = 31 * result + Short.hashCode(lineNum); hashCode = result; } return result; }
์ฃผ์
1) ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ํด์์ฝ๋ ๊ณ์ฐํ ๋ ํต์ฌ ํ๋๋ฅผ ์๋ตํ๋ฉด ์๋จ
- ํด์ ํ์ง์ด ๋๋น ์ ธ ํด์ํ ์ด๋ธ์ ์ฑ๋ฅ์ ์ฌ๊ฐํ๊ฒ ๋จ์ด๋จ๋ฆด ์ ์์
2) hashCode๊ฐ ๋ฐํํ๋ ๊ฐ์ ์์ฑ ๊ท์น์ ์ฌ์ฉ์์๊ฒ ์์ธํ ๊ณตํํ์ง ๋ง์
- ํด๋ผ์ด์ธํธ๊ฐ ์ด ๊ฐ์ ์์งํ์ง ์๊ฒ ๋๊ณ , ์ถํ์ ๊ณ์ฐ ๋ฐฉ์์ ๋ฐ๊ฟ ์ ์์
๐ํต์ฌ ์ ๋ฆฌ
- equals๋ฅผ ์ฌ์ ์ํ ๋๋ hashCode๋ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํจ
- ์ฌ์ ์ํ hashCode๋ Object์ API ๋ฌธ์์ ๊ธฐ์ ๋ ์ผ๋ฐ ๊ท์ฝ์ ๋ฐ๋ผ์ผ ํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ผ๋ฉด ๋๋๋ก ํด์์ฝ๋๋ ์๋ก ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํจ
- AutoValue ํ๋ ์์ํฌ๋ IDE๋ค์์ equals์ hashCode๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ
'DevBook > Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ดํ 13. clone ์ฌ์ ์๋ ์ฃผ์ํด์ ์งํํ๋ผ (0) 2023.05.07 ์์ดํ 12. toString์ ํญ์ ์ฌ์ ์ํ๋ผ (0) 2023.05.07 ์์ดํ 10. equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ (0) 2023.05.06 3์ฅ - ๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋ (0) 2023.05.06 ์์ดํ 9. try-finally๋ณด๋ค๋ try-with-resources๋ฅผ ์ฌ์ฉํ๋ผ (0) 2023.05.06