Java์์์ ํด์ ์ฝ๋
๋ ๊ฐ์ฒด๋ฅผ ํด์ ๊ธฐ๋ฐ ์๋ฃ๊ตฌ์กฐ์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ฑ๋๋ ์ ์ ๊ฐ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํด์ ์ฝ๋ ์์ฒด๊ฐ ๊ฒน์น๋ ๊ฒฝ์ฐ๋ ์์ฃผ ๋ฐ์ํ์ง ์์ผ๋, ๊ทธ๋ ๋ค๊ณ
ํด์ ์ฝ๋๊ฐ ๊ณ ์ ํ๋ค
๋ผ๊ณ ๋งํ ์๋ ์๋ค.
์ด๋ฒ ๊ธ์์๋ ์ด์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
Java์์์ hashCode๋ int
์ ์ํ์ผ๋ก ์์ฑ๋๋ค. ๋๋ฌธ์ ๊ฐ์ ๋ฒ์๋ ์ฝ -21์ต ~ +21์ต์ผ๋ก ์ฝ 43์ต ๊ฐ์ง๊ฐ ๋์ฌ ์ ์๋ค.
์ฆ, ๋ฌดํํ์ง ์์
์ ํํ ๊ฐ
์ด๋ผ๋ ๊ฒ์ด๋ค.
๋จ์ํ๊ฒ JVM ๋ด ๊ฐ์ฒด ์๊ฐ ์ด๋ณด๋ค ๋ง์ ์ ์์ผ๋ฉฐ,
์๋ง์ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด 43์ต ๊ฐ์ง hashCode ๊ฐ ์ค ํ๋์ ๋งคํ๋๋ฏ๋ก ์ถฉ๋์ ์ํ์ ์ผ๋ก ํ์ฐ์ ์ด๋ค.
ํด์ฑ์ ์ธ๊ณ์์๋ ์ด๋ฅผ ๋น๋๊ธฐ์ง ์๋ฆฌ(Pigeonhole principle)
๋ก ์ค๋ช
ํ ์ ์๋ค.
๋ค๋ฅธ ๊ฐ์ฒด์์๋ ํด์ ์ฝ๋๊ฐ ๋์ผํ ๊ฒฝ์ฐ๋ฅผ
ํด์์ถฉ๋
์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด๋ฌํ ์ถฉ๋์ ์ต์ํ ํ๋ ํด์ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค.
๋น๋๊ธฐ์ง ์๋ฆฌ๋,
N๊ฐ์ ๋น๋๊ธฐ ์ง์ M๋ง๋ฆฌ์ ๋น๋๊ธฐ๋ฅผ ๋ฃ์ผ๋ ค๊ณ ํ ๋ M > N์ด๋ฉด ์ด๋ค ๋น๋๊ธฐ ์ง์๋ ํ์ฐ์ ์ผ๋ก ๋น๋๊ธฐ๊ฐ 2๋ง๋ฆฌ ์ด์ ๋ค์ด๊ฐ๋ค๋ ์ํ์ ์ธ ์๋ฆฌ์ด๋ค.
์ฆ, 11๋ง๋ฆฌ์ ๋น๋๊ธฐ๋ฅผ 10๊ฐ์ ์ง์ ๋ฃ์ผ๋ ค๊ณ ํ ๋ ์๋ฌด๋ฆฌ ์ ๋ถ๋ฐฐํ๋๋ผ๋ 1๊ฐ์ ์ง์๋ 2๋ง๋ฆฌ ์ด์์ ๋น๋๊ธฐ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
ํด์ ์ฝ๋๋ฅผ int๊ฐ ์๋ long์ผ๋ก ๋ฐํํ๋ฉด ํด์ ์ถฉ๋์ด ๋ ์ค์ด๋ค์ง ์์๊น? ์ int
ํ์ผ๋ก ๋ง๋ ๊ฒ์ผ๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด long์ผ๋ก ๋ง๋ ๋ค๊ณ ํด์, ํจ์จ์ฑ์ด ๋์์ง๋ค๊ณ ๋ณด์ฅํ ์ ์๋ค. ์ด์ ๋ ์๋์ ๊ฐ๋ค.
ํด์ ๊ธฐ๋ฐ ์ปฌ๋ ์ ์ ํจ์จ์ฑ
HashMap, HashSet, Hashtable
๊ฐ์ ์๋ฃ๊ตฌ์กฐ๋ค์ ๋ด๋ถ์ ์ผ๋ก๋ฒํท
์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋๋ฐ, ์ด๋๋ฐฐ์ด
๋ก ๊ตฌํ๋์ด ์๋ค.- ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ
hashCode % capacity(๋ฐฐ์ด size)
๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ฐํ๋ค.- Java์์์ ๋ฐฐ์ด ํฌ๊ธฐ๋ intํ์ผ๋ก ์ ํ๋์ด ์๋ค.
- ๋๋ฌธ์ ๋ง์ฝ ํด์ ์ฝ๋๊ฐ long์ด๋ผ๋ฉด, ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ ๋ ์ถ๊ฐ ์ฐ์ฐ(long โ int ๋ณํ ๋ฑ)์ด ํ์ํด ํจ์จ์ฑ์ด ์คํ๋ ค ๋จ์ด์ง ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ ํจ์จ
- ์ง๊ธ๊ณผ๋ ๋ค๋ฅด๊ฒ, 1990๋ ๋ ์ด๋ฐ Java ์ค๊ณ ๋น์์๋ ๋ฉ๋ชจ๋ฆฌ์ CPU ๋น์ฉ์ ํจ์ฌ ๋ฏผ๊ฐํ๋ค.
- ๋ง์ฝ long(64๋นํธ)์ hashCode๋ก ์ฐ๋ฉด ํด์ ํ ์ด๋ธ ๋ด๋ถ์์ long ์ฐ์ฐ์ด ๋ง์์ง๊ณ , ํ์ ์ด์ ํฐ ๊ฐ์ผ๋ก index๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ญ๋น๊ฐ ์ฌํด์ ธ int๋ก ์ ํ๊ฒ ๋์๋ค.
๋ง์ฝ hashCode == ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
์๋ค๋ฉด, ์ด๋ ๊ฐ์ฒด๋ง๋ค ๋ค๋ฅธ ๊ณ ์ ํ ๊ฐ์ด ๋ง์ผ๋ฏ๋ก ํด์ ์ฝ๋๊ฐ ๊ณ ์ ํ ์๋ ์๊ฒ ๋ค.
ํ์ง๋ง hashCode๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ค๋ฅด๋ค. JVM ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง, ํ์ฌ๋ ๋๋ถ๋ถ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ํ ๊ด๋ จ์ด ์๋ค.
๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ์ฝ๋๋ฅผ ๋ง๋ค์๋ค ํ๋๋ผ๋, ๊ฐ์ฒด ๊ฐ์๊ฐ 43์ต ๊ฐ๋ฅผ ๋์ด๊ฐ๋ค๋ฉด ๋น๋๊ธฐ์ง ์๋ฆฌ์ ์ํด์ ์ถฉ๋์ด ํ์ฐ์ ์ผ๋ก ๋ฐ์ํ๋ค.
import java.util.ArrayList;
import java.util.List;
public class HashCodeCollisionTest {
public static void main(String[] args) {
List<Integer> seenHashCodes = new ArrayList<>();
int collisionCount = 0;
int maxAttempts = 1000000;
for (int i = 0; i < maxAttempts; i++) {
Object obj = new Object();
int hashCode = obj.hashCode();
if (seenHashCodes.contains(hashCode)) {
collisionCount++;
System.out.println((i + 1) + "๋ฒ์งธ ์๋");
System.out.println("์ถฉ๋ hashCode: " + hashCode);
System.out.println();
} else {
seenHashCodes.add(hashCode);
}
}
if (collisionCount == 0) {
System.out.println("์ถฉ๋์ด ๋ฐ์ํ์ง ์์์ต๋๋ค. (์๋ ์: " + maxAttempts + ")");
} else {
System.out.println("์ด ์ถฉ๋ ๋ฐ์ ํ์: " + collisionCount);
}
}
}
์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๋ฆฌ์คํธ์ ๋ฃ์ ํ ๋์ผํ ํด์ ์ฝ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ์ถ๋ ฅํ๋ ํํ๋ก ํ ์คํธ๋ฅผ ์งํํ์๋ค.
์๋๋
HashMap, HashSet
๋ฅผ ํ์ฉํ๋ ค ํ๋๋ฐ, ์ด๋ ํด์ ์ปฌ๋ ์ ์ด๋ผ -> ํด์์ฝ๋ ์์ฒด๋ก๋ง ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ ๋ด๋ถ์ ์ธ ํด์ ํ ์ด๋ธ ์์์ ์ถฉ๋์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ArrayList
๋ฅผ ์ฌ์ฉํ์๋ค.
...
987463๋ฒ์งธ ์๋
์ถฉ๋ hashCode: 1999539787
993518๋ฒ์งธ ์๋
์ถฉ๋ hashCode: 1845922248
994245๋ฒ์งธ ์๋
์ถฉ๋ hashCode: 1479783205
994730๋ฒ์งธ ์๋
์ถฉ๋ hashCode: 2063331329
์ด ์ถฉ๋ ๋ฐ์ ํ์: 232
1๋ง, 10๋ง ๋ฒ ๊น์ง๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์์์ผ๋, 100๋ง ๋ฒ์ผ๋ก ํ์๋ฅผ ๋๋ฆฌ๋ ์ถฉ๋ ํ์๊ฐ ํ์ ํ๊ฒ ๋์ด๋ฌ๋ค.
์ฌ๊ธฐ๊น์ง Java์์์ ํด์ ์ฝ๋๋ ๊ณ ์ ํ์ง ์์์ ์์๋ณด์๋ค. ๊ณ ์ ํ์ง ์๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์์ ํ์ธํ ์๊ฐ ์๊ฒ ๋ ํ ๋ฐ, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ ์์๊น?
ํด์ ์ปฌ๋ ์ ์์ ๋๋ฑ ๊ฐ์ฒด๋ฅผ ํ๋ณํ ๋, ์์ ๊ฐ์ ๋ก์ง์ ๊ฑฐ์น๋ค.
- ํด์ ์ฝ๋๊ฐ ๊ฐ์๊ฐ?
- equals()๊ฐ true์ธ๊ฐ?
์ฆ, ๋ค๋ฅธ ๊ฐ์ฒด๋ผ๋ฆฌ ๊ฐ์ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋๋ผ๋, equals()
์์ false๊ฐ ๋์ค๊ฒ ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก , ํด์ ์ฝ๋ ์์ฒด๋ก๋ง ๋น๊ต๋ฅผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋, ์ด๋ ํ์น ์๋ค.
โequals๊ฐ ๊ฐ์ผ๋ฉด hashCode๋ ๊ฐ์์ผ ํ์ง๋ง, equals๊ฐ ๋ค๋ฅด๋ฉด hashCode๋ ๊ฐ์ ์๋ ์๋ค.โ
์ฆ, ์ถฉ๋์ ์ด๋ฏธ ์์๋ ์ํฉ์ด๋ฉฐ, equals()๋ก ์ต์ข ๊ตฌ๋ถํ๋๋ก ์ค๊ณ๋์ด ์๋ค.
์ค์ํ ๊ฒ์ ์ถฉ๋์ ์ต์ํ ํ๋ ๋ฐฉ๋ฒ(์ข์ ํด์ ํจ์ ๋ฑ)๊ณผ ํด์ ์ถฉ๋์ด ๋ฐ์ํ์ ๋ ํจ์จ์ ์ผ๋ก ๋์ฒํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค.
๋ค์ ๊ธ์์๋ ํด์ ์ถฉ๋์ ๋ํด์ ๋ค๋ฃจ์ด๋ณด๋ ค๊ณ ํ๋ค.