Collection - Map 계열 ------- ( HashMap, HashSet )

양혜정·2024년 2월 17일
0

Begin_java

목록 보기
64/71

Map 계열

  • key 값과 value 값을 저장

  • key 값들은 순서와 상관없이 저장

  • key 값 : 고유한 값

  • value 값 : 중복된 값 가능


HashSet

  • 저장 : add(new 객체()) or add(객체)

HashMap<key,value>

  • 저장 : put(String key, Object value)
  • 가져오기 : get(String key)

Set

  • 모든 key 읽기, 모든 객체 정보 읽기
    -> key : ' key ' 를 출력
    -> 객체 정보 : ' mbr_map.get(key) ' 를 출력
    또는 Iterator 이용시, ' mbr_map.get(itr.next()) ' 를 출력

  • 특정 key 의 정보 삭제 : remove(String key)

  • 모든 정보 삭제 : 객체이름.clear()

  • 크기 : 객체이름.size()


적용


HashMap

1. HashMap<저장할 타입, 객체>

-> 기본모형 Hash <K, V>

HashMap<Integer, Member> mbr_map
						= new HashMap<Integer, Member>();

-> HashMap <> 안 내용 생략 불가능한 경우

HashMap<> mbr_map = new HashMap<String, Member>();

-> HashMap <> 안 내용 생략 가능한 경우

HashMap<String, Member> mbr_map = new HashMap<>();
// jdk 8 이후부터 가능
Map<String, Member> mbr_map = new HashMap<>();
// jdk 8 이후부터 가능

2. 저장하기

-> put(String key, Object value) 메소드 사용

mbr_map.put(990520,
	new Member("jjoung","Abcd1234$", "양혜정", "9905202"));
    
// Member () 가 아닌 String 타입만 저장시킬 경우
HashMap<Integer, String> mbr_map1 
						= new HashMap<Integer, String>();
mbr_map1.put(1234,"String 타입만 저장");

3. 꺼내오기

-> value 값 추출시 get(String key) 메소드 사용

System.out.println(mbr_map.get(990520).toString());
// mbr_map.get(990520) => Member에 있는 990520
// 또는
System.out.println(mbr_map.get(990520));
// toString() 은 생략 가능

Key 값이 동일한 경우, ( id 가 같은 경우 )

  • key 값이 중복되면 value 값은 덮어씌워진다.
    Ex)

    Map<String, Member> mbr_map = new HashMap<>();
    mbr_map.put("jjoung",		// key 값을 아이디인 jjoung 로 설정함 
    		new Member("jjoung","Abcd1234$","양혜정",9905202));	
    // put 을 사용하여 저장하기
    
    mbr_map.put("jjoung",		// key 값을 아이디인 jjoung 로 설정함 
    		new Member("jjoung","Abcd5678!","쫑쫑이",2401164));
    // key 값이 동일할 시 나중에 출력한 값이 value 값을 덮어씌운다.

Key 값은 다르고, Value 값이 동일한 경우,

  • key 값이 다르면 value 값은 중복된 값이 들어와도 괜찮다.
    Ex)
    Member mem1 = new Member("sky","Abcd13579@","하늘이",0001011);
    Member mem2 = mem1;
    mem2.setName("하늘");	// mem1 과 mem2 이름이 "하늘"로 바뀐다.
    // 저장하기
    mbr_map.put("mem1",mem1);
    mbr_map.put("mem2",mem2);	// key 가 다르면 동일한 value 가능 O

keySet

-> keySet 에 set 은 '중복된 값은 못 들어온다' 라는 뜻이다.

-> SET

  • collection 중 하나
  • 저장된 정보를 출력하는 방법이다.

저장된 모든 key 읽어오기

방법1.

Set<String> key_set = mbr_map.keySet();
// 중복이 아닌 모든 key값 key_set 에 대입
for(String key : key_set) {
// 중복된 key값이 있는 경우 하나만 출력된다.
	System.out.println(key)
}		// end of for--------------

방법2. (Iterator 이용)

Set<String> key_set = mbr_map.keySet();
// 중복이 아닌 모든 key값 key_set 에 대입
Iterator<String> itrator = key_set.iterator();
// Iterator 에 key_set 값 넣어주기
while(itrator.hasNext()) {	// 실제 key 값이 있으면 true
	// hasNext() 의 return 타입 : boolean
	String key = itrator.next();	// 실제 key 값을 가져온다.
	System.out.println(key);
}	// end of while(itrator.hasNext())------------------

// == 이후, 한번 더 Iterator 사용 시 ==
while(itrator.hasNext()) {	// 실제 key 값이 있으면 true

// ★ Point.
// 이전에 itrator.next()로 itrator의 key 값을
// 모두 String key가 가져갔으므로
// itrator 에 존재하는 key 값은 없다.

	String key = itrator.next();	// 실제 key 값을 가져온다.
	System.out.println(key);
}	// end of while(itrator.hasNext())-------------------

