๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/JAVA

[Java] 17์ผ์ฐจ : ์ปฌ๋ ‰์…˜(Collection) - 3

by ๋”ฐ๊ถˆ 2024. 3. 11.

 

 

Map<K,V> ์ธํ„ฐํŽ˜์ด์Šค

  • ํ‚ค(Key)๋ฅผ ๊ฐ’ (value)์— ๋งคํ•‘(mapping)ํ•˜๋Š” ๊ฐœ์ฒด
  • ๋™์ผํ•œ ํ‚ค(key)๋ฅผ ๋‘ ๊ฐœ ์ด์ƒ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ‚ค(key)๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ ํ‚ค(key)์— ํ•˜๋‚˜์˜ ๊ฐ’ (value)๋งŒ ๋งคํ•‘ ๋œ๋‹ค.
  • Map์„ ๊ตฌํ˜„ํ•œ HashMap, TreeMap ๋ฐ LinkedHashMap์˜ 3๊ฐœ์˜ ๋ฒ”์šฉ Map์˜ ๋™์ž‘๊ณผ ์„ฑ๋Šฅ์€ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ HashSet, TreeSet ๋ฐ LinkedHashSet๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

Map<K,Y>์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์š” ๋ฉ”์†Œ๋“œ

 

 

Map.Entry<K,V> ์ธํ„ฐํŽ˜์ด์Šค

 

  • ๋งต์˜ ์—”ํŠธ๋ฆฌ (key-value pair : ํ‚ค์™€ ๊ฐ’์˜ ํ•œ์Œ <ํŽ˜์–ด>)์ด๋‹ค.
  • Map์€ ๋‚ด๋ถ€์ ์œผ๋กœ Map.Entry<K,Y> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Entry<K,Y> ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค. ์ฆ‰, ํ‚ค์™€ ๊ฐ’์€ ์„œ๋กœ ๊ด€๋ จ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  Entry๋ผ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , Entry ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. 

Map.Entry<K,V> ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์š” ๋ฉ”์†Œ

 

 

HashMap<K,V>ํด๋ž˜์Šค

  • ํ‚ค(key)๋ฅผ ๊ฐ’(value)์— ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
  • ํ‚ค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ’์€ ๋‹ค๋ฅธ ํ‚ค๋กœ ์ค‘๋ณต์ ์ธ ์š”์†Œ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ‚ค๋‚˜ ๊ฐ’์— null์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‚ค์—๋Š” ํ•˜๋‚˜์˜ null๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์š”์†Œ์˜ ์ €์žฅ์ˆœ์„œ๋Š” ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

LinkedHashMap<K,V> ํด๋ž˜์Šค

  • HashMap<K,V> ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ํด๋ž˜์Šค
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”๊ณผ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ๋งต
  • ํ‚ค๋ฅผ ๊ฐ’์— ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
  • ์‚ฝ์ž…ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

Hashtable<K,Y>ํด๋ž˜์Šค

  • ํ‚ค๋ฅผ ๊ฐ’์— ๋งคํ•‘ํ•˜์—ฌ ์ €์žฅ
  • ํ‚ค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ’์€ ์ค‘๋ณต์ ์ธ ์š”์†Œ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • null ์ด์™ธ์˜ ๊ฐ์ฒด๋Š” ํ‚ค ๋˜๋Š” ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‚ค๋‚˜ ๊ฐ’์— null์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์š”์†Œ์˜ ์ €์žฅ์ˆœ์„œ๋Š” ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋œ๋‹ค.

 

TreeMap<K,Y> ํด๋ž˜์Šค

  • SortedMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค
  • ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋œ๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • TreeMap์˜ ํ‚ค๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค์˜ compareTO() ๋ฉ”์†Œ๋“œ๋‚˜ Comparator ์ธํ„ฐํŽ˜์ด์Šค์˜ compare() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ TreeMap์˜ key๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ Comparator๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ TreeMap ์ƒ์„ฑ์ž์— ์ธ์ž๋กœ ๋„˜๊ฒจ ๋‘ ๊ฐ์ฒด์˜ ๋น„๊ต ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ClassCastException ์ด๋ผ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

