| description | Overriding hashCode |
|---|
equals๋ฅผ ์ฌ์ ์ํ ํด๋์ค๋hashCode๋ ์ฌ์ ์ ํด์ผ ํ๋ค.๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ
HashMap์ด๋HashSet๊ฐ์ ์ปฌ๋ ์ ์ ์์๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
โ๏ธ ์ผ๊ด์ฑ : equals ๋น๊ต์ ์ฌ์ฉ๋๋ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด, hashCode๋ ๋ณํ๋ฉด ์ ๋๋ค. (์ ํ๋ฆฌ์ผ์ด์
์ ๋ค์ ์คํํ๋ค๋ฉด ์ด ๊ฐ์ด ๋ฌ๋ผ์ ธ๋ ์๊ด ์์)
โ๏ธ equals(Object)๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ค๊ณ ํ๋จํ๋ค๋ฉด, ๋ ๊ฐ์ฒด์ hashCode๋ ๋๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
-> โญ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ ๊ฐ์ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค.
โ๏ธ equals๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๋ค๊ณ ํ๋จํ๋๋ผ๋, hashCode๋ ๊ผญ ๋ค๋ฅผ ํ์๋ ์๋ค. ํ์ง๋ง, ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํด์๋ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํด์ผ ํด์ํ
์ด๋ธ์ ์ฑ๋ฅ์ด ์ข์์ง๋ค.
equals๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ค๊ณ ํ ๋, hashCode ๋ฉ์๋๋ ์ด ๋์ด ์์ ํ ๋ค๋ฅธ ๊ฑฐ๋ผ๊ณ ํ๋จ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ค.
Map<PhoneNumber, String> map = new HashMap<>();
map.put(new PhoneNumber(010,1234,5678), "๋ฆฌ์น");์ด ์ฝ๋์ map.get(new PhoneNumber(010,1234,5678))๋ฅผ ์คํํ๋ฉด "๋ฆฌ์น"๊ฐ ์๋ null์ ๋ฐํํ๋ค.
PhoneNumber ํด๋์ค๋ hashCode๋ฅผ ์ฌ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์, ๋
ผ๋ฆฌ์ ๋์น์ธ ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํ์ฌ get ๋ฉ์๋๋ ์๋ฑํ ํด์ ๋ฒํท์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ผ๋ ค ํ ๊ฒ์ด๋ค.
HashMap์ ํด์์ฝ๋๊ฐ ์๋ก ๋ค๋ฅธ ์ํธ๋ฆฌ๋ผ๋ฆฌ๋ ๋์น์ฑ ๋น๊ต๋ฅผ ์๋์กฐ์ฐจ ์๋๋ก ์ต์ ํ ๋์ด์๋ค.
์ด ๋ฌธ์ ๋ PhoneNumber์ ์ ์ ํ hashCode ๋ฉ์๋๋ง ์์ฑํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
@Override
public int hashCode() {
return 42;
}์ ๋๋ค. ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ๋๊ฐ์ ๊ฐ๋ง ๋ด์ด์ฃผ๋ฏ๋ก ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํด์ํ
์ด๋ธ์ ๋ฒํท ํ๋์ ๋ด๊ฒจ ๋ง์น ์ฐ๊ฒฐ๋ฆฌ์คํธ์ฒ๋ผ ๋์ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ํ๊ท ์ํ ์๊ฐ์ด O(1)์ธ ํด์ํ
์ด๋ธ์ด O(n)์ผ๋ก ๋๋ ค์ ธ์, ๋์ ํ ์ธ ์ ์๊ฒ ๋๋ค.
3. ์ข์ ํด์ ํจ์๋ผ๋ฉด ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค์ ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํด์ผ ํ๋ค(good)
์ด์์ ์ธ ํด์ ํจ์๋ ์ฃผ์ด์ง (์๋ก ๋ค๋ฅธ) ์ธ์คํด์ค๋ค์ 32๋นํธ ์ ์ ๋ฒ์์ ๊ท ์ผํ๊ฒ ๋ถ๋ฐฐํด์ผ ํ๋ค.
- int ๋ณ์์ธ
result๋ฅผ ์ ์ธํ ํ ๊ฐ c๋ก ์ด๊ธฐํํ๋ค.- ์ด ๋, c๋ ํด๋น ๊ฐ์ฒด์ ์ฒซ๋ฒ์งธ ํต์ฌ ํ๋๋ฅผ ๋จ๊ณ 2.1 ๋ฐฉ์์ผ๋ก ๊ณ์ฐํ ํด์์ฝ๋์ด๋ค.
- ์ฌ๊ธฐ์ ํต์ฌ ํ๋๋
equals๋น๊ต์ ์ฌ์ฉ๋๋ ํ๋๋ฅผ ๋งํ๋ค.
- ํด๋น ๊ฐ์ฒด์ ๋๋จธ์ง ํต์ฌ ํ๋์ธ f ๊ฐ๊ฐ์ ๋ํด ๋ค์ ์์
์ ์ํํ๋ค.
- ํด๋น ํ๋์ ํด์์ฝ๋ c ๋ฅผ ๊ณ์ฐํ๋ค.
-
i. ๊ธฐ๋ณธ ํ์ ํ๋์ธ ๊ฒฝ์ฐ:
- ํด๋น ํ์
์ ๋ฐ์ฑ ํด๋์ค์
hashCode()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. - ์:
Short.hashCode(f),Integer.hashCode(f)๋ฑ.
- ํด๋น ํ์
์ ๋ฐ์ฑ ํด๋์ค์
-
ii. ์ฐธ์กฐ ํ์ ํ๋์ธ ๊ฒฝ์ฐ:
- ํด๋น ํด๋์ค์
equals()๋ฉ์๋๊ฐ ์ด ํ๋์equals()๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ์ฌ ๋น๊ตํ๋ค๋ฉด, ์ด ํ๋์hashCode()๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ค. - ๊ณ์ฐ์ด ๋ณต์กํด์ง ๊ฒ ๊ฐ์ผ๋ฉด, ๊ทธ ํ๋์ ํ์คํ(canonical representation)1์ ๋ง๋ค์ด ๊ทธ ํ์คํ์
hashCode()๋ฅผ ํธ์ถํ๋ค.
์์ 1: ์ ๋ ฌ๋์ง ์์ ์ปฌ๋ ์ ํ๋
- ํ๋๊ฐ
Set<String>ํ์ ์ด๊ณ , ์ด ์งํฉ์ ์์๋ค์ ์์๊ฐ ์๋ค. Set์์ฒด์ ํด์์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ์์์ ๋ฐ๋ผ ํด์์ฝ๋๊ฐ ๋ฌ๋ผ์ง ์ ์์ด,equals()์ ์ผ๊ด์ฑ์ด ์์ด์ง ์ ์๋ค.- ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ์ด
Set์ ํ์คํ์ผ๋ก ๋ณํํ๋ค. ์๋ฅผ ๋ค์ด, ์์๋ค์ ์ ๋ ฌํ์ฌList<String>์ผ๋ก ๋ง๋ ๋ค. - ์ด๋ ๊ฒ ํ๋ฉด ํญ์ ๊ฐ์ ์์๋ก ์์๋ค์ด ์ ๋ ฌ๋๋ฏ๋ก,
hashCode()๋ฅผ ํธ์ถํด๋ ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ์ด
@Override public int hashCode() { List<String> sortedList = new ArrayList<>(stringSet); Collections.sort(sortedList); return sortedList.hashCode(); }
- ํด๋น ํด๋์ค์
-
์์ 2: ๋ณต์กํ ๊ฐ์ฒด ํ๋
- ํ๋๊ฐ ๋ณต์กํ ๊ฐ์ฒด์ธ๋ฐ, ๊ทธ ๊ฐ์ฒด์
hashCode()๊ตฌํ์ด ์๊ฑฐ๋ ๋ฏฟ์ ์ ์๋ค๊ณ ๊ฐ์ - ๋๋ ๊ทธ ๊ฐ์ฒด์ ์ํ ์ค์์ ์ฐ๋ฆฌ ํด๋์ค์
equals()์์ ์ฌ์ฉํ๋ ๋ถ๋ถ๋ง ํด์์ฝ๋์ ๋ฐ์ํ๊ณ ์ถ์ ๋๊ฐ ์๋ค. - ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ํด๋น ํ๋์์ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ๋ถ๋ถ๋ง ์ถ์ถํ์ฌ ์๋ก์ด ๊ฐ์ฒด(ํ์คํ)๋ฅผ ๋ง๋ ๋ค.
- ์๋ฅผ ๋ค์ด, ์ค์ํ ํ๋๋ค๋ง ๋ชจ์์
List๋String๋ฑ์ผ๋ก ํํ - ๊ทธ๋ฐ ๋ค์ ๊ทธ ๊ฐ์ฒด์
hashCode()๋ฅผ ํธ์ถ
@Override public int hashCode() { // ๋ณต์กํ ๊ฐ์ฒด complexField์์ ์ค์ํ ๋ถ๋ถ๋ง ์ถ์ถ String canonicalForm = complexField.getImportantPart(); return canonicalForm.hashCode(); }
- ํ๋์ ๊ฐ์ด
null์ด๋ฉด 0์ ์ฌ์ฉํ๋ค.
- ํ๋๊ฐ ๋ณต์กํ ๊ฐ์ฒด์ธ๋ฐ, ๊ทธ ๊ฐ์ฒด์
-
iii. ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ:
- ํต์ฌ ์์ ๊ฐ๊ฐ์ ๋ณ๋์ ํ๋์ฒ๋ผ ๋ค๋ฃฌ๋ค.
- ์์ ๊ท์น์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ์ฌ ๊ฐ ํต์ฌ ์์์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ ๋ค์, ์๋์ ๋ฐฉ๋ฒ์ผ๋ก
result๋ฅผ ๊ฐฑ์ ํ๋ค. - ๋ฐฐ์ด์ ํต์ฌ ์์๊ฐ ํ๋๋ ์๋ค๋ฉด ์์ 0์ ์ฌ์ฉํ๋ค.
- ๋ชจ๋ ์์๊ฐ ํต์ฌ ์์๋ผ๋ฉด
Arrays.hashCode()๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
-
- ๋จ๊ณ 2.1์์ ๊ณ์ฐํ ํด์์ฝ๋ c๋ก
result๋ฅผ ๊ฐฑ์ ํ๋ค.result= 31 *result+ c;
- ํด๋น ํ๋์ ํด์์ฝ๋ c ๋ฅผ ๊ณ์ฐํ๋ค.
result๋ฅผ ๋ฐํํ๋ค.
- ํ๋๋ฅผ ๊ณฑํ๋ ์์์ ๋ฐ๋ผ
result๊ฐ์ด ๋ฌ๋ผ์ง๋ฏ๋ก, ํ๋ ์์๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด์์ฝ๋๊ฐ ๋ฌ๋ผ์ง๋ค.
@Override
public int hashCode() {
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}- ์ด ๋ฉ์๋๋
PhoneNumber์ธ์คํด์ค์ ํต์ฌ ํ๋ 3๊ฐ(areaCode,prefix,lineNum)๋ฅผ ์ฌ์ฉํ์ฌ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ค. - ๋๋ฑํ
PhoneNumber์ธ์คํด์ค๋ค์ ๋์ผํ ํด์์ฝ๋๋ฅผ ๊ฐ์ง๋ค.
Objectsํด๋์ค์hash()๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์ค๋กhashCode()๋ฅผ ๊ตฌํํ ์ ์๋ค.
@Override
public int hashCode() {
return Objects.hash(lineNum, prefix, areaCode);
}- ๊ฐ๊ฒฐํ์ง๋ง, ์ฑ๋ฅ ๋ฉด์์ ์กฐ๊ธ ๋๋ฆด ์ ์๋ค.
- ๋ฐฐ์ด ์์ฑ๊ณผ ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ/์ธ๋ฐ์ฑ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฑ๋ฅ์ ๋ฏผ๊ฐํ์ง ์์ ์ํฉ์์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
- ํด๋์ค๊ฐ ๋ถ๋ณ์ด๊ณ ํด์์ฝ๋ ๊ณ์ฐ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ, ํด์์ฝ๋๋ฅผ ๋งค๋ฒ ๊ณ์ฐํ์ง ์๊ณ ์บ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์๋ค.
- ํด์์ ํค๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ผ๋ฉด ์ธ์คํด์ค ์์ฑ ์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด ๋ ์ ์๋ค.
- ์ง์ฐ ์ด๊ธฐํ(Lazy Initialization)๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์
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;
}- ์ฒ์ ํธ์ถ๋ ๋ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๊ณ
hashCodeํ๋์ ์ ์ฅํ๋ค. - ์ดํ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ์ฌ ๊ณ์ฐ ๋น์ฉ์ ์ค์ธ๋ค.
- ์ฃผ์: ํ๋
hashCode์ ์ด๊ธฐ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํด์์ฝ๋ ๊ฐ๊ณผ ๋ฌ๋ผ์ผ ๋ค.
equals๋น๊ต์ ์ฌ์ฉ๋๋ ํ๋์ ๋ํด์๋ง ํด์์ฝ๋2๋ฅผ ๊ณ์ฐํ๋ค. (ํ์ ํ๋๋ ์ ์ธํด๋ ๋จ)- ๋ ๋ฒ์งธ๋ฅผ ์ด๊ธฐ๊ฒ ๋ ์ ์์
- ์ฑ๋ฅ์ ๋์ธ๋ต์๊ณ ํด์์ฝ๋3๋ฅผ ๊ณ์ฐํ ๋ ํต์ฌ ํ๋๋ฅผ ์๋ตํด์๋ ์ ๋๋ค.
- ์๋ฅผ ๋ค์ด, ํน์ ์์ญ์ ์ธ์คํด์ค๋ค์ด ๋ช ๊ฐ์ ํด์์ฝ๋๋ก ์ง์ค๋ ์ ์๋ค.
- ์ค์ ๋ก ์๋ฐ 2 ์ด์ ์
Stringํด๋์ค๋ ์ต๋ 16๊ฐ์ ๋ฌธ์๋ง ์ฌ์ฉํ์ฌ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ์ฌ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๋ค.
31์ ๊ณฑํ๋ ์ด์ ๋ ๋น์ทํ ํ๋๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ ํด์ํจ๊ณผ๋ฅผ ํฌ๊ฒ ๋์ฌ์ฃผ๊ธฐ ์ํด์๋ค.
๋น์ทํ ๊ฐ๋ค์ด ์ฌ๋ฌ๊ฐ ์์๋ ๊ทธ๋ฅ ๋ํ๋ฉด ๊ฐ์ ๊ฐ์ด ๋์ฌ ํ๋ฅ ์ด ๋๋ค. ์์์ด๋ฉด์ ํ์๋ก ํด์์ฝ๋์ ๋ถํฌ๋ฅผ ๋ ๊ท ์ผํ๊ฒ ๋ง๋ ๋ค. ๊ทธ๋์ 31์ ๊ณฑํด ํฐ์๋ก ๋ง๋ค์ด ํด์ํจ๊ณผ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.(๋ง์ฝ ์ง์๋ผ๋ฉด ์ค๋ฒํ๋ก๊ฐ ๋ฐ์์ ์ ๋ณด๋ฅผ ์๊ฒ ๋จ. 2๋ฅผ ๊ณฑํ๋ ๊ฒ์ ์ํํธ ์ฐ์ฐ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ธฐ ๋๋ฌธ)
- String๊ณผ Integer๋ฅผ ํฌํจํด, ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ ํด๋์ค์์ hashcode ๋ฉ์๋๊ฐ ๋ฐํํ๋ ์ ํํ ๊ฐ์ ์๋ ค์ค๋ค.
- ๋์ค์ ๋ฌธ์ ์๊ฒผ์ ๋ ๊ณ ์น๊ธฐ ์ํจ
ํด์ ์ฝ๋ ๊ณ์ฐ ์ ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค:
java์ฝ๋ ๋ณต์ฌresult = 31 * result + c;31์ ์ฌ์ฉํ๋ ์ด์ :
- ํ์์ด์ ์์(prime number)์ด๊ธฐ ๋๋ฌธ์
๋๋ค:
- ์ ๋ณด ์์ค ๋ฐฉ์ง: ์ง์๋ฅผ ๊ณฑํ๋ฉด ์ค๋ฒํ๋ก์ฐ ์ ์ต์์ ๋นํธ๊ฐ ์์ค๋์ด ์ค์ํ ์ ๋ณด๊ฐ ์ฌ๋ผ์ง ์ ์์ต๋๋ค.
- ํ์๋ฅผ ๊ณฑํ๋ฉด: ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํด๋ ๋นํธ ํจํด์ด ๋ ์ ์์ฌ ์ ๋ณด ์์ค์ด ์ค์ด๋ญ๋๋ค.
- ์์๋ฅผ ๊ณฑํ๋ฉด ํด์ ๋ถํฌ๊ฐ ์ข์์ง๋๋ค:
- ์ถฉ๋ ๊ฐ์: ์์๋ฅผ ์ฌ์ฉํ๋ฉด ํด์ ์ฝ๋ ๊ฐ์ด ๋ ๊ท ์ผํ๊ฒ ๋ถํฌ๋์ด ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง๋๋ค.
- ํจ์จ์ ์ธ ์ฐ์ฐ:
- ์ต์ ํ ๊ฐ๋ฅ: 31์ 25โ12^5 - 125โ1์ด๋ฏ๋ก, ๊ณฑ์
์ ๋นํธ ์ํํธ์ ๋บ์
์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
31 * i๋(i << 5) - i์ ๊ฐ์ต๋๋ค.
- ์ฑ๋ฅ ํฅ์: ์ด๋ฌํ ์ต์ ํ๋ก ์ธํด ๊ณ์ฐ ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค.
- ์ต์ ํ ๊ฐ๋ฅ: 31์ 25โ12^5 - 125โ1์ด๋ฏ๋ก, ๊ณฑ์
์ ๋นํธ ์ํํธ์ ๋บ์
์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ ํต์ ์ธ ๊ด๋ก:
- ์ญ์ฌ์ ์ธ ์ด์ : ์๋ฐ์
Stringํด๋์ค ๋ฑ์์ ์ด๋ฏธ 31์ ์ฌ์ฉํด ์์ผ๋ฉฐ, ์ค๋ฌด์์ ์ข์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
- ์ญ์ฌ์ ์ธ ์ด์ : ์๋ฐ์
์ง์๋ 2๋ฅผ ๊ณฑํ์ง ์๋ ์ด์ :
- ๋นํธ ํจํด์ ๋จ์ํ:
- 2๋ฅผ ๊ณฑํ๋ ๊ฒ์ ๋นํธ ์ํํธ ์ฐ์ฐ๊ณผ ๋์ผ:
i << 1๊ณผ ๊ฐ์ต๋๋ค. - ๋นํธ ํผํฉ ๋ถ์กฑ: ๋นํธ ์ํํธ๋ง์ผ๋ก๋ ๋นํธ ํจํด์ด ์ถฉ๋ถํ ์์ด์ง ์์ ํด์ ์ฝ๋์ ๋ค์์ฑ์ด ์ค์ด๋ญ๋๋ค.
- 2๋ฅผ ๊ณฑํ๋ ๊ฒ์ ๋นํธ ์ํํธ ์ฐ์ฐ๊ณผ ๋์ผ:
- ์ ๋ณด ์์ค ์ํ:
- ์ง์ ๊ณฑ์ ์ ์ค๋ฒํ๋ก์ฐ ๋ฌธ์ : ์ค๋ฒํ๋ก์ฐ ๋ฐ์ ์ ์ต์์ ๋นํธ๊ฐ ์ฌ๋ผ์ ธ ํด์ ์ฝ๋์ ๊ณ ์ ์ฑ์ด ๊ฐ์ํฉ๋๋ค.
์์:
๋ ์ ์ a์ b๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค:
a = 4(์ด์ง์0100)b = 8(์ด์ง์1000)
2๋ฅผ ๊ณฑํ ๋:
2 * a = 8(์ด์ง์1000)2 * b = 16(์ด์ง์10000)
๋นํธ๊ฐ ์ผ์ชฝ์ผ๋ก ์ด๋ํ์ฌ ์์ ๋นํธ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
31์ ๊ณฑํ ๋:
31 * a = 12431 * b = 248
๊ฒฐ๊ณผ ๊ฐ์ด ๋ ๋๊ฒ ํผ์ง๊ณ , ๋นํธ ํจํด์ด ๋ ๋ณต์กํด์ ธ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
ํต์ฌ ํ๋๋ฅผ ์๋ตํ ๊ฒฝ์ฐ์ ๋ฌธ์ ์ :
- ํด์ ๋ถํฌ์ ๋ถ๊ท ํ: ์ค์ํ ํ๋๋ฅผ ์ ์ธํ๋ฉด ๋ค์ํ ๊ฐ์ฒด๋ค์ด ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ํด์ ์ฝ๋์ ์ง์ค: ํน์ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๋ชฐ๋ฆฌ๊ฒ ๋์ด ํด์ ํ ์ด๋ธ์ ๋ฒํท์ด ๋ถ๊ท ํํด์ง๋๋ค.
- ์ฑ๋ฅ ์ ํ: ์ถฉ๋์ด ๋ง์์ง๋ฉด ํด์ ํ ์ด๋ธ์ ์ฑ๋ฅ์ด O(1)์์ O(n)์ผ๋ก ๋จ์ด์ง๋๋ค.
์์:
Person ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค:
public class Person {
private String firstName; // ์ด๋ฆ
private String lastName; // ์ฑ
private int age; // ๋์ด
// equals()๋ ๋ชจ๋ ํ๋๋ฅผ ์ฌ์ฉ
}ํด์ ์ฝ๋๋ฅผ firstName๋ง ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ฉด:
@Override
public int hashCode() {
return firstName.hashCode();
}๊ฒฐ๊ณผ:
- ํด์ ์ฝ๋ ์ถฉ๋ ์ฆ๊ฐ: ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ง์ผ๋ฏ๋ก, ๊ทธ๋ค์ ํด์ ์ฝ๋๊ฐ ๋์ผํ๊ฒ ๋ฉ๋๋ค.
- ์: "ํ๊ธธ๋"์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ง์ ๊ฐ์ฒด๋ค์ด ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง๋๋ค.
- ๋ฒํท์ ๋ถ๊ท ํ: ํด์ ํ ์ด๋ธ์์ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ด ํ ๋ฒํท์ ๋ชฐ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ํด์ ํ ์ด๋ธ์ ํด๋น ๋ฒํท์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ฒ๋ผ ๋์ํ์ฌ ๊ฒ์ ์๊ฐ์ด ๊ธธ์ด์ง๋๋ค.
์๊ฐ์ ์ค๋ช :
1,000๋ช
์ Person ๊ฐ์ฒด ์ค 100๋ช
์ด "ํ๊ธธ๋"์ด๋ผ๊ณ ํฉ์๋ค.
- ํต์ฌ ํ๋๋ฅผ ์๋ตํ ๊ฒฝ์ฐ:
- 100๋ช ์ "ํ๊ธธ๋" ๊ฐ์ฒด๋ค์ด ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ ธ ๋์ผํ ๋ฒํท์ ์ ์ฅ๋ฉ๋๋ค.
- ํต์ฌ ํ๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ๊ฒฝ์ฐ:
firstName,lastName,age๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ฉด ํด์ ์ฝ๋๊ฐ ๋ค์ํด์ ธ ๊ฐ์ฒด๋ค์ด ํด์ ํ ์ด๋ธ์ ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋ฉ๋๋ค.
ํ์ ํ๋๋?
- ์ ์: ๋ค๋ฅธ ํ๋์ ๊ฐ์ผ๋ก๋ถํฐ ๊ณ์ฐ๋๊ฑฐ๋ ์ ๋๋ ํ๋์ ๋๋ค.
- ํน์ง:
- ๊ฐ์ฒด์ ๊ณ ์ ํ ์ํ๋ฅผ ๋ํ๋ด์ง ์์ต๋๋ค.
- ๊ฐ์ฒด์ ํต์ฌ ์ ๋ณด์๋ ๋ ๋ฆฝ์ ์ด์ง ์์ต๋๋ค.
- ๊ฐ์ ๋ณ๊ฒฝํด๋ ๊ฐ์ฒด์ ์ ์ฒด์ฑ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
ํต์ฌ ํ๋๋?
- ์ ์: ๊ฐ์ฒด์ ๊ณ ์ ํ ์์ฑ์ ๋ํ๋ด๋ฉฐ,
equals()๋ฉ์๋์์ ๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต์ ์ฌ์ฉ๋๋ ํ๋์ ๋๋ค. - ํน์ง:
- ๊ฐ์ฒด์ ๋ณธ์ง์ ์ธ ์ํ๋ฅผ ํํํฉ๋๋ค.
- ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๊ฐ์ฒด์ ์ ์ฒด์ฑ์ด ๋ณํฉ๋๋ค.
๊ตฌ๋ถ ๊ธฐ์ค:
equals()์ฌ์ฉ ์ฌ๋ถ:equals()๋ฉ์๋์์ ๋น๊ต์ ์ฌ์ฉ๋๋ ํ๋๋ ํต์ฌ ํ๋์ ๋๋ค.- ๋น๊ต์ ์ฌ์ฉ๋์ง ์๋ ํ๋๋ ํด์ ์ฝ๋ ๊ณ์ฐ์์ ์ ์ธํด์ผ ํฉ๋๋ค.
- ๊ฐ์ ๋
๋ฆฝ์ฑ:
- ๋ค๋ฅธ ํ๋๋ก๋ถํฐ ๊ณ์ฐ๋์ง ์๋ ํ๋๋ ํต์ฌ ํ๋์ ๋๋ค.
- ๋ค๋ฅธ ํ๋๋ก๋ถํฐ ๊ณ์ฐ๋๋ ํ๋๋ ํ์ ํ๋์ ๋๋ค.
- ๊ฐ์ฒด์ ์ ์ฒด์ฑ์ ๋ํ ์ํฅ:
- ํ๋์ ๊ฐ์ด ๊ฐ์ฒด์ ๋๋ฑ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ฉด ํต์ฌ ํ๋์ ๋๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ ํ๋์ ๋๋ค.
์์:
Circle ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค:
public class Circle {
private double radius; // ๋ฐ์ง๋ฆ (ํต์ฌ ํ๋)
private Point center; // ์ค์ฌ ์ขํ (ํต์ฌ ํ๋)
private double area; // ๋ฉด์ (ํ์ ํ๋)
@Override
public boolean equals(Object o) {
// radius์ center๋ฅผ ๋น๊ต
}
}- ํต์ฌ ํ๋:
radius,center๋equals()์์ ๋น๊ตํ๋ฏ๋ก ํต์ฌ ํ๋์ ๋๋ค.
- ํ์ ํ๋:
area๋radius๋ก๋ถํฐ ๊ณ์ฐ๋๋ฏ๋ก ํ์ ํ๋์ด๋ฉฐ, ํด์ ์ฝ๋ ๊ณ์ฐ์์ ์ ์ธํฉ๋๋ค.
hashCode() ๊ตฌํ:
@Override
public int hashCode() {
int result = Double.hashCode(radius);
result = 31 * result + center.hashCode();
// area๋ ์ ์ธํฉ๋๋ค.
return result;
}๋์ผํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ์ :
@Override
public int hashCode() {
return 42;
}- ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ ํด์ ์ฝ๋(
42)๋ฅผ ๋ฐํํฉ๋๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ํ๋์ ๋ฒํท์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- ํด์ ํ ์ด๋ธ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ฒ๋ผ ๋์ํ์ฌ ์ฑ๋ฅ์ด O(n)์ผ๋ก ๋จ์ด์ง๋๋ค.
๋ํ๋ฅผ ํตํ ์ค๋ช :
ํด์ ํ ์ด๋ธ์ด 10๊ฐ์ ๋ฒํท(์ธ๋ฑ์ค 0~9)์ ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
์ ์์ ์ธ ๊ฒฝ์ฐ(์ข์ ํด์ ์ฝ๋):
- ๊ฐ์ฒด๋ค์ด ๋ค์ํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง๋๋ค.
๋ฒํท 0: [ ]
๋ฒํท 1: [ ]
๋ฒํท 2: [๊ฐ์ฒด D]
๋ฒํท 3: [๊ฐ์ฒด C]
๋ฒํท 4: [ ]
๋ฒํท 5: [๊ฐ์ฒด A]
๋ฒํท 6: [ ]
๋ฒํท 7: [๊ฐ์ฒด B]
๋ฒํท 8: [ ]
๋ฒํท 9: [ ]
- ๊ฐ์ฒด๋ค์ด ๋ฒํท์ ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋ฉ๋๋ค.
- ๊ฒ์ ๋ฐ ์ฝ์ ์์ ์ด ๋น ๋ฆ ๋๋ค(O(1)).
๋ฌธ์ ์ ๊ฒฝ์ฐ(๋ชจ๋ ํด์ ์ฝ๋๊ฐ ๋์ผ):
- ๋ชจ๋ ๊ฐ์ฒด์ ํด์ ์ฝ๋๊ฐ
42์ ๋๋ค. - ๋ฒํท ์ธ๋ฑ์ค๋
42 % 10 = 2๋ก ๊ณ์ฐ๋ฉ๋๋ค.
๋ฒํท 0: [ ]
๋ฒํท 1: [ ]
๋ฒํท 2: [๊ฐ์ฒด A, ๊ฐ์ฒด B, ๊ฐ์ฒด C, ๊ฐ์ฒด D, ๊ฐ์ฒด E, ๊ฐ์ฒด F, ๊ฐ์ฒด G, ๊ฐ์ฒด H, ๊ฐ์ฒด I, ๊ฐ์ฒด J]
๋ฒํท 3: [ ]
๋ฒํท 4: [ ]
๋ฒํท 5: [ ]
๋ฒํท 6: [ ]
๋ฒํท 7: [ ]
๋ฒํท 8: [ ]
๋ฒํท 9: [ ]
- ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ฒํท 2์ ๋ชฐ๋ ค ์์ต๋๋ค.
- ๋ฒํท 2๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ฒ๋ผ ๋์ํ๋ฉฐ, ๊ฒ์ ์๊ฐ์ด O(n)์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.
๊ฒฐ๊ณผ ๋ฐ ์ํฅ:
- ์ฑ๋ฅ ์ ํ:
- ํด์ ํ ์ด๋ธ์ ์ด์ ์ด ์ฌ๋ผ์ง๊ณ , ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์ ๊ฐ์ ์์ค์ผ๋ก ๋๋ ค์ง๋๋ค.
- ์ฌ์ฉ ๋ถ๊ฐ:
- ์ค๋ฌด์์ ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด์ง๋ฏ๋ก, ์ด๋ฌํ ํด์ ์ฝ๋๋ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
ํต์ฌ ์์ :
- ๊ณ ์ ํ ํด์ ์ฝ๋ ์์ฑ: ๊ฐ์ฒด๋ค์ ํด์ ํ ์ด๋ธ์ ๊ณ ๋ฅด๊ฒ ๋ถํฌ์ํค๊ธฐ ์ํด ํด์ ์ฝ๋๋ฅผ ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
equals()์์ ์ผ๊ด์ฑ ์ ์ง: ๋๋ฑํ ๊ฐ์ฒด๋ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ผ ํ์ง๋ง, ๋น๋๋ฑํ ๊ฐ์ฒด๋ ๊ฐ๋ฅํ๋ฉด ๋ค๋ฅธ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.- ์์ ํด์ ์ฝ๋ ์ง์: ํด์ ์ฝ๋์์ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํํ๋ฉด ์ ๋ฉ๋๋ค.
์์ ๋ด์ฉ์ ํตํด ๊ฐ ์ง๋ฌธ์ ๋ํ ํด์ค๊ณผ ์์๋ฅผ ์ ๊ณตํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํด์ ์ฝ๋ ๊ตฌํ ์ ์ฃผ์ํด์ผ ํ ์ ๊ณผ ๊ทธ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
equals๋ฅผ ์ฌ์ ์ํ ๋๋hashCode๋ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค.
์ฌ์ ์ํhashCode๋Object์ API ๋ฌธ์์ ๊ธฐ์ ๋ ์ผ๋ฐ ๊ท์ฝ์ ๋ฐ๋ผ์ผ ํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ผ๋ฉด ๋๋๋ก ํด์์ฝ๋๋ ์๋ก ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํ๋ค. AutoValue ํ๋ ์์ํฌ๋ฅด ์ฌ์ฉํ๋ฉด ๋ฉ์งequals์hashCode๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค.
Footnotes
-
๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด โฉ
-
ํด์์ฝ๋์ ์ญํ :
- ๊ฐ์ฒด๋ฅผ ํด์ ํ ์ด๋ธ๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
equals()๋ฉ์๋์ ํจ๊ป ๊ฐ์ฒด์ ๋๋ฑ์ฑ์ ํ๋จํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
ํด์์ฝ๋ ๊ท์ฝ:
equals()๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ค๊ณ ํ๋จํ๋ฉด, ๋ ๊ฐ์ฒด์hashCode()๋ ๋์ผํ ๊ฐ์ ๋ฐํํด์ผ ํฉ๋๋ค.- ๋ฐ๋๋ก,
equals()๊ฐ ๋ค๋ฅด๋ค๊ณ ํ๋จํ๋ ๋ ๊ฐ์ฒด์hashCode()๊ฐ ๋ฐ๋์ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ํ์๋ ์์ง๋ง, ํด์ ํ ์ด๋ธ์ ์ฑ๋ฅ์ ์ํด ์๋ก ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- โฉ