자바프로그래밍 컬렉션 (3) Map 종류

최주영·2023년 3월 28일
1

자바

목록 보기
21/30

Map

  • 저장구조가 key:value 형식
  • key, value 쌍으로 이루어져 있음 -> key는 중복될 수 없지만 값은 중복가능
  • 순서를 유지하지 않는다
  • Map의 키가 Set과 같은 구조임 (중복 불가능) -> 단지 value 를 가지고 있냐 없냐의 차이
  • 종류 (2가지)
    -> HashMap, LinkedHashMap, TreeMap, Properties (Map 인터페이스를 구현한 클래스임)
    HashMap : 순서를 보장하지 않음
    LinkedHashMap : 키를 기준으로 입력한 순서를 보장
    TreeMap : 키의 데이터 값을 기준으로 정렬

✅ (1) HashMap

  • put : 값을 저장할 때 사용하는 메소드 (key와 value를 동시에 설정)
		// put(key, value) 메소드를 이용
		// key : Object(기본) -> String으로 많이 사용, Interger 형
		// value : Object(기본) -> Vo객체, String, Integer 등
        
        map.put("bs", new Student("유병승",1,1,'남'));
		map.put("jy", new Student("최주영",2,1,'남'));
		map.put("nb", new Student("나빈",2,2,'여'));
		map.put("sj", new Student("이성진",3,2,'여'));

  • get : 저장되어 있는 데이터 가져오기 (key 값으로 value를 가지고 올 수 있음)
		Object o =map.get("sj");  // get 메소드는 Object형임
		System.out.println(((Student)o).getName()); // 이성진 이름 출력하기
		
        // 1. key값은 중복이 불가능하다
        map.put("bs","바보"); // 중복할 경우 원래 있던 위치에 덮어쓰기 된다.
        
        // 2. value 값은 중복이 가능하다.
        map.put("bs2","바보");
		System.out.println(map.get("bs"));  // 바보
		System.out.println(map.get("bs2")); // 바보  

  • size : 저장된 데이터의 개수 확인
		System.out.println(map.size());

  • remove(key) : 저장된 데이터 삭제하기
		map.remove("bs2"); // 키가 bs2인 것 삭제
		System.out.println(map.size()); 
		
		Object o = map.get("bs2"); 
		System.out.println(o); // 해당 키값이 없을때는 null로 반환

  • cotainsKey(키값)
// 해당 키값이 있으면 true로 반환
System.out.println(map.containsKey("jy"));   // true

  • containsValue(값)
		System.out.println(map.containsValue(new Student("최주영",2,1,'남')) ); // true
		System.out.println(map.containsValue("유병승")); // false

  • Map -> 리스트 변환
		ArrayList data = new ArrayList(map.values());
		for(int i=0; i<data.size(); i++) {
			System.out.println(data.get(i));
		}

  • *중요* keySet -> key 전체를 가져오는 메소드 (반환형이 Set임)
		Set keys = map.keySet(); // key 값들을 Set 자료형으로 저장
		Iterator it = keys.iterator(); // kety 값들로 iterator 메서드를 통해 객체로바꿈
		
		while(it.hasNext()) {
			Object key = it.next();
			System.out.println(key+" "+map.get(key));
		}
		
		
		System.out.println("==for each로 출력==");
		for(Object key : keys) {
			System.out.println(key+" "+map.get(key));
		}

  • *중요* entrySet -> key와 value를 동시에 가져오는 메소드 (반환형이 Set임)
    Map.Entry 형 -> getKey, geyValue 메소드를 사용할 수 있음
		Set entry = map.entrySet(); // key와 value 값을 Set 자료형으로 저장
		Iterator it2 = entry.iterator();  // Iterator을 통해서 꺼내옴
		
		while(it2.hasNext()) {
			Map.Entry all =(Map.Entry)it2.next(); // Map.Entry 자료형으로 형변환
	  		System.out.println(all.getKey()); // 
			System.out.println(all.getValue());
		}	

  • 예제문제
		HashMap fruit = new HashMap();
	
		
		fruit.put(1, new Fruit("귤","제주도",10,15000));
		fruit.put(2, new Fruit("사과","예산",5,25000));
		fruit.put(3, new Fruit("포도","영동",10,35000));
		fruit.put(4, new Fruit("배","나주",10,50000));
		
		System.out.println("===전체 데이터 조회===");
		Set fruitKey = fruit.keySet(); // 키값들을 Set 자료형에 저장
		for(Object key : fruitKey) { // key-> 1 2 3 4
			System.out.println(key+" "+fruit.get(key));
		}
		
		
		System.out.println("가격이 20000원 이상인 과일만 key와 value 출력");
		Set fruitEntry = fruit.entrySet(); // 키와 값들을 Set 자료형에 저장
		Iterator fruitIt = fruitEntry.iterator(); // 그 키와값들을 하나씩 꺼내옴
		while(fruitIt.hasNext()) {
			Map.Entry all =(Map.Entry)fruitIt.next(); // all은 키와 값들을 접근할 수 있는 상태
			
			Fruit temp = (Fruit)all.getValue(); // Fruit로 형변환해서 get 메소드에 접근함
			
			if(temp.getPrice() >= 20000)
			{
				System.out.print("키 : " + all.getKey()+" 값 : "+all.getValue());
				System.out.println();
			}
		}	


		// 이름이 한글자인 과일 key와 value 출력
		for(Object o1 : fruitEntry) {
		Map.Entry all = (Map.Entry)o1;
		Fruit temp = (Fruit)all.getValue();
		if(temp.getName().length() == 1) {
			System.out.println(all.getKey()+" "+temp);
		}
	}

		
        // 이름이 배인 과일 찾아서 삭제
		Set fkeys = fruit.keySet();  // 키값 Set에다 저장해서
		Iterator fit1 = fkeys.iterator(); // 키값을 하나씩 꺼냄
		
		while(fit1.hasNext()) {
			Integer ikey = (Integer)fit1.next();
			if(((Fruit)fruit.get(ikey)).getName().equals("배")) {
				fruit.remove(ikey);
			}
		}

	
    	// Map도 of메소드를 이용해서 불변의 데이터를 생성
        // 값을 수정할 수 없으며, 키와 값 쌍으로 넣어줘야함!
        Map data1 = Map.of("name","유병승","age",19,"gender",'M');
