
์ค๋๋ถํฐ ๋ค์ ๋ธ๋ก๊ทธ์ ๋งค์ผ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.
ํ๋์ ๊ตฟ๋
ธํธ์ ์์ผ๋ก ์ฐ๋ฉด์ ์ ๋ฆฌํ๋๋ฐ ๋ธ๋ก๊ทธ ํ์์ผ๋ก ์ ๋ฆฌํ๋๊ฒ ๋ ๋ด์ฉ์ ๋ฆฌ๊ฐ ํ์คํ ๊ฑฐ ๊ฐ์์.
์ค๋์ ์ปฌ๋ ์ ํ๋ ์์ํฌ ์ค Set์์ ์์์ ๋ฐฐ์ด ์ซ์ ๋ฟ๋ง ์๋๋ผ ๋ฌธ์์ ๊ฐ์ฒด๋ ํด์์ฝ๋๋ก ๋ณ๊ฒฝํด์ ํด์์ธ๋ฑ์ค๋ก ์ ์ฅํ๋ ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
ํด์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ๊ฒ์, ์ญ์ ์ฑ๋ฅ์ด O(n) ์ผ๋ก ๋งค์ฐ ๋น ๋ฅด๋ค. ์์์ ๋ฐฐ์ด int, Integer ์ธ์ ์๋ฐ์๋ boolean, String ๋ฑ ์ฌ๋ฌ ํ์ ์ด ์กด์ฌํ๋ค. ์๋ฐ์ ๋ชจ๋ ํ์ ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ๊ธฐ ์ํด์๋ ๊ทธ๊ฒ์ ํด๋นํ๋ ์ซ์ ํด์์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ด์ผ ํ๋ค.
Object.hashCode() โก๏ธ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์์ ๋ง์ ํด์ ์ฝ๋๋ฅผ ํํ ๊ฐ๋ฅ
@Override
public int hashCode() {
return Objects.hashCode(id);
}
Object์ hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ์ฌ์ฉ๋๋ค. ์๋ฐ์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ํ์ ์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด์๋ค.
โ๏ธ Object ์ hashCode : ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํด์์ฝ๋ ์์ฑํด์ ๋ค๋ฅธ ์ธ์คํด์ค๋ฉด ๋ค๋ฅธ ํด์์ฝ๋๊ฐ ์์ฑ๋จ โก๏ธ ๋คํ์ฑ์ผ๋ก ํ์ฉโผ๏ธ
โ๏ธ ์๋ฐ์ ๊ธฐ๋ณธ ํด์์ฝ๋ : ๋๋ถ๋ถ ๋ด๋ถ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด์์ฝ๋๊ฐ ์์ฑ๋๋๋ก ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด์์
hashCode ๋ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ์ํ ๋ถ๋ฅ์ฉ
equals ๋ ์ง์ง ๊ฐ์์ง ์ต์ข
ํ์ธ์ฉ
๋ค๋ฅธ ๊ฐ์ฒด๋ผ๋ ๊ฐ์ hashCode๊ฐ ๋์ฌ ์ ์๋ค. โก๏ธ ํด์ ์ถฉ๋๐ฅ
๋ equals๋ง ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๋ฅผ ํ๋ํ๋ ๋น๊ตํด์ผํด์ ์ฑ๋ฅ์ด ๋จ์ด์ง. ๊ทธ๋์ hashCode๋ก ๋จผ์ ๊ฑฐ๋ฅธ๋ค.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Member member = (Member) o;
return Objects.equals(id,member.id);
}
1. ์ฐธ์กฐ ๋์ผ์ฑ ๋น๊ต
if (this == o) return true;
: ๊ฐ์ ์ธ์คํด์ค์ผ ๊ฒฝ์ฐ / ๋ฌด์กฐ๊ฑด ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ ํ์ธํ ํ์ ์์ด true๋ฅผ ๋ฐํ
2. ๋น๊ต ๋์ ๊ฒ์ฆ (NPE, ํ์
์์ ์ฑ)
if (o == null || getClass() != o.getClass()) return false;
: ์ ์ฅํ๋ ค๋ ๊ฐ์ฒด๊ฐ null์ด๊ฑฐ๋ ๋น๊ตํ๋ ค๋ ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ํ์
์ผ ๊ฒฝ์ฐ / NullPointerException(NPE) ๋ฐ์, ๋ค๋ฅธ ํ์
์ด๋ฉด ๋น์ฐํ ๋๋ฑ์ฑ โ
3. ์ค์ ๋๋ฑ์ฑ ํ๋จ (ํ๋ ๊ฐ ๋น๊ต)
Member member = (Member) o;
: Object ํ์
์ธ o ๋ฅผ ๋น๊ตํ๋ ค๋ ๊ฐ์ฒด์ ํ์
์ผ๋ก ๋ค์ด์บ์คํ
/ ์ ํํ ๋น๊ต๋ฅผ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ ์ ์๋๋ก
๊ฐ์ฒด โ hashCode() ํธ์ถ
๊ฐ์ hashCode ๋ฒํท์ผ๋ก ์ด๋
๋ฒํท ์์์
์๋ฐ์ ๊ธฐ๋ณธ ํ์ ์ ์ด๋ฏธ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด์๋ค. ๋ด๊ฐ ๋ง๋ ํด๋์ค๋ ๋ด๊ฐ ์ง์ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ผํ๋ค.
public class Member {
...
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
์ฐธ์กฐ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ Object์ hashCode() ๋ฅผ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด์์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ฝ๋๋ฅผ ์ง ๋ค.
ํด์์ฝ๋๋ ์์๊ฐ ๋์ฌ ์ ์์ด์ ํด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ๋ Math.abs() ๋ฅผ ๋ฃ์ด์ผ ํ๋ค.