๊ด€๋ฆฌ ๋ฉ”๋‰ด

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 ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ์‹œ์— ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฑธ๊นŒ ?

์ด ์ด์œ ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์•Œ์•„๋ณด์ž

ํ•ด์‰ฌ ๋งต์˜ ๋™์ž‘ ๊ตฌ์กฐ

ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•œ ์ง€๋ฅผ ๋น„๊ตํ•  ๋• ๋‹ค์Œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  2. ํ•ด์‰ฌ์ฝ”๋“œ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด equals์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
  3. ์œ„ ๋‘๊ฐœ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™๋“ฑ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ,

equals๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ ํ•ด์‰ฌ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์ด๊ณ 

hashCode ๋งŒ ์žฌ์ •์˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ equals์˜ ๋ฐ˜ํ™˜๊ฐ’์ด false ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณด์•˜๋˜ ๊ฒƒ์ด๋‹ค.

 

์ด์ฒ˜๋Ÿผ ๋‘˜์„ ๋™์‹œ์— ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด, Hash ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ถˆ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

4. equals & hashCode ๊ทœ์•ฝ

  1. equals() ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๊ทธ ๊ฐ์ฒด์˜ hashcode()๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
  2. equals()๋กœ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode๋Š” ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  3. equals()๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒฝ์šฐ ๊ผญ hashCode๊ฐ€ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค.
  4. ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

5. ๊ฒฐ๋ก 

ํ•ด์‹œ์ฝ”๋“œ์™€ equals์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  , ์ด ๋‘˜์„ ์™œ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ค˜์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์•˜๋‹ค.

๋งŒ์•ฝ ์ด ๋‘˜์„ ๊ฐ™์ด ์žฌ์ •์˜ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•  ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋™๋“ฑ์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ equals์™€ hashCode ๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ ํ•˜๋„๋ก ํ•˜์ž !

6.์ฐธ๊ณ  ์ž๋ฃŒ

Java HashMap์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCode…

tecoble.techcourse.co.kr

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

 

Hashtable์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ #1

ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ์ดํ•ด์™€ ๊ตฌํ˜„ (Hashtable) ์กฐ๋Œ€ํ˜‘ (http://bcho.tistory.com) ๊ธฐ๋ณธ์ ์ธ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ดํ•ด ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์€ Key์— Value๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํƒ€ ๊ตฌ์กฐ๋กœ, value := get(key)์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ๋งค์šฐ๋งค์šฐ ๋น 

bcho.tistory.com

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

 

equals์™€ hashCode๋Š” ์™œ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์•ผ ํ• ๊นŒ?

equals์™€ hashCode๋Š” ๊ฐ™์ด ์žฌ์ •์˜ํ•˜๋ผ๋Š” ๋ง์„ ๋‹ค๋“ค ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ IDE Generate ๊ธฐ๋Šฅ์—์„œ๋„ equals์™€ hashCode๋ฅผ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ฃผ๋ฉฐ lombok์—์„œ๋„ EqualsAndHashCode…

tecoble.techcourse.co.kr

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, separate chaining) +์„ค๋ช…์˜์ƒ

 

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] Hashtable ์ถฉ๋Œ(collisoion)์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. (open addressing, se

Hashtable์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์•„๋ž˜ ์‹œ๊ฐ„๋ณต์žก๋„, ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ...

blog.naver.com

 

'ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐฑ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Gradle ์ด๋ž€?  (0) 2023.09.03
JVM ๋‚ด๋ถ€๋กœ  (0) 2023.09.03