Map

Fox·2023년 12월 18일
post-thumbnail

Map 이란?

정의

Map은 Key와 Value 한 쌍으로 이루어진 자료형이다.
리스트나 배열처럼 순차적으로 값을 구하지 않고 Key를 통해 Value를 얻으며, 저장순서를 유지하지 않는다.

  • Key와 Value 한 쌍으로 이루어져 있다.
  • Value는 중복값이 들어갈 수 있지만 Key는 중복을 허용하지 않는다.
  • Map 인터페이스를 구현한 클래스는 HashMap, HashTable, TreeMap, SortedMap 등이 있다.

나는 주로 HashMap을 사용한다.
데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 데이터추가, 삭제, 특히나 검색이 빠르기 때문이다.



주요 메소드

메소드설명
void clear()해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key)해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value)해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
V get(Object key)해당 맵에서 전달된 키에 대응하는 값을 반환함.

만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.
boolean isEmpty()해당 맵이 비어있는지를 확인함.
Set'<'K> keySet()해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
V put(K key, V value)해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key)해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
boolean remove(Object key, Object value)해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.
V replace(K key, V value)해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue)해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size()해당 맵의 매핑의 총 개수를 반환함.
V getKey()key값
V getValue()value값


HashMap 사용법

HashMap 선언

CopyHashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
    put("a","b");
}};
  • HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 기본생성자를 호출한다.
  • HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데, List처럼 저장공간을 한 칸씩 늘리지 않고 약 두배로 늘린다.
  • 여기서 과부하가 많이 발생하기 때문에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해 주는 것이 좋다.

HashMap 값 추가

CopyHashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");
  • HashMap에 값을 추가하려면 put(key, value) 메서드를 사용한다.
  • 선언 시 HashMap에 설정해 준 타입과 같은 타입의 Key와 Value값을 넣어야 하며 만약 입력되는 키 값이 HashMap 내부에 존재한다면 기존의 값은 새로 입력되는 값으로 대치된다.

HashMap 값 삭제

CopyHashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거
  • HashMap에 값을 제거하려면 remove(key) 메서드를 사용한다.
  • 오직 키값으로만 Map의 요소를 삭제할 수 있다.
  • 모든 값을 제거하려면 clear() 메서드를 사용한다.

HashMap 값 출력

CopyHashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과
		
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap을 출력하는 방법에는 다양한 방법이 있다.

  • 그냥 print 하게 되면 {}로 묶어 Map의 전체 key값, value가 출력된다.
  • 특정 key값의 value를 가져오고 싶다면 get(key)를 사용하면 되고 전체를 출력하려면 entrySet()이나 keySet() 메서드를 활용하여 Map의 객체를 반환받은 후 출력하면 된다.
  • entrySet()은 key와 value 모두가 필요할 경우 사용하며 keySet()은 key 값만 필요할 경우 사용한다.
  • key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.(약 20%~200% 성능 저하가 있음)

> Iterator 사용
CopyHashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" +  entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
  • HashMap의 전체출력 시 반복문을 사용하지 않고 Iterator를 사용해도 된다.












참고 : https://devlogofchris.tistory.com/41
참고 : https://gre-eny.tistory.com/97

profile
주니어개발자 Fox 입니다 🦊

0개의 댓글