Properties ํด๋ž˜์Šค

  • Hashtable ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค
  • ํ‚ค์™€ ๊ฐ’ ๋ชจ๋‘ String์œผ๋กœ ์ œํ•œํ•œ Map
  • ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ์ง€์›ํ•œ๋‹ค

 

 

package ch11.unit05;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/*
 - Map
  : ํ‚ค, ๊ฐ’ ๊ตฌ์กฐ
  : ํ‚ค๋Š” ์ค‘๋ณต ํ—ˆ์šฉ ์•ˆํ•จ
  : ํ‚ค๋Š” ์ˆœ์„œ ์—†์Œ
 - ๊ตฌํ˜„ ํด๋ž˜์Šค
   HashMap : ๋™๊ธฐํ™” ์ง€์› ์•ˆํ•จ
   Hashtable : ๋™๊ธฐํ™” ์ง€์› 
   LinkedHashMap : ํ‚ค๊ฐ€ ๋“ฑ๋ก๋œ ์ˆœ์„œ ์œ ์ง€
   TreeMap : ํ‚ค ์ˆœ์„œ๋กœ ์ •๋ ฌ. ํ‚ค๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์•ผ ํ•จ
 - ํ‚ค๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ. ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ์‚ญ์ œ ํ›„ ์žฌ๋“ฑ๋ก 
 - ๊ฐ’์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ : replace(ํ‚ค,๊ฐ’) ์ด์šฉ 
 */
public class Ex01 {

	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		// put(ํ‚ค,๊ฐ’) : Map์— ๊ฐ’ ์ €์žฅ
		map.put("์„œ์šธ", 1000);
		map.put("๋ถ€์‚ฐ", 350);
		map.put("๋Œ€๊ตฌ", 250);
		map.put("์ธ์ฒœ", 300);
		map.put("๊ด‘์ฃผ", 150);
		map.put("๋Œ€์ „", 150);
		map.put("์šธ์‚ฐ", 110);
		map.put("์„ธ์ข…", 20);
		map.put("์„œ์šธ", 990); // ํ‚ค๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด์”€
		System.out.println(map);
		
		//get(ํ‚ค) : Map์—์„œ ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
		int a = map.get("์„œ์šธ");
		System.out.println(a);
		
		//int b= map.get("๊ฒฝ๊ธฐ"); // ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ 
		Integer b = map.get("๊ฒฝ๊ธฐ"); // ์—†์œผ๋ฉด  null
		System.out.println(b);
		System.out.println();
	
		// Map์€ Iterator๊ฐ€ ์—†์œผ๋ฉด ํ–ฅ์ƒ๋œ for๋ฌธ๋„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ 
		// Set<String> set = map.keySet(); ๋Š” ํ‚ค์—์„œ 
		// Set ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ → ํ‚ค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ˆœํšŒ  
		
		Iterator<String> it = map.keySet().iterator();
		while(it.hasNext()) {
			String key = it.next();
			Integer value = map.get(key);
			System.out.println(key+":"+value);
		}
		System.out.println();
		
		for(String key : map.keySet()) {
			Integer value = map.get(key);
			System.out.println(key+":"+value);
			
		}
		System.out.println();
		
		
		System.out.println("ํ‚ค์— ์„œ์šธ ์กด์žฌ?"+map.containsKey("์„œ์šธ"));
		System.out.println("ํ‚ค์— ๊ฒฝ๊ธฐ ์กด์žฌ?"+map.containsKey("๊ฒฝ๊ธฐ"));
		System.out.println("ํ‚ค์— 350 ์กด์žฌ?"+map.containsValue(350));
	
		System.out.println("์ „์ฒด๊ฐœ์ˆ˜:"+map.size());
		map.remove("์„ธ์ข…"); // ์‚ญ์ œ 
		System.out.println(map);
		
	}

}

 

 

 

package ch11.unit05;

import java.util.Map;
import java.util.TreeMap;

public class Ex03 {

