๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Java/๐Ÿ’พ ์ž๋ฃŒ๊ตฌ์กฐ

[Java] HashMap ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ• ์™„์ „ ์ •๋ฆฌ

by carrot0911 2025. 7. 10.

๐Ÿ’ก ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๋ ค๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์—ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค ๋ณด๋‹ˆ ํŠน์ • ๊ฐ’์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์„ธ๊ฑฐ๋‚˜, ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ๋“ฑ์žฅํ–ˆ๋‹ค.
์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ HashMap์„ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๊ตฌํ˜„ ์ž์ฒด๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฑธ ๋А๊ผˆ๊ณ , “์ด์ฐธ์— ๊ฐœ๋…๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ์žก์ž!”๋Š” ๋งˆ์Œ์œผ๋กœ HashMap์„ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 


 

๐Ÿ“ฆ HashMap,, ๊ทธ๋ž˜์„œ ๊ทธ๊ฒŒ ๋„๋Œ€์ฒด ๋ญ”๋ฐ?!

HashMap์€ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ Map ์ปฌ๋ ‰์…˜์ด๋‹ค.
Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๊ธฐ์— Map์˜ ์„ฑ์งˆ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. Map์€ ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ Entry๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ํ‚ค์™€ ๊ฐ’์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋‹ค. ๊ฐ’์€ ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‚ค๋Š” ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์—†๋‹ค.
๋งŒ์•ฝ ๊ธฐ์กด์— ์ €์žฅ๋œ ํ‚ค์™€ ๋™์ผํ•œ ํ‚ค๋กœ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ๊ธฐ์กด์˜ ๊ฐ’์€ ์—†์–ด์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์น˜๋œ๋‹ค. HashMap์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํ•ด์‹ฑ(Hashing)์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค.

๐Ÿ” ํ‚ค์™€ ๊ฐ’์ด ๋ญ์•ผ?

  • Key: ์‹๋ณ„์ž (์ค‘๋ณต โŒ)
  • Value: ์‹ค์ œ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ (์ค‘๋ณต ๊ฐ€๋Šฅ โœ…)

 

 

๐Ÿ“Œ HashMap ์‚ฌ์šฉ๋ฒ•

HashMap<String,String> map1 = new HashMap<String,String>();  // HashMap ์ƒ์„ฑ
HashMap<String,String> map2 = new HashMap<>();  // new์—์„œ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ๋žต๊ฐ€๋Šฅ
HashMap<String,String> map3 = new HashMap<>(map1);  // map1์˜ ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์ง„ HashMap ์ƒ์„ฑ
HashMap<String,String> map4 = new HashMap<>(10);  // ์ดˆ๊ธฐ ์šฉ๋Ÿ‰(capacity) ์ง€์ •
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);  // ์ดˆ๊ธฐ capacity,load factor ์ง€์ •

HashMap์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํ‚ค ํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ๊ณ  ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.
HashMap์€ ์ €์žฅ๊ณต๊ฐ„๋ณด๋‹ค ๊ฐ’์ด ์ถ”๊ฐ€๋กœ ๋“ค์–ด์˜ค๋ฉด List์ฒ˜๋Ÿผ ์ €์žฅ๊ณต๊ฐ„์„ ์ถ”๊ฐ€๋กœ ๋Š˜๋ฆฌ๋Š”๋ฐ List์ฒ˜๋Ÿผ ์ €์žฅ๊ณต๊ฐ„์„ ํ•œ ์นธ์”ฉ ๋Š˜๋ฆฌ์ง€ ์•Š๊ณ  ์•ฝ ๋‘๋ฐฐ๋กœ ๋Š˜๋ฆฐ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ดˆ๊ธฐ์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด Map์˜ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

๐Ÿ“‹ ์ฃผ์š” ๋ฉ”์„œ๋“œ ์ •๋ฆฌ

  • put(K key, V value): ์ƒˆ๋กœ์šด ํ‚ค-๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
                                         ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‚ค๋ผ๋ฉด ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ด๋‹ค.
  • get(Object key): ํ•ด๋‹น ํ‚ค์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                                   ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค์ผ ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • constainsKey(Object key): ์ง€์ •ํ•œ ํ‚ค๊ฐ€ Map ์•ˆ์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
                                                      ์กด์žฌํ•˜๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • remove(Object key): ์ง€์ •ํ•œ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๊ทธ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                                           ๋งŒ์•ฝ key๊ฐ€ ์—†๋‹ค๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • keySet(): Map์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค๋“ค์˜ ์ง‘ํ•ฉ(Set)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                      ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ‚ค๋“ค์„ ์ˆœํšŒํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • values(): Map์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’๋“ค์˜ ์ปฌ๋ ‰์…˜(Collection)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                     ๊ฐ’๋“ค๋งŒ ๋ฝ‘์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • entrySet(): Map์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ(Map.Entry ๊ฐ์ฒด)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
                          for-each ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ key, value๋ฅผ ๋™์‹œ์— ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๋•Œ ์ž์ฃผ ์“ฐ์ธ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ

