ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] LinkedHashMap은 무엇일까?
    Language/Java 2020. 4. 8. 18:48
    728x90
    반응형

    HashMap에 대해서 간략하게라도 알고 있다면 LinkedHashMap을 이름만 봐도 LinkedList + HashMap 합쳐진 것이라고 추측할 수 있다. HashMap은 순서가 존재하지 않는다. (즉 버전에 따라 환경에 따라 달라진다는 뜻이다) 그래서 내가 추측했던 것 처럼 실제로 LinkedHashMap은 HashMap에서 자료들이 입력된 순서를 기억하는 것을 추가하기 위해 만든 클래스이다. 사실 왜 HashMap이 데이터의 순서를 유지하지 않는지?에 대해서는 깊게 생각해본적이 없다. 이번에 짧게라도 생각해보면서 공부한 것을 정리해보려 한다. 

     

     

     

    HashMap이 데이터의 순서를 유지하지 않는 이유 

    HashMap은 연관 배열을 저장하기 위한 자료구조이다. (연관 배열이라는 말은 처음 들어본다) 그러면 연관배열이 무엇인가? 봤더니 연관 배열(Associative Array)은 키와 값의 쌍을 저장하기 위한 구조이다.

     

    즉, 맵(Map) 또는 딕셔너리(Dictionary)라는 이름으로도 불린다. 연관 배열의 자료를 효율적으로 자정하기 위해 키를 해시 펑션(Hash Function)을 통해 변환(매핑)한다. 내부적으로 해시함수나 해시에 대한 많은 이해가 있으면 더 깊게 알 수 있겠지만 이 글과는 다른 내용이므로 나중에 공부해보려 한다. HashMap의 동작원리를 아래에서 참고하길 바란다.

     

    따라서 가볍게 생각해봤을 때 HashMap은 검색을 위해 만든 자료구조라서 그렇다고 생각한다. (맞으려나..)

    또한 keySet(), values() 메소드를 보면 둘다 Set의 형태로 return 해주는 것도 참고하길 바란다.

    https://d2.naver.com/helloworld/831311

     

    LinkedHashMap을 통한 순서 유지 

    우리는 HashMap이 순서대로 자료를 유지하기 위한 자료구조가 아님을 알았다. 

    • 키-값 쌍이 필요하다
    • 순서를 알아야 한다 

    이러한 필요가 있을 때, 간편하게 쓸 수 있는 자료구조가 바로 LinkedHashMap이다. Hash를 통해 자료를 보관할 필요가 있지만, 원할 때 순서대로 가져와야 하는 경우일 때 이다.

    LinkedHashMap은 HashMap을 확장한다. HashMap의 모든 기능을 사용하되, Doubly-Linked List를 내부에 유지함으로써 입력된 자료의 순서를 보관한다.  

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.Map;
     
    public class Test {
        public static void main(String[] args) {
            Map<StringString> lm = new LinkedHashMap<>();
     
            lm.put("강아지""멍멍");
            lm.put("고양이""냐옹");
            lm.put("소""음메");
     
            System.out.println(lm);                                                     // 결과 출력
     
            for (Iterator lt = lm.values().iterator(); lt.hasNext();) {                 // 결과 출력
                System.out.print(lt.next() + " ");
            }
     
        }
    }
     
     
     

    결과창

    {강아지=멍멍, 고양이=냐옹, 소=음메}
    멍멍 냐옹 음메 
     

     

    위와 같이 입력한 순서가 유지되어서 나오는 것을 확인할 수 있다. 

    반응형

    댓글

Designed by Tistory.