	public static void main(String[] args) {
		// ํ‚ค ์ˆœ์„œ๋กœ ์ •๋ ฌ 
		Map<String, Integer>map = new TreeMap<String, Integer>();
		map.put("์ž๋ฐ”", 80);
		map.put("์˜ค๋ผํด", 90);
		map.put("๋น…๋ฐ์ดํ„ฐ", 85);
		map.put("์„œ๋ธ”๋ฆฟ", 100);
		map.put("์Šคํ”„๋ง", 80);
		
		System.out.println(map);
	}

}

 

 

 

package ch11.unit05;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Ex04 {

	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("์ž๋ฐ”", 80);
		map.put("์˜ค๋ผํด", 90);
		map.put("๋น…๋ฐ์ดํ„ฐ", 85);
		map.put("์„œ๋ธ”๋ฆฟ", 100);
		map.put("์Šคํ”„๋ง", 80);
		
		/*
		 - entry
		  : ํ‚ค์™€ ๊ฐ’์„ set ํ˜•ํƒœ๋กœ ์ €์žฅ
		  : ํ‚ค์™€ ๊ฐ’์„ ๋ฌถ์–ด์ฃผ์ง€ ์œ„ํ•ด ์‚ฌ์šฉ
		 - Map.Entry
		  : Map์˜ ์—”ํŠธ๋ฆฌ 
		 */
		
		Set<Map.Entry<String, Integer>> set = map.entrySet();
		Iterator<Map.Entry<String, Integer>> it = set.iterator();
		while(it.hasNext()) {
			Map.Entry<String, Integer> e = it.next();
			System.out.println(e.getKey()+","+e.getValue());
		}
	}

}

 

 

 

package ch11.unit05;

import java.util.Iterator;
import java.util.Properties;

/*
 * Properties
: Hashtable์„ ์ƒ์† ๋ฐ›์Œ
: ํ‚ค์™€ ๊ฐ’์ด ๋ชจ๋‘ ๋ฌธ์ž์—ด(String)๋งŒ ๊ฐ€๋Šฅ
: ์ฃผ์š” ๋ฉ”์†Œ๋“œ
setProperty("ํ‚ค", "๊ฐ’") : Properties์— ๊ฐ’ ์ €์žฅ
getProperty("ํ‚ค") : Properties์˜ ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’ ๋ฐ˜ํ™˜

 */


public class Ex05_Properties {

	public static void main(String[] args) {
		Properties p = new Properties();
		p.setProperty("์ž๋ฐ”", "100");
		p.setProperty("์Šคํ”„๋ง", "80");
		p.setProperty("์˜ค๋ผํด", "95");
		p.setProperty("์„œ๋ธ”๋ฆฟ", "85");
		System.out.println(p);

		//System.out.println(p);
		p.list(System.out);
		System.out.println("-----------------------");
		
		// Properties์— ์ €์žฅ๋œ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
		String k ="์ž๋ฐ”",s;
		s =p.getProperty(k);
		System.out.println(s);
		
		//์ „์ฒด ์ถœ๋ ฅ 
		Iterator<Object>it = p.keySet().iterator();
		
		while(it.hasNext()) {
			String key = (String)it.next();
			String value = p.getProperty(key);
			System.out.println(key+"-"+value);
		}
		
	}

}

 

 

 

package ch11.unit05;

import java.io.FileOutputStream;
import java.util.Properties;

public class Ex06 {

	public static void main(String[] args) {

		Properties p = new Properties();
		p.setProperty("์ž๋ฐ”", "100");
		p.setProperty("์Šคํ”„๋ง", "80");
		p.setProperty("์˜ค๋ผํด", "95");
		p.setProperty("์„œ๋ธ”๋ฆฟ", "85");
		p.setProperty("HTML", "100");
		
		// Properties์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ํŒŒ์ผ์— ์ €์žฅ
		
		String pathname ="subject.properties";
		try (FileOutputStream fos = new FileOutputStream(pathname)) {
			// ํŒŒ์ผ์— ์ €์žฅ
			p.store(fos, "๊ณผ๋ชฉ๋ณ„ ์„ฑ์ ");
			
			System.out.println("ํŒŒ์ผ ์ €์žฅ ์™„๋ฃŒ...");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}