๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] Map์—์„œ๋Š” Collection View๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ถœ์ฒ˜

ChatGPT


์ž๋ฐ”์˜ Map ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ปฌ๋ ‰์…˜ ๋ทฐ(Collection View)๋ฅผ ํ†ตํ•ด Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. Map์€ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์ง€๋งŒ, Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ปฌ๋ ‰์…˜ ๋ทฐ๋กœ ๋ณ€ํ™˜ํ•ด Set๊ณผ Collection์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

1. Collection View๋ž€?

Map์—์„œ ์ œ๊ณตํ•˜๋Š” Collection View๋Š” Map์˜ ํ‚ค, ๊ฐ’ ๋˜๋Š” ํ‚ค-๊ฐ’ ์Œ์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ปฌ๋ ‰์…˜(Set ๋˜๋Š” Collection)์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋“ค์ด๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋“ค์€ ์‹ค์ œ๋กœ Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ทฐ(view)๋กœ์„œ, ์ด๋ฅผ ํ†ตํ•ด Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. Map์˜ Collection View ๋ฉ”์„œ๋“œ

Map ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒˆ ๊ฐ€์ง€ ์ฃผ์š” ์ปฌ๋ ‰์…˜ ๋ทฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • keySet() : Map์˜ ํ‚ค๋“ค์„ Set์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • values() : Map์˜ ๊ฐ’๋“ค์„ Collection์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • entrySet() : Map์˜ ํ‚ค-๊ฐ’ ์Œ์„ Set์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ๋Š” Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ Collectiion ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•ด ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

 

1. Set<K> keySet()

keySet() ๋ฉ”์†Œ๋“œ๋Š” Map์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค๋ฅผ Set์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜๋œ Set์€ Map๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด, Set์—์„œ ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ํ‚ค์™€ ๊ด€๋ จ๋œ Map์˜ ํ•ญ๋ชฉ๋„ ์‚ญ์ œ๋œ๋‹ค.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);

// Map์˜ ํ‚ค๋“ค์„ Set์œผ๋กœ ๋ฐ˜ํ™˜
Set<String> keySet = map.keySet();
System.out.println("Keys: " + keySet);

// Set์—์„œ ํ‚ค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด Map์—์„œ๋„ ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์‚ญ์ œ๋จ
keySet.remove("banana");
System.out.println("Map after removal: " + map);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

keys: [apple, banana, cherry]
Map after removal: {apple=1, cherry=3}

 

2. Collection<V> values()

values() ๋ฉ”์†Œ๋“œ๋Š” Map์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’์„ Collection์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜๋œ Collection์€ ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ’๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. ์ด ์ปฌ๋ ‰์…˜๋„ Map๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);

// Map์˜ ๊ฐ’๋“ค์„ Collection์œผ๋กœ ๋ฐ˜ํ™˜
Collection<Integer> values = map.values();
System.out.println("Values: " + values);

// Collection์—์„œ ๊ฐ’์„ ์ œ๊ฑฐํ•ด๋„ Map์—์„œ๋Š” ํ•ด๋‹น ๊ฐ’๊ณผ ์—ฐ๊ฒฐ๋œ ํ‚ค๊ฐ€ ์œ ์ง€๋จ
values.remove(2);
System.out.println("Map after value removal: " + map);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

values: [1, 2, 3]
Map after value removal: {apple=1, cherry=3}

 

3. Set<Map.Entry<K, V>> entrySet()

entrySet() ๋ฉ”์†Œ๋“œ๋Š” Map์˜ ํ‚ค-๊ฐ’ ์Œ(entry)์„ Set์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Map.Entry<K, V>๋Š” Map์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด ์—”ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ‚ค์™€ ๊ฐ’์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์—”ํŠธ๋ฆฌ์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด Map์˜ ๊ฐ’๋„ ๊ฐ™์ด ์ˆ˜์ •๋œ๋‹ค.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);

// Map์˜ ํ‚ค-๊ฐ’ ์Œ์„ Set์œผ๋กœ ๋ฐ˜ํ™˜
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
System.out.println("Entries: " + entrySet);

// ์—”ํŠธ๋ฆฌ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋ฉด Map์˜ ๊ฐ’๋„ ์ˆ˜์ •๋จ
for (Map.Entry<String, Integer> entry : entrySet) {
    if (entry.getKey().equals("apple")) {
        entry.setValue(10);
    }
}

