Java

컬렉션(Collection) - 4. HashMap

에어팟맥스 2022. 6. 29. 22:46

HashMap 은 특정값을 찾을 때 유용하다.
 
   === Map 계열 ===
   1. HashMap 과 Hashtable(Web용) 이 있다.
   2. Map 계열은 List 계열(Vector, ArrayList, LinkedList)처럼 index 가 사용되어 저장되는 것이 아니라, 
      Map 계열은 key값과 value값을 쌍으로 사용하여 저장하는데  
         데이터 저장시 사용되는 메소드는 put(String key, Object value)메소드를 사용한다.
         이때 key값은 반드시 고유한 값을 가져야 하고, value값은 *중복된 값이 와도 괜찮다*.
   3. Map 계열에 저장된 key값들은 순서와는 상관없이 저장된다.  
   4. Map 계열에 저장된 value값을 추출하려면 key를 이용해서 가져오는데 
      value 값의 추출은 get(String key) 메소드를 사용한다. 

 

	public static void main(String[] args) {
		
	//	HashMap<String, Member> mbrMap = new HashMap<String, Member>();
	//  또는
	//	HashMap<String, Member> mbrMap = new HashMap<>();
	//  또는	
		Map<String, Member> mbrMap = new HashMap<>();
    //  모두 사용 가능

 

		mbrMap.put("youjs", new Member("youjs","qwer1234$","유재석"));

mbrMap 이라는 HashMap 저장소에 new Member("youjs","qwer1234$","유재석")을 저장하는데 
저장된  new Member("youjs","qwer1234$","유재석")을 찾고자 할때는 
"youjs" 만 넣어주면 new Member("youjs","qwer1234$","유재석") 이 나오도록 저장하겠다는 말이다. 

 

		mbrMap.put("eom",new Member("eom","qwer1234$","엄정화"));
		mbrMap.put("kanghd",new Member("kanghd","qwer1234$","강호동"));
		mbrMap.put("leess",new Member("leess","qwer1234$","이순신"));
		mbrMap.put("kimth",new Member("kimth","qwer1234$","김태희"));
		mbrMap.put("kangkc",new Member("kangkc","qwer1234$","강감찬"));
		mbrMap.put("leehr",new Member("leehr","qwer1234$","이혜리"));

 

 

==== mbrMap 에 저장되어진 Member 객체들 중에 key 가 "leess" 인 value 값(지금은 Member) 을 추출해서 
                                                                                                                 추출된 회원(Member)의 정보를 출력하세요 ====

 

		String search_id = "leess";
		Member mbr = mbrMap.get(search_id);
		
		if(mbr != null)
			mbr.info_print();
		else
			System.out.println(">> 검색하신 " + search_id + "에 해당하는 회원은 없습니다. <<");
		
		/*
		 === 이순신님의 회원정보 ===
		 1. 아이디: leess
		 2. 비밀번호: qwer1234$
		 3. 성명: 이순신
		 */

 

==== mbrMap 에 저장되어진 Member 객체들 중에 key 가 "leess" 인 value 값(지금은 Member) 을 추출해서 
        그 회원이 있다면 추출된 회원(Member)의 정보를 출력하고, 

        없다면 >> 검색하신 " + search_id + "에 해당하는 회원은 없습니다. << 라고 출력하기  ====

		// key 값은 한개만 가능하기 때문에 덮어씌움
		mbrMap.put("leess",new Member("leess","abcd0070$","이상순"));
		
		search_id = "leess";
		mbr = mbrMap.get(search_id);
		
		if(mbr != null)
			mbr.info_print();
		else
			System.out.println(">> 검색하신 " + search_id + "에 해당하는 회원은 없습니다. <<");
		
		
		/*
		 === 이상순님의 회원정보 ===
		 1. 아이디: leess
		 2. 비밀번호: abcd0070$
		 3. 성명: 이상순
		 */

 

value 값은 중복되어도 괜찮다.


		mbrMap.put("leess_2",new Member("leess","abcd0070$","이상순"));
		
		
		search_id = "leess_2";
		mbr = mbrMap.get(search_id);
		
		if(mbr != null)
			mbr.info_print();
		else
			System.out.println(">> 검색하신 " + search_id + "에 해당하는 회원은 없습니다. <<");
		/*
		 === 이상순님의 회원정보 ===
		 1. 아이디: leess
		 2. 비밀번호: abcd0070$
		 3. 성명: 이상순
		 */

 

 

 

 

 

=== mbrMap 에 저장되어진 모든 key 들을 읽어오는 첫번째 방법 ===

		Set<String> key_sets = mbrMap.keySet();
		
		for(String key: key_sets) {
			System.out.println(key);
		} // end of for
		
		/*
		 순서는 무작위
		 leess_2
		 eom
		 youjs
		 kimth
		 kangkc
		 leehr
		 kanghd
		 leess
		 */

=== mbrMap 에 저장되어진 모든 회원들의 정보를 출력하시오 ===

       - 순서는 무작위로 나타난다.

		for(String key: key_sets) {
			mbrMap.get(key).info_print();
		} // end of for

 

 

=== mbrMap 에 저장되어진 모든 key 들을 읽어오는 두번째 방법 ===

		Set<String> key_sets_2 = mbrMap.keySet(); // 키값이 String 인 뭉치 Set 이 저장소
		
		Iterator<String> it = key_sets_2.iterator(); // 리턴 타입이 스트링인 iterator
		// Iterator 는 저장소가 아니라 Collection 에 저장되어진 요소(Element) 를 읽어오는 용도로 쓰이는 것 ( for 문 안쓰고 )
		
		while(it.hasNext()) {
			/* it.hasNext() 는 it 에서 현재 it 가 가지고 있는 여러 String 데이터 중 한개를 끄집어내서 존재하는지 알아보는 것
			   존재하면 true, 존재하지 않으면 false 를 리턴해준다. 
			   그러므로 현재 key의 개수가 8개 이므로 8번 반복한다.*/
			
			String key = it.next();
			/* 실제로 키값인 String 값을 it 에서 끄집어낸다.
			   그러면 끄집어낸 String 값은 더 이상 it 에 남아있지 않게 된다. */
			
			System.out.println(key);
			/*
			    leess_2
				eom
				youjs
				kimth
				kangkc
				leehr
				kanghd
				leess
			 */
			
		} // end of while--------------------------------------

 

		System.out.println("\n~~~~~~~~~~~~ 한번 더 ~~~~~~~~~~~~\n");
		
		while(it.hasNext()) {
			
			String key = it.next();
			
			System.out.println(key);
			// 안나옴
			
		} // end of while--------------------------------------
		System.out.println("\n~~~~~~~~~~~~ 다시 처음부터 ~~~~~~~~~~~~\n");
		
		it = key_sets_2.iterator();
		
		while(it.hasNext()) {
			
			String key = it.next();
			
			System.out.println(key);
			// 안나옴
			
		} // end of while--------------------------------------

=== mbrMap 에 저장되어진 모든 회원들의 정보를 출력하시오 ===

       - 순서는 무작위

		Set<String> key_sets_3 = mbrMap.keySet();
		
		Iterator<String> it3 = key_sets_3.iterator();
		
		while(it3.hasNext() ) {
			
			String key = it3.next();
			mbrMap.get(key).info_print();
		}

 

 

 

======= 특정 멤버 삭제하기 =======

		mbrMap.remove("kangkc"); // 특정 멤버 지우기
		
		for(String key : key_sets_3) { //  : 배열이름(주로 list, set)
			mbrMap.get(key).info_print();
			
		}

 

======= 모든 멤버 삭제하기 =======

		mbrMap.clear();
		
		System.out.println( "mbrMap.isEmpty() => " + mbrMap.isEmpty());
		// true

 

 

 

 

// ======================================================================================= //

 

[퀴즈] mbrMap 에 신규회원을 저장하려고 한다.
   new Member("kimth","qwer1234$","김태환") 을 mbrMap 에 
   key 값은 "kimth" 으로 저장하려고 할 때
   "kimth" key가 이미 존재한다면 아이디 kimth 은(는) 이미 사용중입니다. 라고 메세지 출력
   "kimth" key가 이미 존재하지 않으면 mbrMap 에 new Member("kimth","qwer1234$","김태환") 을 저장하도록 코드를 작성하시오.

		String input_id = "kimth";
		boolean b = false;
		
		
		
			if( mbrMap.get(input_id) == null ) 
				mbrMap.put("kimth", new Member("kimth","qwer1234$","김태환"));
				
			else
				System.out.println(">> 아이디 " + search_id +"은(는) 이미 사용중입니다. <<");