[Java] 자바 101 강의 #13 ( Map형 )

    자바의 Map형은 파이썬(Python)의 딕셔너리(Dictionary) 구조와 유사한 구조입니다. 복잡한 데이터를 저장하는 역할도 하지만, Key값과 Value형태로 이루어져서 데이터를 쉽게 찾아주는 역할도 수행합니다.

     

    Java의 Map 구조 [1]

     

    수많은 Map 형태의 구조중에 가장 많이 활용하는 것은 HashMap과 LinkedHashMap 정도가 될 수 있습니다. 물론 개발 업종에 따라 TreeMap이나 HashTable이 사용되기도 하지만, 일반적으로는 2가지가 가장 많이 활용이 됩니다.

     

    Map의 사용방법

    map.put(키, 값);	// 키와 값 저장
    map.get(키);		// 키를 기준으로 값을 가져온다
    map.remove(키);	// 키 값을 기준으로 값을 삭제한다

    물론 위의 사용법보다 훨씬 많은 기능들이 있지만, 대표적으로 3가지를 많이 활용합니다.

     

    Map의 예시

    public static void main(String[] args) {
        Map<String, Integer> indexMap = new HashMap<> ();
    
        for(int i = 2; i <= 9; i++) {
            for(int j = 1; j <= 9; j++) {
            	// 구구단 저장
                indexMap.put(i + "_" + j, (i*j));
            }
        }
    
        System.out.println("3 곱하기 4는 ? " + indexMap.get("3_4"));
        indexMap.remove("3_4");
        System.out.println("3 곱하기 4는 ? " + indexMap.get("3_4"));
    }

     

    실행 결과

     

    위의 실행 결과는 Map의 가장 기본적인 추가, 가져오기, 삭제에 대해서 이해를 돕기 위한 예시 결과이며, 이제 Map의 존재 이유인 역할에 대해서 알아보겠습니다.

     

     

    Map의 역할

    Map은 Key와 Value로 구성이 되어 있습니다. 그러다보니 특정 키 값을 기준으로 특정 Value를 찾는 Index의 역할을 수행할 수도 있고, 순수하게 데이터를 저장하기 위한 역할이 있을 수 있습니다. 

     

    색인 역할

    위의 예시에서 구구단을 뽑기 위해서 값을 미리 저장한 모습을 볼 수 있는데 여기서 Map의 역할을 내가 원하는 키에 대한 Value를 확인하기 위함입니다. 즉 데이터의 저장의 역할보다 Index로 인한 값을 찾는 역할이 큰 것이죠.

     

    저장 역할

    Map은 Key와 Value 형태로 되어 있기 때문에 데이터를 구조에 맞게 저장하기 상당히 유용합니다. 예를 들어, 우리가 회원가입을 할 때 아이디, 패스워드, 이름, 이메일 등등을 Map에 저장을 하고 이것을 DB에 저장을 할수 있습니다. 혹은 게시판의 내용들을 Map에 담고 또 이것을 List에 담아서 최종적으로 게시판 리스트 형태로 뿌릴 수 있습니다.

     

    회원에 대한 정보를 Map으로 입력 받았을 때 가정

    public static void main(String[] args) {
        Map<String, Object> memberMap = new HashMap<>();
    
        memberMap.put("name", "홍길동");
        memberMap.put("email", "gildonghong.korea.net");
        memberMap.put("phone", "010-1111-2222");
        memberMap.put("age", 28);
    
        System.out.println(memberMap);
    }
    {phone=010-1111-2222, name=홍길동, email=gildonghong.korea.net, age=28}

     

    Map은 이렇듯 거의 대부분의 데이터 구조에 사용하게 되며, Set은 물론이고 List보다도 많이 사용될 수 있는 구조입니다. 

     

    Map 종류별 사용 이유

    종류 사용 이유
    HashMap 요소의 순서를 유지할 필요가 없고 단일 스레드 환경에서 작업할 때 사용
    LinkedHashMap 요소의 삽입 순서를 유지해야 하고, 단일 스레드 환경에서 작업할 때 사용
    TreeMap 요소의 오름차순을 유지해야 하고 단일 스레드 환경에서 작업할 때 사용
    HashTable 요소의 순서를 유지할 필요가 없고 다중 스레드 환경에서 작업할 때 사용

     

    일반적으로는 HashMap을 가장 많이 사용하며, 데이터를 순서대로 저장을 해야 하거나 하고 싶을 경우 LinkedHashMap을 사용합니다. TreeMap의 경우 키값에 대한 오름차순을 유지해야 할 때에 사용하는데 이런 케이스가 흔하지 않기 때문에 잘 사용하지 않습니다.

     

    HashTable의 경우 Map에서 가장 먼저 구현되었으며, HashTable 이후 HashMap이 구현되었습니다. 즉 HashMap이 HashTable 이후에 나온 상위 버전 개념이며, 많은 부분에서 HashMap이 장점이 많습니다.

     

    아래는 HashMap과 HashTable의 차이점 입니다.

    1. Hashtable은 동기화 되지만 HashMap은 동기화되지 않기에 HashMap의 경우 스레드가 아닌 응용 프로그램에 더 성능이 좋습니다.
    2. Hashtable은 null 키 또는 값을 허용하지 않지만, HashMap은 하나의 null의 키와 임의의 수의 null 값을 허용합니다.
    3. HashMap의 하위 클래스 중 LinkedHashMap이므로 예측 가능한 반복 순서를 원할 경우 HashMap을 LinkedHashMap으로 쉽게 바꿀 수 있습니다.

    그리고 HashMap의 thread-safe를 하고 싶을 경우, Collections.synchronizedMap()으 사용하면 됩니다.

     

    References

    [1] https://www.w3schools.blog/hashmap-linkedhashmap-treemap-hashtable-java

     

    반응형

    댓글

    Designed by JB FACTORY