JAVA & OOP

JAVA :: HashMap, hashing ๊ฐœ๋… ์ •๋ฆฌ

DAHLIA CHOI 2022. 8. 14. 18:21

HashMap์ด๋ž€?

์ผ๋‹จ Map์€ ํ‚ค(Key)์™€ ๊ฐ’(value)์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ(entry)๋กœ ์ €์žฅํ•˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ฐ™์€ ๋งต์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ™์€ ํ‚ค๋Š” ์กด์žฌํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ, ์ค‘๋ณต๋œ ๊ฐ’์€ ์กด์žฌํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ๋งŒ์•ฝ ์ค‘๋ณต๋œ ํ‚ค ๊ฐ’์— ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ๋‚˜์ค‘์— ์ €์žฅํ•œ ๊ฐ’์ด ๊ทธ ํ‚ค์˜ ๊ฐ’์ด ๋œ๋‹ค. ํ•ด์‹ฑ์— ๋Œ€ํ•ด์„  ํ›„๋ฐ˜์— ์ •๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

 

๐ŸŸช HashMap

 

โ—พ HashMap ๋ฉ”์„œ๋“œ

 

โ—พHashMap ๊ฐ’ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ๊ธฐ

 

- entrySet() ์ด์šฉ

        HashMap map = new HashMap();
        map.put("A", 100);
        map.put("B", 90);
        map.put("C", 80);

        Set set = map.entrySet();
        Iterator it = set.iterator();

        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
        }
key : A, value : 100
key : B, value : 90
key : C, value : 80

 

- keySet(), values() ์ด์šฉ 

keySet๊ณผ values๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ’์„ ๋”ฐ๋กœ๋”ฐ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

        set = map.keySet();
        System.out.println("keys : " + set);

        Collection values = map.values();
        System.out.println("values : " + values);
keys : [A, B, C]
values : [100, 90, 80]

 

- put, get๋งŒ ์ด์šฉ

ํŠน์ • ํ•˜๋‚˜์˜ ํ‚ค์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” get์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Integer value = (Integer) map.get("A");
System.out.println(value);

 

 

โ—พ HashMap ๊ฐ’ ์ œ๊ฑฐ

ํŠน์ •ํ•œ ํ‚ค์˜ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด remove๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ชจ๋“  ๊ฐ’์„ ์ง€์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด clear๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

map.remove("A");
map.clear();

 

 

ํ•ด์‹ฑ์ด๋ž€?

ํ•ด์‹œํ•จ์ˆ˜(hash function)์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ด์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค. ํ•ด์‹œํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ ๋˜์–ด ์žˆ๋Š” ๊ณณ์„ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋กœ๋Š” HashSet, HashMap, HashTable์ด ์žˆ๋Š”๋ฐ ๊ฐ€๋Šฅํ•˜๋ฉด HashTable๋ณด๋‹ค HashMap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

์œ„ ๋ฐฉ๋ฒ•์ด ํ•ด์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.  ํ•ด์‹ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐฐ์—ด๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ์„ ์ฐพ๋Š”๋‹ค๊ณ  ํ•  ๋•Œ ํƒœ์–ด๋‚œ ์—ฐ๋„๋ณ„๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด๋†“์œผ๋ฉด ํŽธํ•  ๊ฒƒ์ด๋‹ค. 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. 

๊ทธ๋ž˜์„œ ์œ„ ๋ฐฉ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•˜๋‚˜์˜ ์„œ๋ž์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๋ณด๋‹ค๋Š”, ๋งŽ์€ ์„œ๋ž์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 

 

HashMap๊ณผ ๊ฐ™์ด ํ•ด์‹ฑ์„ ๊ตฌํ˜„ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์—์„œ๋Š” Object ํด๋ž˜์Šค์— ์ •์˜๋œ hashCode()๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

hashCode๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. 

- String์˜ ๊ฒฝ์šฐ์—๋Š” Object๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ hashCode()๋ฅผ ์˜ค๋ฒ„ ๋ผ์ด๋”ฉํ•ด์„œ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์œผ๋กœ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋กœ ๋‹ค๋ฅธ String ์ธ์Šคํ„ด์Šค ์ผ์ง€๋ผ๋„ ๊ฐ™์€ ๋‚ด์šฉ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์กŒ๋‹ค๋ฉด hashCode()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์–ป๋Š”๋‹ค. 

HashSet์ด๋‚˜ HashMap์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด์— ๋Œ€ํ•ด equals()๋กœ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด์„œ, hashCode()๊นŒ์ง€ ๊ฐ™์•„์•ผ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•œ๋‹ค.!!

๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜ ๋•Œ equals()๋ฅผ ์žฌ์ •์˜ ์˜ค๋ฒ„ ๋ผ์ด๋”ฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด hashCode()๋„ ๊ฐ™์ด ์žฌ์ •์˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค โญโญ