본문 바로가기
자료구조

[자료구조] 해시맵 (HashMap)

by Hongwoo 2022. 4. 26.
반응형

목차

     

    HashMap 이란?

     

    우선 Map은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이다. 영어 사전을 예로 들어보겠다. person은 사람, baseball은 야구란 뜻을 가지고 있다. 따라서 맵에는 다음과 같이 저장되어 있을 수 있다.

     

    "person" 사람
    "baseball" 야구

     

    Map은 리스트나 배열처럼 순차적으로 해당 요소의 값을 구하지 않고 키를 통해 값을 얻는다. 이게 Map의 가장 큰 특징이기도 하다. 추가로 키는 중복이 불가능하고 동일한 키 값으로 값을 넣을 시 최근에 넣은 값이 적용된다.
    주어진 예로 보면 baseball의 뜻을 찾을 때, 사전의 있는 내용들을 순차적으로 검색해서 찾는 게 아닌 baseball이라는 단어가 있는 곳만 찾는다는 것이다.

     

    맵 인터페이스에는 HashMap, HashTable, TreeMap,... 등등이 있지만 이 중에서 가장 많이 쓰는 게 HashMap이다. HashMap은 해싱 (Hashing)을 사용하기 때문에 많은 양의 데이터를 빠르게 검색할 수 있다는 특징이 있다.

     

     

    HashMap 사용법

    HashMap 선언

     

    HashMap<String,Integer> map1 = new HashMap<String,Integer>();  //HashMap생성
    HashMap<String,Integer> map2 = new HashMap<>();  //new에서 타입 파라미터 생략가능
    HashMap<String,Integer> map3 = new HashMap<>(map1);  //map1의 모든 값을 가진 HashMap생성
    HashMap<String,Integer> map4 = new HashMap<>(10);  //초기 용량(capacity)지정
    HashMap<String,Integer> map5 = new HashMap<>(10, 0.7f);  //초기 capacity,load factor지정
    HashMap<String,Integer> map6 = new HashMap<String,Integer>(){{  
        put("Kim",30);
    }};  // 초기값 저장

     

    HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 된다. HashMap은 저장공간보다 값이 추가로 들어오면 저장공간을 추가로 늘리는데 이때 과부하가 많이 발생한다. 따라서 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다.

     

     

     

    HashMap 값 추가하기

     

    HashMap <String, String> map = new HashMap<>();
    map.put(“basketball”, “농구”);
    map.put(“baseball”, “야구”);

     

    만약 입력되는 키 값이 HashMap 내부에 이미 존재하면 기존의 값은 새로 입력되는 값으로 대체된다.

     

     

     

    HashMap 값 불러오기

     

    System.out.print(map.get(“baseball”));  //야구 출력

     

     

     

    HashMap 값 삭제하기

     

    System.out.println(map.remove("basketball"));  // 농구 출력
    map.clear();  //모든 값 제거

     

    remove 함수는 Map의 항목을 삭제하는 함수로 키값에 해당되는 Entry 객체를 삭제한 후 값을 리턴한다.

     

     

     

    HashMap 값 바꾸기

     

    map.replace(“baseball”, “축구”);
    System.out.println(map.get(“baseball”);  //축구 출력
    
    map.put("baseball", "야구");
    System.out.println(map.get(“baseball”);  //야구 출력

     

    값을 바꿀 때는 replace 함수나 put 함수를 이용해도 된다.

     

     

     

    HashMap 반복시키는 방법들

    알고리즘 문제들을 풀 때 보면 HashMap을 반복, 즉 iterate 시킬 때가 분명 있다. 이럴 때, 어떤 방법들이 있는지 한번 보겠다. 여기서는 Iterator, entrySet, 그리고 keySet을 이용한 3가지 방법들을 알아보겠다.

     

     

    Iterator 방식

     

    Map<String, String> map = new HashMap<>();
    map.put("baseball", "야구");
    map.put("football", "축구");
    map.put("basketball", "농구");
    map.put("volleyball", "배구");
    
    Iterator<String> keys = map.keySet().iterator();
    while (keys.hasNext()) {
    	String Key = keys.next();
        System.out.println(key + " --> " + map.get(key));
    }

     

     

    entrySet 방식

     

    Map<String, String> map = new HashMap<>();
    map.put("baseball", "야구");
    map.put("football", "축구");
    map.put("basketball", "농구");
    map.put("volleyball", "배구");
    
    for (Map.Entry<String, String> entry : map.entrySet()) {
    	System.out.println(entry.getKey() + " --> " + entry.getValue());
    }

     

     

    keySet 방식

     

    Map<String, String> map = new HashMap<>();
    map.put("baseball", "야구");
    map.put("football", "축구");
    map.put("basketball", "농구");
    map.put("volleyball", "배구");
    
    for (String key : map.keySet()) {
    	System.out.println(key + " --> " + map.get(key));

     

    여기서 가장 일반적이고 보편적인 방법은 entrySet을 이용한 방식이라고 한다. keySet()을 이용하는 방법은 키를 이용해서 값을 찾을 때 많은 시간이 소요된다고 한다.

     

    반응형

    '자료구조' 카테고리의 다른 글

    [자료구조] 트리 (Tree)  (0) 2022.08.03
    [자료구조] 덱 (Deque)  (0) 2022.03.17
    [자료구조] 큐(Queue)  (0) 2022.03.15
    [자료구조] 스택(Stack)  (0) 2022.02.28
    [자료구조] 그래프 (Graph)  (1) 2022.01.22

    댓글