Sam Story

JAVA - 자료구조 Map 본문

JAVA

JAVA - 자료구조 Map

Sam H 2024. 9. 21. 19:06

프로젝트를 진행하면서 같은 객체를 담고 있는 두 개의 리스트를 비교하여

특정 값을 추출해 새로운 리스트로 만들어야 하는 문제가 발생했었다.

 

처음에는 이중 for 문을 사용해 구현했지만,

이 방식은 시간 복잡도가 곱연산(O(n^2))이기 때문에 매우 비효율적이었다.

이러한 이유로 이중 반복문은 지양해야 하는데,

더 나은 방법을 찾던 중 여러 상황에서 유용하게 사용 가능한 자료구조인 Map을 활용하게 되었다.

 

2024-07-21 scrollView , 다른 객체 리스트의 비교 (tistory.com)

 

2024-07-21 scrollView , 다른 객체 리스트의 비교

scrollView도 알게 모르게 많이 사용했었는데 따로 블로그 포스팅으로 다뤄본적이 없었어서 오늘 작업중 수정한 내용을 기반으로 간단히 포스팅 해보려 한다. 먼저 스크롤 뷰의 용도자체는 레이

samtistory.tistory.com

 

당시 프로젝트에는 Map과 Set 두가지 자료구조를 활용해 문제를 해결했다.

 

 

Map을 사용하면 각 키를 설정, 빠르게 조회할 수 있어 시간 복잡도를 대폭 줄일 수 있다.

이 구조를 통해 리스트 비교 문제를 더 효율적으로 해결할 수 있었고,

이후 다양한 상황에서도 유용하게 활용할 수 있었다.

 

그렇기에 유용하게 사용했던 자료구조인 Map에 대해서 포스팅 해보려한다.

 

Map ?

Map은 Key와 Value 한쌍으로 이루어진 자료형 이다.

 

Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 Key를 통해 Value를 얻는다.

 

만약 이미 존재하는 Key값과 동일한 Key값을 put하면 새로운 Key값으로 갱신된다.

 

Map의 특징

Map은 저장 순서를 유지할 필요가 없고,

Key를 통해 Value를 얻어내기 때문에 Key는 중복을 허용하지 않는다.

만약 이미 존재하는 Key값과 동일한 Key값을 put하면 새로운 Key값으로 갱신된다.

 

예제

간단한 예제들을 보며 자세한 사용법을 알아보자.

 

오늘 예제는 Map 인터페이스를 상속하는 대표적인 Map의 컬렉션 

HashMap을 이용한 간단한 예제이다.

 

HashMap 초기화

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {

        // map 객체 생성,초기화
        Map<String,String> map = new HashMap<>();

        // map.put( Key , Value ) 형태로 put 해줄 수 있다.
        map.put("Oscar","월급루팡");
        map.put("Harry","망나니");
        map.put("Sam","성실한 개발자");

        System.out.println(map);

    }
}

 

 

실행결과

 

 

 

map의 메서드를 통해서 값을 삭제하거나 새로운 값으로 초기화도 가능하다.

 

 

remove 메서드를 사용해 map값 삭제

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {

        // map 객체 생성,초기화
        Map<String,String> map = new HashMap<>();

        // map.put( Key , Value ) 형태로 put 해줄 수 있다.
        map.put("Oscar","월급루팡");
        map.put("Harry","망나니");
        map.put("Sam","성실한 개발자");

        // key 값을 이용해 remove 메서드를 사용하면 map에서 값을 삭제할 수 있다.
        map.remove("Oscar");
        map.remove("Harry");

        System.out.println(map);

    }
}

 

실행결과

 

 

clear 메서드를 사용한 map값 삭제

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {

        // map 객체 생성,초기화
        Map<String,String> map = new HashMap<>();

        // map.put( Key , Value ) 형태로 put 해줄 수 있다.
        map.put("Oscar","월급루팡");
        map.put("Harry","망나니");
        map.put("Sam","성실한 개발자");

        // key 값을 이용해 remove 메서드를 사용하면 map에서 값을 삭제할 수 있다.
        map.remove("Oscar");
        map.remove("Harry");
        
        // sam = 성실한 개발자 값이 남아 있음
        System.out.println(map);

        // clear 메서드를 사용하면 map의 모든 값 삭제 가능
        map.clear();
        System.out.println(map);

    }
}

 

실행결과

 

 

위에 사용한 예제 코드들의 경우 map 객체의 값을 전부 불러 왔다면

Key 값을 호출해 특정 Key의 Value 값도 호출이 가능하다

 

get을 이용한 Key의 Value 호출

import java.util.HashMap;
import java.util.Map;

public class MapExample2 {
    public static void main(String[] args) {

        // map 객체 생성,초기화
        Map<String,String> map = new HashMap<>();

        // map.put( Key , Value ) 형태로 put 해줄 수 있다.
        map.put("Oscar","월급루팡");
        map.put("Harry","망나니");
        map.put("Sam","성실한 개발자");

        // Key = "Sam"의 값을 호출 해보자.
        System.out.println(map.get("Sam"));

    }
}

 

실행결과

 

 

그리고 특정 Key값을 포함하고 있는지 true , false를 반환하는 ContainsKey() 메서드도 유용하게 사용할 수 있다.

 

 

containsKey() 메서드를 이용한 Key값 존재 유무에 따른  true , false 반환

import java.util.HashMap;
import java.util.Map;

public class MapExample2 {
    public static void main(String[] args) {

        // map 객체 생성,초기화
        Map<String,String> map = new HashMap<>();

        // map.put( Key , Value ) 형태로 put 해줄 수 있다.
        map.put("Oscar","월급루팡");
        map.put("Harry","망나니");
        map.put("Sam","성실한 개발자");

        // containsKey 메서드를 사용해 "Sam" Key 값이 있는지 확인
        System.out.println(map.containsKey("Sam"));

    }
}

 

실행결과

 

 

 

간단한 예제를 통해 Map의 사용법에 대해 알아보았다.

 

오늘 예제에서 소개하지 않은 몇가지 메서드들도 상황에 따라 유용하게 적용할 수 있다고 생각한다.

 

하지만 Map을 사용할 때의 주의점은 순서를 보장하지 않는다는 것이다.

위 예제의 결과로도 볼 수 있지만, 이점을 주의하면서 사용하면

Map을 굉장히 유용하게 사용할 수 있다고 생각한다.

'JAVA' 카테고리의 다른 글

JAVA - 단일 책임의 원칙  (1) 2024.10.12
JAVA - 2~36진수 기수변환  (0) 2024.09.29
JAVA - 스레드 (Thread)  (0) 2024.05.12
JAVA - 랜덤 함수 (Random class)  (0) 2024.05.06
JAVA - 배열 요소의 내림차순,오름차순  (0) 2024.03.23