// == 이후, 다시 iterator 에 key값 넣어주기 ==
iterator = key_set.iterator();

저장된 모든 Member 객체의 정보 읽어오기

방법1.

Set<String> key_set = mbr_map.keySet();
// 중복이 아닌 모든 key값 key_set 에 대입
for(String key : key_set) {
	System.out.println(mbr_map.get(key));
// Map 계열에 저장된 key 값들은 순서 상관없이 저장되기 때문에
// 무작위로 출력된다.

방법2. (Iterator 이용)

Set<String> key_set = mbr_map.keySet();
// 중복이 아닌 모든 key값 key_set 에 대입
Iterator<String> itrator = key_set.iterator();
// Iterator 에 key_set 값 넣어주기
while(itrator.hasNext()) {	// 실제 key 값이 있으면 true

//======= 1 =========//
	String key = itrator.next();	// 실제 key 값을 가져온다.
	System.out.println(key);

// 또는

//======= 2 =========//
	System.out.println(mbr_map.get(itrator.next()));
	// mbr_map에서 실제 key 값인 것을 가져와서 출력

}	// end of while(itrator.hasNext())-------------------

key 값이 @인 정보 삭제하기 ( Ex) 회원탈퇴 )

=> .remove("key값")

Ex)
Member deleted_mbr = mbr_map.remove("@");
// @ 위치에 key 값 입력하기

저장된 모든 Member 객체의 정보 삭제하기

=> .clear()

mbr_map.clear();	// 모든 정보 삭제하기

회원가입을 하는데 입력한 아이디가 중복일 경우

  userid = sc.nextline();
  if(mbr_map.get(userid) == null) {	// get => 꺼내오기
  	// userid가 mbr_map 에 없다면
  	mbr_map.put(userid
  	, new Member(userid,"abcd1234$", "사용자1", "9710121"))
  // put => 저장하기
  	System.out.println("\n >> 회원가입 성공! <<");
  } else {
  	System.out.println
  		("\n >>" + userid + "아이디는 이미 사용중입니다.");
  }		// end of if~else------------

★ Point

  • HashMap(Map) 은 for 문 사용 X (권장)

  • for 문을 사용할 시 속도가 느려진다.
    -> 이유 : map 은 순서를 따지지 않기 때문에 매번 확인이 필요하기 때문이다.

    => 전체를 꺼내와야 하는 경우, ArrayList 순서대로 for문
    => 하나를 꺼내와야 하는 경우, Map 이용


크기 => .size()

System.out.println(mbr_map,size());

HashSet(Map 계열), LinkedHashSet(List 계열)

  • 공통점 : 생성 이름만 다를 뿐 동일한 기능이다.
  • 차이점 :

    HashSet : 저장 순서 상관 X
    LinkedHashSet : 저장되어진 순서대로 나온다.

1. HashSet, LinkedHashSet 객체 생성하기

Set<클래스명> 객체이름 = new HashSet<>();
Set<클래스명> 객체이름 = new LinkedHashSet<>();

-> 생략 가능/불가능 은 HashMap 과 동일

2. 저장하기

Ex) 객체이름이 mbr_set 이라고 가정

mbr_set.add(990520,
	new Member("jjoung","Abcd1234$", "양혜정", "9905202"));

3. 특정 id 의 객체 정보만 출력해보기

String id = "velog";	// 특정 id 를 velog 라고 가정
Iterator<Member> itr = mbr_set.iterator();
// mbr_set 에 저장된 모든 Member 객체 정보 담기
boolean isExist = false;  
while(itr.hasNext()) {	// itr에 데이터가 존재하면 true
	Member mbr = itr.next();	
// itr에 담긴 모든 정보 끄집어내기
	if(id.equals(mbr.getId())) {	// id가 velog 와 같다면
		isExist = true;
		System.out.println(mbr);	// id가 velog인 정보 출력
	}
}	// end of while(itr.hasNext())--------------------------
if(!isExist)	// id가 velog와 같지 않다면
	System.out.println
				(">> 아이디가 " + id + "인 회원은 없습니다.");

4. 특정 id 의 객체 정보 삭제하기 ( Ex) 회원탈퇴 )

Iterator<Member> itr = mbr_set.iterator();
while(itr.hasNext()) {	// itr에 데이터가 존재하면 true
	Member mbr = itr.next();	
// itr에 담긴 모든 정보 끄집어내기
	if("velog".equals(mbr.getId())) {	// id가 velog 이면
		itr.remove()	// itr에 존재하는 데이터 삭제하기
	}
}	// end of while(it.hasNext())-----------------

정리

my.day.18.a.collection -> HashMap_main_4, Set_main_5

0개의 댓글

관련 채용 정보