System.out.println("Map after modification: " + map);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

entries: [apple=1, banana=2, cherry=3]
Map after modification: {apple=10, banana=2, cherry=3}

 

3. Collection View์˜ ํŠน์ง•

๋™๊ธฐํ™”

Map์˜ Collection View๋Š” ์‹ค์ œ Map๊ณผ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ์ปฌ๋ ‰์…˜ ๋ทฐ์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ณ€๊ฒฝ ์ž‘์—…(ํ‚ค ์ถ”๊ฐ€, ๊ฐ’ ์ˆ˜์ •, ํ•ญ๋ชฉ ์ƒ์ œ ๋“ฑ)์€ ์‹ค์ œ Map์— ๋ฐ˜์˜๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ Map์—์„œ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ๋„ ์ปฌ๋ ‰์…˜ ๋ทฐ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค.

์ฝ๊ธฐ/์ˆ˜์ • ๊ฐ€๋Šฅ

๋ฐ˜ํ™˜๋œ Set์ด๋‚˜ Collection์„ ํ†ตํ•ด Map์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, keySet()์ด๋‚˜ entrySet()์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด, ์‹ค์ œ Map์—์„œ๋„ ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.

๋ฐ˜๋ณต์ž (Iterator)

Collection View๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ Set์ด๋‚˜ Collection์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. Iterator๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. Collection View์˜ ํ™œ์šฉ ์˜ˆ์‹œ

์˜ˆ์‹œ 1: keySet()๊ณผ entrySet()์„ ํ™œ์šฉํ•ด ๊ฐ’ ์ˆ˜์ •

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);

// Map์˜ ํ‚ค๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ’์„ ์ˆ˜์ •
for (String key : map.keySet()) {
    map.put(key, map.get(key) * 10);
}
System.out.println("Modified map: " + map);

// Map์˜ ํ‚ค-๊ฐ’ ์Œ์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ’ ์ˆ˜์ •
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    entry.setValue(entry.getValue() / 2);
}
System.out.println("Modified map after entrySet: " + map);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Modified map: {apple=10, banana=20, cherry=30}
Modified map after entrySet: {apple=5, banana=10, cherry=15}

 

์˜ˆ์‹œ 2: values()๋ฅผ ํ™œ์šฉํ•ด ์ค‘๋ณต๋œ ๊ฐ’ ์ œ๊ฑฐ

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 1);

// Map์—์„œ ์ค‘๋ณต๋œ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
Collection<Integer> values = map.values();
values.removeIf(value -> value == 1);  // ๊ฐ’์ด 1์ธ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐ

System.out.println("Map after removing duplicate values: " + map);

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Map after removing duplicate values: {banana=2}

 

5. ์ฃผ์˜ ์‚ฌํ•ญ

๋ณ€๊ฒฝ ์ค‘ ์˜ค๋ฅ˜

Map ๋˜๋Š” Collection View๊ฐ€ ์ˆœํšŒ ์ค‘์ผ ๋•Œ, ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ConcurrentModificationException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด Map์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•˜๋ ค๋ฉด Iterator์˜ remove() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ช…์‹œ์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค. 

๋™๊ธฐํ™” ๋ฌธ์ œ

Collection View๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋™๊ธฐํ™”๋œ ๋งจ(Collections.synchronizedMap())์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ์‹œ์ ์— ๋™๊ธฐํ™”๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

6. ๊ฒฐ๋ก 

์ž๋ฐ”์˜ Map์€ ์ปฌ๋ ‰์…˜ ๋ทฐ(Collection View)๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค, ๊ฐ’, ๋˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ํ˜•ํƒœ๋กœ ๊ฐ๊ฐ Set์ด๋‚˜ Collection์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Map์˜ ์š”์†Œ๋“ค์„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๊ฐ’์ด๋‚˜ ํ‚ค๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. Map๊ณผ ์ปฌ๋ ‰์…˜ ๋ทฐ๋Š” ์ƒํ˜ธ ๋™๊ธฐํ™”๋˜๋ฏ€๋กœ, ํ•œ์ชฝ์—์„œ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์ชฝ์—๋„ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.