//		data1.put("address","경기도 시흥시");  // 수정불가능
//		data1.put("name","최주영"); // 수정불가능

		
        
        ArrayList dataList = new ArrayList();
		// 리스트안에 맵을 넣음
		dataList.add(Map.of("name","유병승","age",19));
		dataList.add(Map.of("name","정상준","age",26));
		dataList.add(Map.of("name","윤지환","age",25));
		dataList.add(Map.of("name","조장흠","age",26));
		
		for(int i=0; i<dataList.size(); i++) {
			
			System.out.println(((Map)dataList.get(i)).get("name"));
			System.out.println(((Map)dataList.get(i)).get("age"));

		}

✅ (2) Properties

  • HashMap과 큰 차이가 없지만, Properties 클래스는 파일 입출력을 지원
  • 파일과 연동해서 데이터를 저장 및 출력 : properties, xml
  • key = value 형식으로 저장하며 문자열 데이터를 저장하고 출력하는 기능
		Properties prop = new Properties();  
		
		//properties 객체에 값 저장하기
		//put() 메소드를 이용한다.
		prop.put("name","유병승");
		prop.put("age", "19");
		System.out.println(prop);  // {name=유병승, age=19}
		
		//setProperty() 메소드를 문자열을 저장할 때 사용
		prop.setProperty("upserId","admin"); // 매개변수 둘 다 String임
		prop.setProperty("password","1234");
		
		System.out.println(prop); // {password=1234, name=유병승, upserId=admin, age=19}
		
		
		// 파일과 연동해서 처리함
		// 지정된 파일에 properties 객체에 저장된 내용을 저장시킬 수 있음
		// 두번째 인자는 메모하는곳임 (공백이여도됨)
		
		try {
        	// store(FileOutputStream)메소드 이용
//			prop.store(new FileOutputStream("first.properties"), "first properites");
			
			// storeToXML(FileOutputStream) 메소드 이용 
			prop.storeToXML(new FileOutputStream("first.xml"), ""); // 파일 생성
			}
			catch(IOException e) {
			e.printStackTrace();
		}
		

		// 파일로 저장한 properties 내용 가져오기
		
		Properties prop2 = new Properties();
		System.out.println(prop2);
		try {
       		 // load(FileInputStream) 메소드 이용
			prop2.load(new FileInputStream("first.properties"));
            // loadFromXML(FileInputStream) 메소드 이용
			prop.loadFromXML(new FileInputStream("mydata.xml"));
		}catch(IOException e) {
			e.printStackTrace();
		}
		System.out.println("불러온 후");
		System.out.println(prop2);
		
		
		// properties에 저장된 데이터 불러오기
		// getProperty("key") 메소드 이용하여 불러오기  // 파일이라서 문자열임
		System.out.println(prop2.getProperty("upserId")); 
		System.out.println(prop.getProperty("driver"));
		
		
		try {
			prop.load(new FileInputStream("dataaceess.properties"));
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		String driver = prop.getProperty("driver");
		System.out.println(driver);
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글