์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์คํ์์ด
- ๋ฐฑ์ค11053 #ํ์ด์ฌ #python
- ์คํ
- ๋ฐฑ์ค9093
- ๋ฐฑ์ค1874
- ์คํธ๋ฆผ
- stream
- ํ๋ฐฉ์ฟผ๋ฆฌ
- ๋
- ์
- ์ฐ
- ๋ฐ์ดํฐํ์
- StringBuffer
- ๋ฐฑ์ค9012
- StringBuilder
- ์ฟ ํกERD
- ์ฟ ํกDB
- ๋ฐฐ์ด
- java
- ์ฐ์ฐ์
- ์๋ฐ
- ๋ฌธ์์ด
- Today
- Total
Tech Log ๐ ๏ธ
equals & hash code ์ ์ด๋ฅผ ๊ฐ์ด ์ฌ์ ์ ํ๋ ์ด์ ๋ณธ๋ฌธ
equals & hash code ์ ์ด๋ฅผ ๊ฐ์ด ์ฌ์ ์ ํ๋ ์ด์
sehaan 2023. 7. 29. 14:32ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฑ์๋ ๋ฐ๋ธ์ฝ์ค์์ ์งํํ Tech Log ํ๋ ๋ชฉ์ ์ผ๋ก ์ ์๋์์ต๋๋ค.
1. String ํด๋์ค์ equals & hashcode
์ํํธ์จ์ด ์ธ๊ณ์์๋ ๋ฌธ์์ด๋ ์ด์ํ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ค.
๋ฐ๋ก ๋๋ฑ์ฑ์ ๋ณด์ฅํด์ฃผ๊ธฐ ์ํจ์ธ๋ฐ,
์ด๋ ์์์ ๋งํ equals ๋ฉ์๋์ HashCode ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ์ฌ์ ์ํ์ง ์๋ ํด๋์ค๋ฅผ ์ฒ์๋ถํฐ ๋ง๋ค์ด๊ฐ๋ฉด์ equals ์ HashCode ์ ๋ํด ์์๋ณด์
๋ณธ๋ฌธ์์๋ String์ ๋ชจ๋ฐฉํ String_test ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณผ๊ฒ์ด๋ฉฐ , ๊ฐ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ๋ค์ ๋ง์ถฐ๋๊ฐ ๊ฒ์ด๋ค.
equals ๋น๊ต
๋จผ์ ๊ฐ์ฒด์ ๋๋ฑ์ฑ์ ๋น๊ตํ๊ธฐ ์ํด equals์ ๊ฐ์ ๋น๊ตํด๋ณด์
String string1 = new String("hi");
String string2 = new String("hi");
System.out.println("String ๊ฐ์ฒด hashcode ๋น๊ต ๊ฒฐ๊ณผ : "+(string1.equals(string2)));
String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");
System.out.println("String ๊ฐ์ฒด hashcode ๋น๊ต ๊ฒฐ๊ณผ : "+(string1_test.equals(string2_test)));
๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ํด๋์ค๋ผ๋ฆฌ ๋น๊ตํ์์ง๋ง
String ๊ฐ์ฒด๋ equals ์ true์ด๊ณ ,
String_test๋ equals ์ ๊ฐ์ด false ๊ฐ ๋์๋ค.
hashcode ๋น๊ต
๋ค์์ ๊ฐ์ฒด์ hashcode ๊ฐ์ ๋น๊ตํด๋ณด์
String string1 = new String("hi");
String string2 = new String("hi");
System.out.println("String ๊ฐ์ฒด hashcode ๋น๊ต ๊ฒฐ๊ณผ : "+(string1.hashCode() == string2.hashCode()));
String_test string1_test = new String_test("hi");
String_test string2_test = new String_test("hi");
System.out.println("String_test ๊ฐ์ฒด hashcode ๋น๊ต ๊ฒฐ๊ณผ : "+(string1_test.hashCode() == string2_test.hashCode()));
ํด์ฌ์ฝ๋ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ๋ String ๊ฐ์ฒด์ ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ง ์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์๊น?
์ ๋ต์ equals ์ hashcode ์ ์ค๋ฒ๋ผ์ด๋ฉ์ ์๋ค.
์ด ๋์ ์ฌ์ ์ ํ๊ธฐ ์ ์ ๊ฐ๊ฐ ์๋ ๋ฌด์จ ์ญํ ์ ํ๋ ๋ฉ์๋์ธ์ง ๋ถํฐ ์์๋ณด์
2. equals ๋ ?
equals ๋ฉ์๋๋ 2๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๋ฑํ ์ง ๊ฒ์ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์๋์ด๋ค.
์๋ฅผ ๋ค์ด,
String string1 = new String("hi");
String string2 = new String("hi");
System.out.println(string1 == string2); // false
System.out.println(string1.equals(string2)); // true
๋ค์๊ณผ ๊ฐ์ด String ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋น๊ตํ๋ ๊ฒฝ์ฐ "==" ๋ ๋์ผ์ฑ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ false ๋ฅผ ์ถ๋ ฅํ์ง๋ง , equals ๋ฉ์๋๋ ๋๋ฑ์ฑ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ true๋ฅผ ์ถ๋ ฅํ๋ค.
*๋๋ฑ์ฑ๊ณผ ๋์ผ์ฑ์ ์ฐจ์ด๋ ๋ญ๊น?
๋๋ฑ์ฑ์ ๋์์ ๋์์ ๋ด์ฉ์ ๋น๊ตํ๊ณ
๋์ผ์ฑ์ ์ฃผ์๊ฐ์ ๋น๊ตํ์ฌ ๊ฐ์ ๊ฐ์ฒด์ธ ์ง๋ฅผ ๋น๊ตํ๋ค.
Object ํด๋์ค์ equals ์ฝ๋๋ฅผ ์ดํด๋ณด์
public boolean equals(Object obj) {
return this == obj;
}
๊ทผ๋ฐ ์ ์ Object์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋๋ฑ์ฑ์ ๋น๊ตํด์ฃผ์ง ์๋๋ค .(์ฃผ์๊ฐ์ ๋น๊ตํ๋ค.)
๊ทธ๋ฐ๋ฐ ์ String ์์๋ ๋ฌธ์์ด์ ๋๋ฑ์ฑ์ ๋น๊ตํ ์ ์๋ ๊ฑธ๊น?
์๋ฐ ๊ณต์๋ฌธ์์ ๋ณด๋ฉด String์ equals ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด equals ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ๋ค๊ณ ๋์์๋ค.
๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๋ equals ๋ฉ์๋๋ฅผ ๋๋ฑ์ฑ ๋น๊ต์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค !
๊ทธ๋ฌ๋ฉด String_test ๋ฉ์๋์๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก equals๋ฅผ ์ฌ์ ์ ํ๋ฉด ๋๋ฑ์ฑ ๋น๊ต๊ฐ ๋์ง ์์๊น ?
์ฐ๋ฆฌ๊ฐ ๋ง๋ Spring_test ํด๋์ค์๋ equals ๋ฅผ ์ฌ์ ์ ํด์ฃผ์๋ค.
class String_test {
String string;
public String_test(String string) {
this.string = string;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
String_test that = (String_test) o;
return Objects.equals(string, that.string);
}
}
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ๋ ์๋ํ ๋๋ก true ๊ฐ ๋์๋ค !
3. hashCode๋ ?
hashCode ๋ฉ์๋๋ ๊ฐ์ฒด์ ํด์์ฝ๋๋ฅผ ๋ฆฌํดํ๋ค.
*๊ฐ์ฒด์ ํด์์ฝ๋๋?
๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ๋ณํํ์ฌ ์์ฑํ ๊ณ ์ ์ ํด์๊ฐ์ด๋ค.
ํ์ง๋ง ๊ธฐ์กด ๋ฐฉ์์ผ๋ก ํด์์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํด์ ๋ค๋ฅธ ๋ฌธ์์ด์ด๋ผ๋ ๋ค๋ฅธ ํด์์ฝ๋๋ฅผ ๋ฐ์ ๊ฒ์ด๋ค.
→ ์ด๋ ๊ฒ ๋๋ค๋ฉด ๋๋ฑ์ฑ์ ๋ณด์ฅํ ์ ์๋ค !
๋ฐ๋ผ์ String ํด๋์ค๋ hashCode ์ญ์ ์ฌ์ ์ํด์ ์ฌ์ฉํ๋ค.
์๋ฐ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด ๋ฌธ์์ด์ ๋ฌธ์๋ค์ ํ ๊ธ์์ฉ ๊ฐ์ ธ์์ ๋ณํํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ ๊ธฐ์ ๋ค๋ฅธ ์ฃผ์๊ฐ์ ๊ฐ์ฒด๋ผ๋ ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด ๊ฐ์ hashcode ๊ฐ ๋์ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ Spring_test ํด๋์ค๋ hashCode ๋ฅผ ์ฌ์ ์ ํด๋ณด์๋ค.
class String_test {
String string;
public String_test(String string) {
this.string = string;
}
@Override
public int hashCode() {
return Objects.hash(string);
}
}
String ๊ฐ์ฒด์ฒ๋ผ Spring_test ๊ฐ์ฒด๋ ๊ฐ์ ๊ฐ์ด ๋์ด์ ์ ์ ์๋ค.
Hash ์ Hash ํ ์ด๋ธ์ ๊ด๊ณ
hashCode ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํด์์ฝ๋ ๊ฐ์ ๋ฐ๋ ๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.
์ด๋ ๊ฒ ์ป๊ฒ ๋ ํด์์ฝ๋๋ ์ด๋์ ์ฌ์ฉ๋๋ ๊ฑธ๊น?
hashCode ์ equals ์ ๊ด๊ณ๋ฅผ ์๊ธฐ ์ ์ฐ๋ฆฌ๋ ํด์ํ ์ด๋ธ์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค.
๐ง ์๋ฃ๊ตฌ์กฐ? ๊ทธ๊ฒ ๋ญ๊ฐ์?
๋์๊ด์๋ ์ ๋ง ๋ง์ ์ฑ ๋ค์ด ์๋ค.
๋ง์ฝ ์๊ธฐ๊ฐ ์ฌ์ ๊ด๋ฆฌ๋ฅผ ๋งก์๋ ๋ฐ ์ด ๋ง์ ์ฑ ๋ค ์ค์์ ํน์ ์ฑ ์ ์ฐพ๊ฑฐ๋ ์ ๋ฆฌํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฌ๊ฐ ๋ง๋งํ ์ผ์ด ์๋ ๊ฒ์ด๋ค.
๋คํํ ์ด๋ฐ ์ผ๋ค์ ์ฐ๋ฆฌ๊ฐ ์ฒ์ ๊ฒช์ ๊ฒ ์๋๊ณ ์๋ ๋ถํฐ ๋ง์ ๊ธฐ์ ์๋ค์ด ๊ณ ์ํ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฐพ๊ณ ๊บผ๋ด์ฌ ์ ์๋ ๊ท์น๊ณผ ํ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์๋ค.
์ด๊ฒ๋ค ์ค์ ํ๋๊ฐ ์ฐ๋ฆฌ๊ฐ ์์๋ณผ ํด์ ํ ์ด๋ธ์ด๋ค.
ํด์ํ ์ด๋ธ์ด๋?
๋ฐ์ดํฐ๋ฅผ key , value ๋ก ์ ์ฅํ๋ ํํ๋ฅผ ๋งํ๋ค.
๋ณดํต ๋์๊ด์์๋ ๋์ ๊ด๋ฆฌ ๋ฒํธ๋ฅผ ์ง์ ํ๊ณ , ๊ทธ ๋ฒํธ๋ฅผ ์ฐพ์๋ณด๋ฉด ํด๋น ์ฑ ์ ๋ฐ๊ฒฌํ ์ ์๋ค.
์ด๊ฒ๋ ํ์ค ์ธ๊ณ์์์ key , value ํํ๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ ๊ฒ์ด๋ค.
ํด์ ํ ์ด๋ธ์ ์๋ฆฌ
๋ค์ ์ํํธ์จ์ด๋ก ๋์์์ ์ด๋ฌํ ํํ์ ํด์ ํ ์ด๋ธ์ด ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋ ์ง ์์๋ณด์
๋์๊ด์ ์ฑ ๋ค์ key , value ํํ๋ก ์ ์ฅํ๋ ค๊ณ ํ๋ค.
์ด๋ key๋ ์ฑ ์ด๋ฆ , value๋ ๊ฐ๊ฒฉ์ผ๋ก ํด์ฃผ์๋ค.
๊ทธ ๊ฒฐ๊ณผ, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ Bucket์๋ ํด์ฌ ์ฐ์ฐ์ ํตํด ๋์จ ์ธ๋ฑ์ค์ value(์ฑ ๊ฐ๊ฒฉ) ์ด ๋ด๊ธด๋ค.
์ด๋ฐ์์ผ๋ก ์ ์ฅ์ ํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ Hash ์ฐ์ฐ์ ํ๋ฒ๋ง ์ํํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
→ ์ด๋ฐ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(1) ์ด ๋๋ค !
๐ง ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์๋ก ๋ค๋ฅธ ์ฑ ๋ค๋ผ๋ฆฌ ๊ฐ์ ํด์ฌ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์ ๊ฐ์ ์ธ๋ฑ์ค์ ์ ์ฅ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น ?
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ํ์ ์ธ ๋ฐฉ๋ฒ ๋๊ฐ์ง๋ฅผ ์๊ฐํด๋ณด๋ ค๊ณ ํ๋ค.
Separate Chaining ๊ธฐ๋ฒ
ํด์ฌํ ์ด๋ธ์์๋ ํ๋์ ์ธ๋ฑ์ค์ ์ฌ๋ฌ ๊ฐ์ ๋ฒํท์ ์ฐ๊ฒฐ์ํค๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
๋ค์ ๊ทธ๋ฆผ์ ๋ณด์
๋ถ๋ช ๋ค๋ฅธ ์ฑ ์ธ๋ฐ, ๊ฐ์ ์ธ๋ฑ์ค์ ์ ์ฅ์ด ๋์๋ค.
์ฆ ํด์ ์ถฉ๋์ด ๋ฐ์ํ๋๊น ์๋ก์ด ๊ฐ์ ๊ธฐ์กด ๊ฐ๊ณผ ์ฐ๊ฒฐ์ํจ ๊ฑฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ฒํท์ ํ๋์ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๋ ๊ฒ ๋ณด๋ค ํจ์จ์ด ์์ข์์ง๋ค.
๊ธฐ์กด์ ํด์ ํจ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํด๋น ์ธ๋ฑ์ค๋ง ์ฐพ์๊ฐ๋ฉด ๋์๋๋ฐ , ์ด์ ๋ ๊ทธ ์์์ ํ๋ฒ ๋ ํ์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ธ๋ด์ผ ํ ์๋ ์๋ค.
→ ์๊ฐ๋ณต์ก๋๋ ํ๊ท ์ ์ผ๋ก O(n/m) ์ต์ ์ ๊ฒฝ์ฐ O(n) ์ ๊ฐ์ง๊ฒ ๋ ์ ์๋ค.
(ํด์ ํ ์ด๋ธ์ ์ ์ฅ์(Bucket)์ ๊ธธ์ด๋ฅผ ‘m’, ํค(key)์ ์๋ฅผ ‘n’)
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์๋ฐ8 ์ด์๋ถํฐ๋ ํ๋์ ํด์ ๋ฒํท์ ํ ๋น ๋ ๋ฐ์ดํฐ๊ฐ 8๊ฐ ์ด์์ด ๋๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ํธ๋ฆฌ๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค.
→ ์ด๋ด ๊ฒฝ์ฐ ํ๊ท ์ ์ธ ์๊ฐ ๋ณต์ก๋๋ O(log(n/m)) ์ด ๋๋ค.
Open addressing ๊ธฐ๋ฒ (๊ฐ๋ฐฉ ์ฃผ์๋ฒ)
๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ํด์๊ฐ์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๊ฐ ์์ ์์ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ํ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์ ์ธ๋ฑ์ค์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ๊ณผ๋ ์๋ฐ๋ ๋ฐฉ๋ฒ์ด๋ค !
ํด์ ์ถฉ๋์ด ๋ฐ์ ํ์ ์์ ์ด๋ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ด 3๊ฐ์ง๊ฐ ์๋ค.
์ ํ ํ์ (linear probing)
์ถฉ๋์ด ์ผ์ด๋ฌ์ ๋, ํ์นธ ๋๋ n์นธ์ฉ ๋ค์ ์ธ๋ฑ์ค๊ฐ ๋น์ด์๋์ง ํ์ธํด๋ณธ๋ค.
์ ๊ณฑ ํ์ (quadratic probing)
1์ ์ ๊ณฑ , 2์ ์ ๊ณฑ … ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ด๋ํด๊ฐ๋ฉด์ ๋น์ด์๋์ง ํ์ธํด๋ณธ๋ค.
์ด์ค ํด์ (Double Hash)
์์ ๋ ๋ฐฉ๋ฒ์ ํตํด์ ์ด๋ ์ ๋ ์ถฉ๋์ ํด๊ฒฐํ ์ ์๋ค.
ํ์ง๋ง ํด์ฌ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ๋น ์ฌ๋กฏ์ ์ฐพ์ ์ ๊ทผํ๋ ์์น๊ฐ ๋์ผํ๋ฏ๋ก
์ ๊ทผ ์ฌ๋กฏ์ ์ค์ฌ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํ ๊ณณ์ ์ง์ค๋์ด ์๋ ํ์์ด ๋ฐ์ํ ์ ์๋ค.
์ด ์ํฉ์ ํผํ๊ธฐ ์ํด ๋์จ ๋ฐฉ๋ฒ์ด ์ด์ค ํด์์ด๋ค.
๋ง ๊ทธ๋๋ก ํด์ ํจ์๋ฅผ ๋ ๋ฒ ๋๋ฆฐ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด,
1์ฐจ ํด์๋ ํค๋ฅผ ์ฝ์ ํ์ฌ ๋ฐ์ดํฐ์ ํด์ ์ธ๋ฑ์ค๋ฅผ ์ ํ๋ค.
2์ฐจ ํด์๋ ์ถฉ๋์ด ๋ฐ์ํ์์ ์์ ๋ช ์นธ ๋ค๋ก ์ธ๋ฑ์ค๋ฅผ ์ด๋ํ ์ง ์ ํ๋ค.
์ด์ฒ๋ผ ์ด์ค ํด์๋ฅผ ์ฌ์ฉํ๋ฉด 1์ฐจ ํด์๊ฐ์ด ๊ฐ๋๋ผ๋ 2์ฐจ ํด์๊ฐ์ ๋ฌ๋ผ์ง๋ฏ๋ก,
๋ฐ์ดํฐ์ ๊ตฐ์ง ๋ฌธ์ ๋ฅผ ์ด๋์ ๋ ํด๊ฒฐํ ์ ์๋ค.
๊ฐ๋ฐฉ ์ฃผ์๋ฒ์ ๊ฒฝ์ฐ์๋ ํด๋น ์ธ๋ฑ์ค์ ์ถฉ๋์ด ๋ฐ์ํ์๋ค๋ฉด ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ํ์์ ํด์ผํ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ O(n) ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
๐ง ๊ทผ๋ฐ ๋ฐ์ดํฐ๊ฐ ์ ์ ๋ง์์ง๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น ?
์๋ง ํด์ฌ ์ถฉ๋์ ๋น๋ฒํด์ง๋ฉฐ ํจ์จ์ ๋์ฑ ๋๋น ์ง ๊ฒ์ด๋ค.
(์ฐธ๊ณ ๋ก ์๋ฐ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ฒํท ์ฌ์ด์ฆ๋ 16์ด๋ค)
์ด ์ํฉ์ ๋ํด ๋ฌ์ฌํ ์ฌ๋ฐ๋ ์ด๋ก ์ด ์๋ค.
๋น๋๊ธฐ ์ง ์๋ฆฌ
๋ง์ฝ 9๊ฐ์ ๋น๋๊ธฐ ์ง์ด ์๋ ๋ฐ 10๋ง๋ฆฌ ์ด์์ ๋น๋๊ธฐ๊ฐ ๋ค์ด๊ฐ๋ ค๊ณ ํ๋ค๋ฉด?
์ด์ฉ ์ ์์ด 2๋ง๋ฆฌ ์ด์์ ๋น๋๊ธฐ๊ฐ ํจ๊ป ์ง๋ด์ผ ํ ๊ฒ์ด๋ค.
์ด ์ํฉ์ ๋ฌดํํ(๋น๋๊ธฐ) ์ ๋ ฅ์ ๋ํด ์ ํํ(๋น๋๊ธฐ ์ง) ์ถ๋ ฅ๋ง์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ํ๋ ํ์์ด๋ผ๊ณ ํ ์ ์๋ค.
์ํํธ์จ์ด์์๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
key๊ฐ์ ๋ฌดํํ์ง๋ง ๋ฒํท ๊ณผ ํด์ฌ๊ฐ ์ ์ ํํ๋ค.
์ด ๊ฒฝ์ฐ ํด์ฌํ ์ด๋ธ์ Dynamic Resizing ์ ํตํด์ ๋ฒํท์ ์ฌ์ด์ฆ๋ฅผ ๋ ๋ฐฐ์ฉ ๋๋ ค์ค๋ค.
์ด๋ ๋๋ฆด ์ ์๋ ์ต๋ ๊ธธ์ด๋ 2^30 ์ด๋ค !
์ด์ HashCode์ ์ญํ ๊ณผ ํด์ ๊ฐ์ ์ด์ฉํ ํด์ ํ ์ด๋ธ๋ ์์๋ณด์์ผ๋
์ด์ฏค์์ equals and hashcode์ ๋ํด ์์๋ณด์
4. equals ์ hashcode ์ ์ ๊ฐ์ด ์ฌ์ ์ ํด์ค์ผํ ๊น ?
์์์ ๋ณด์๋ฏ์ด ์ผ๋ฐ์ ์ผ๋ก equals ์ hashcode ๋ ๊ฐ์ด ์ค๋ฒ๋ผ์ด๋ฉ ํด์ฃผ๊ณ ์๋ค.
๋ง์ฝ equals๋ง ์ค๋ฒ๋ผ์ด๋ฉ ํด์ค๋ค๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ , ๋ํ์ ์ผ๋ก ํด์ฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ๋์ด๋ค.
์ค๋ณต์ ํ์ฉํ์ง ์๋ set๋ฅผ ์๋ก ๋ค์ด๋ณด์
๊ฐ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค๋ฉด ํ๋๋ง ๋ค์ด๊ฐ์ผ ์ ์์ผ ๊ฒ์ด๋ค.
equals๋ง ์ค๋ฒ๋ผ์ด๋ฉ ํ์์ ๊ฒฝ์ฐ
class Test {
String key;
public Test(String key) {
this.key = key;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
return Objects.equals(key, test.key);
}
}
Set<Test> set = new HashSet<>();
set.add(new Test("hi"));
set.add(new Test("hi"));
System.out.println(set.size()); // ๊ฒฐ๊ณผ 2
๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์คฌ๋๋ฐ ๋๊ฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
์ด๋ Hash ํ ์ด๋ธ์์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์ํ์๋ค๋ ๊ฒ์ด๋ค.
hashCode ๋ง ์ค๋ฒ๋ผ์ด๋ฉ ํ์์ ๊ฒฝ์ฐ
class Test {
String key;
public Test(String key) {
this.key = key;
}
@Override
public int hashCode() {
return Objects.hash(key);
}
}
Set<Test> set = new HashSet<>();
set.add(new Test("hi"));
set.add(new Test("hi"));
System.out.println(set.size()); // ๊ฒฐ๊ณผ 2
๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์คฌ๋๋ฐ ๋๊ฐ๊ฐ ๋ค์ด๊ฐ๋ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
์ด ๊ฒฝ์ฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์ํ์๋ค๋ ๊ฒ์ด๋ค.
๐ง ์ Equals์ HashCode ๋ ์ค ํ๋๋ง ์ฌ์ ์ ํ์์ ์์ ์ค๋ฅ๊ฐ ๋๋ ๊ฑธ๊น ?
์ด ์ด์ ๋ฅผ ์๊ธฐ ์ํด ํด์ฌ ์๋ฃ๊ตฌ์กฐ์ ๋์ ์๋ฆฌ๋ฅผ ์์๋๋ก ์์๋ณด์
ํด์ฌ ๋งต์ ๋์ ๊ตฌ์กฐ
ํด์ฌ ์๋ฃ๊ตฌ์กฐ์์ ๊ฐ์ฒด๊ฐ ๋๋ฑํ ์ง๋ฅผ ๋น๊ตํ ๋ ๋ค์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ํด์ฌ์ฝ๋์ ๊ฐ์ ๋น๊ตํ๋ค.
- ํด์ฌ์ฝ๋์ ๊ฐ์ด ๊ฐ๋ค๋ฉด equals์ ๊ฐ์ ๋น๊ตํ๋ค.
- ์ ๋๊ฐ์ ๊ฐ์ด ๊ฐ๋ค๋ฉด ๋๋ฑ ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ๋ค.
๋ฐ๋ผ์ ,
equals๋ง ์ฌ์ ์ ํ์์ ๊ฒฝ์ฐ ํด์ฌ์ฝ๋๊ฐ ๋ค๋ฅด๊ฒ ๋์๊ธฐ ๋๋ฌธ์ด๊ณ
hashCode ๋ง ์ฌ์ ์ ํ์์ ๊ฒฝ์ฐ equals์ ๋ฐํ๊ฐ์ด false ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ณด์๋ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ ๋์ ๋์์ ์ฌ์ ์ ํด์ฃผ์ง ์์ผ๋ฉด, Hash ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ด์ฌ ์ ์๋ค.
4. equals & hashCode ๊ท์ฝ
- equals() ๋น๊ต์ ์ฌ์ฉ๋๋ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์ ๊ทธ ๊ฐ์ฒด์ hashcode()๋ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํํด์ผํ๋ค.
- equals()๋ก ๋น๊ตํ์ ๋ ๊ฐ๋ค๊ณ ํ๋จํ๋ค๋ฉด, ๋ ๊ฐ์ฒด์ hashCode๋ ๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
- equals()๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ ๊ผญ hashCode๊ฐ ๋ค๋ฅผ ํ์๋ ์๋ค.
- ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ ๊ฒ ์ข๋ค.
5. ๊ฒฐ๋ก
ํด์์ฝ๋์ equals์ ์ฐจ์ด์ ๋ํด ์์๋ณด๊ณ , ์ด ๋์ ์ ๊ฐ์ด ์ฌ์ ์ ํด์ค์ผํ๋์ง์ ๋ํด์๋ ์์๋ณด์๋ค.
๋ง์ฝ ์ด ๋์ ๊ฐ์ด ์ฌ์ ์ ํด์ฃผ์ง ์๋๋ค๋ฉด ์์ฒ๋ผ ํด์ฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ๋ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋๋ฑ์ฑ์ ๋ณด์ฅํด์ฃผ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ equals์ hashCode ๋ฅผ ๊ฐ์ด ์ฌ์ ์ ํ๋๋ก ํ์ !
6.์ฐธ๊ณ ์๋ฃ
Java HashMap์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
equals์ hashCode๋ ์ ๊ฐ์ด ์ฌ์ ์ํด์ผ ํ ๊น?
Hashtable์ ์ดํด์ ๊ตฌํ #1
equals์ hashCode๋ ์ ๊ฐ์ด ์ฌ์ ์ํด์ผ ํ ๊น?
'ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฑ์๋ ๋ฐ๋ธ์ฝ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Gradle ์ด๋? (0) | 2023.09.03 |
---|---|
JVM ๋ด๋ถ๋ก (0) | 2023.09.03 |