map

moon.kick·2025년 3월 5일

keySet()entrySet() 사용 목적 및 차이점

둘 다 Map의 데이터를 반복(iterate)할 때 사용하지만, 사용 목적과 성능 차이가 있음.


1. keySet()을 사용한 반복문

for (Integer key : map.keySet()) {
    String value = map.get(key);
    System.out.println(key + "=" + value);
}
  • 특징: map.keySet()모든 키(key)만 모은 Set을 반환 → map.get(key)를 이용해 값(value) 조회
  • 장점: 키만 필요할 때 적합
  • 단점: map.get(key)를 반복 호출하기 때문에 성능 저하 가능 (특히 TreeMap, LinkedHashMap 같은 구조에서는 느려질 수 있음)
  • 언제 사용?
    • 키만 필요할 때 (if (map.containsKey(50)) 같은 로직)
    • 특정 키에 해당하는 값만 조회할 때 (map.get(50) 등)

2. entrySet()을 사용한 반복문

for (Entry<Integer, String> entry : map.entrySet()) {
    int key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + "=" + value);
}
  • 특징: map.entrySet()키-값 쌍(Entry) 전체를 Set 형태로 반환
  • 장점: entry.getValue()를 직접 사용하여 map.get(key) 호출이 필요 없음 → 성능 더 좋음
  • 언제 사용?
    • 키와 값 둘 다 필요할 때
    • Map을 전체적으로 순회할 때 (효율적)

🔹 어떤 경우에 어떤 걸 써야 할까?

사용 방식키만 필요할 때키-값 둘 다 필요할 때
keySet()✅ 적합⚠️ 비효율적 (get() 반복 호출)
entrySet()❌ 불필요✅ 성능 우수

📌 즉, entrySet()이 성능상 더 유리하므로, 키와 값을 모두 사용해야 한다면 entrySet()을 쓰는 것이 좋음!
단, 키만 필요하면 keySet()을 사용하여 불필요한 연산을 줄이는 것이 좋음.

핵심 설명

  1. HashMap<Integer, String> 생성

    • map.put(40, "히정") → 키 중복 시 새 값으로 덮어씀 (40="리링"으로 변경됨)
  2. 출력 및 크기 확인

    • System.out.println(map);{10=효정, 20=핑핑, 30=퐁퐁, 40=리링, 50=나나, 70=쑝쑝, 90=미미}
    • System.out.println(map.size());7 (키 중복 제외)
  3. keySet()을 사용한 반복문

    • 향상된 for문을 사용해 map.get(key)로 값 출력
  4. entrySet()을 사용한 반복문

    • Entry<Integer, String> 이용해 entry.getKey(), entry.getValue()로 출력
  5. 결과

    • 두 반복문 모두 key=value 형식으로 HashMap 출력
    • entrySet() 방식이 성능상 유리 (값 조회 최소화)
  6. main 실행 시 MapExam 생성자 호출

    • 즉시 MapExam 생성, 모든 코드 실행됨

package ex0305.map;

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

public class MapExam {
	
	Map<Integer, String> map = new HashMap<>();
	
	public MapExam() { //생성자 만들었당
		
	  map.put(40,"히정");
	  map.put(10,"효정");
	  map.put(70,"쑝쑝");
	  
	  String v = map.put(40,"리링"); //키중복
	  System.out.println(v);
	  
	  map.put(20,"핑핑");
	  map.put(30,"퐁퐁");
	  map.put(50,"나나");
	  map.put(90,"미미");
		
	  //출력
	  System.out.println(map);
	  System.out.println(map.size());
	  
	  //map.keySet(); //키는 중복안뎀
	  
	  Set<Integer> keySet = map.keySet(); //set keyset(자료구조) map
	  Iterator<Integer> it = keySet.iterator(); //반복자
	  
	  //while(it.hasNext()) {
		//  int key = it.next(); //요소꺼내기
		 // String value = map.get(key);
		 // System.out.println(key+"="+value);
	  //}
	  
	  //개선된포문
	  for(Integer key : map.keySet()) {
		  String value = map.get(key);
		  System.out.println(key+"="+value);
	  }
	   
	  System.out.println("Map.Entry<K,V>-------------------------");
      
      
      
      //중요
	  Set<Entry<Integer, String>> set = map.entrySet(); //---------------------
	
    
    
	  for(Entry<Integer,String> entry : set) {
		  int key = entry.getKey();
		  String s = entry.getValue();
		  System.out.println(key+"="+s);
	  }
	}
	
	public static void main(String[] args) {
		new MapExam();
				
	}
	}
 
profile
@mgkick

0개의 댓글