HashMap<Integer,String> map = new HashMap<Integer,String>(){{  // ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •
    put(1,"์‚ฌ๊ณผ");
    put(2,"๋ฐ”๋‚˜๋‚˜");
    put(3,"ํฌ๋„");
}};
		
System.out.println(map);  // ์ „์ฒด ์ถœ๋ ฅ : {1=์‚ฌ๊ณผ, 2=๋ฐ”๋‚˜๋‚˜, 3=ํฌ๋„}
System.out.println(map.get(1));  // key๊ฐ’ 1์˜ value ์–ป๊ธฐ : ์‚ฌ๊ณผ
		
// entrySet() ํ™œ์šฉ
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
// [Key]:1 [Value]:์‚ฌ๊ณผ
// [Key]:2 [Value]:๋ฐ”๋‚˜๋‚˜
// [Key]:3 [Value]:ํฌ๋„

// KeySet() ํ™œ์šฉ
for(Integer i : map.keySet()){  // ์ €์žฅ๋œ key๊ฐ’ ํ™•์ธ
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
// [Key]:1 [Value]:์‚ฌ๊ณผ
// [Key]:2 [Value]:๋ฐ”๋‚˜๋‚˜
// [Key]:3 [Value]:ํฌ๋„

HashMap์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

๊ทธ๋ƒฅ printํ•˜๊ฒŒ ๋˜๋ฉด { }๋กœ ๋ฌถ์–ด Map์˜ ์ „์ฒด key๊ฐ’, value๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
ํŠน์ • key๊ฐ’์˜ 
value๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ ์‹ถ๋‹ค๋ฉด get(key)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ  ์ „์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด entrySet()์ด๋‚˜ keySet() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Map์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์€ ํ›„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

entrySet()์€ key์™€ value ๋ชจ๋‘๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉฐ keySet()์€ key ๊ฐ’๋งŒ ํ•„์š”ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š”๋ฐ
key๊ฐ’๋งŒ ๋ฐ›์•„์„œ get(key)๋ฅผ ํ™œ์šฉํ•˜์—ฌ value๋„ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๊ธฐ์— ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ํƒํ•˜๋“ ์ง€ ๊ฐ„์— ํฐ ์ƒ๊ด€์ด ์—†์–ด ๋Œ€๋ถ€๋ถ„ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•œ keySet()์„ ํ™œ์šฉํ•œ๋‹ค.
ํ•˜์ง€๋งŒ key๊ฐ’์„ ์ด์šฉํ•ด์„œ value๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ๋ชจ๋˜๋ฏ€๋กœ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค๋ฉด entrySet()์ด ์ข‹๋‹ค.

 

 

๐Ÿ”„ HashMap ์ •๋ ฌ์€?

HashMap ์ž์ฒด๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ •๋ ฌ์ด ํ•„์š”ํ•  ๋• entrySet()์„ ๊บผ๋‚ด์„œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊พผ ๋’ค Collections.sort() ๋˜๋Š” stream().sorted()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(map.entrySet());
entryList.sort((e1, e2) -> e2.getValue() - e1.getValue());  // value ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ

 

 

๐Ÿ“Œ HashMap์€ ์–ด๋””์— ์“ฐ์ผ๊นŒ?

  • ๐Ÿ“Š ๋นˆ๋„ ์ˆ˜ ์„ธ๊ธฐ (ex. ๋“ฑ์žฅ ํšŸ์ˆ˜)
  • ๐Ÿงญ ๋น ๋ฅธ ๊ฒ€์ƒ‰ (ex. ํŠน์ • ๊ฐ’ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ)
  • ๐Ÿงฉ ๊ทธ๋ฃนํ•‘ (ex. ๊ฐ™์€ ์กฐ๊ฑด๋ผ๋ฆฌ ๋ฌถ๊ธฐ)
"์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์„ธ๊ณ , ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด ํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ"์— ๋”ฑ์ด๋‹ค!

 

 

๐Ÿงฑ ์ •๋ฆฌ

 

  • HashMap์€ ํ‚ค-๊ฐ’ ์Œ ์ €์žฅ์— ์ตœ์ ํ™”๋œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋น ๋ฅธ ๊ฒ€์ƒ‰๊ณผ ๋นˆ๋„ ์ˆ˜ ๊ณ„์‚ฐ์— ๋งค์šฐ ์œ ์šฉํ•จ
  • ์ •๋ ฌ ์‹œ์—๋Š” entrySet์„ ์ •๋ ฌํ•ด์•ผ ํ•จ
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ํ•„์ˆ˜ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜

 

 

๐Ÿ”— References

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

 

HashMap (Java Platform SE 8 )

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null. If the function returns null no mapping is recorded. If the function

docs.oracle.com

https://coding-factory.tistory.com/556

 

[Java] ์ž๋ฐ” HashMap ์‚ฌ์šฉ๋ฒ• & ์˜ˆ์ œ ์ด์ •๋ฆฌ

HashMap ์ด๋ž€? HashMap์€ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ Map ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค. Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๊ธฐ์— Map์˜ ์„ฑ์งˆ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Map์€ ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ Entry๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š”

coding-factory.tistory.com