[JAVA] Map & HashMap

2024. 2. 20. 15:11언어(Language)/JAVA

Map이란?

Map은 각각의 대응관계를 쉽게 표현할 수 있게 해주는 자료형이다.

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

Map의 가장 큰 특징은 key로 value를 얻어낸다는 점이다.

예를 들어 name이란 단어의 뜻을 찾기 위해서 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 name이라는 단어가 있는 곳만을 펼쳐보는 것이다.

Map 역시 List와 마찬가지로 인터페이스이고, Map 인터페이스를 구현한 Map 자료형에는 HashMap, LinkedHashMap, TreeMap 등이 있다.


Map의 장점

Map은 특정 값을 검색하는데 있어 그에 해당하는 키 값을 통해 찾을 수 있기 때문에, 검색이 빠르고 간단하다는 장점이 있다. 즉, 특정한 키 값을 기준으로 값을 검색하고, 추출하고, 업데이트할 필요가 있기 떄문에 유용하다.


Map의 생성 방법

Map의 생성 방법은 다음과 같다.

Map은 인터페이스이기 때문에, 객체는 Map타입으로 만들어질 수 없다.

객체 생성을 위해서는 Map 인터페이스로 구현된 또 하나의 클래스를 만들어야 한다.

따라서 제네릭(Generic)을 사용해 Map에 저장할 수 있는 객체의 타입을 지정하면 된다.

 

ex)

Map hm = new HaspMap();
//Obj is the type of the object to be stored in Map

 

 


HashMap이란?

HashMap은 Map 인터페이스를 구현하는 대표적인 Map 컬렉션이다.

Map 인터페이스를 상속하고 있기 때문에 Map의 성질을 그대로 가지고 있고, Map은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있는 자료구조이다.

여기서 키와 값은 모두 객체이다. 또한 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.

만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.

 

 

 

 

위 그림과 같이 HashMap은 내부에 '키와 값'을 저장하는 자료 구조를 가지고 이다. HashMap은 해시 함수를 통해 '키와 값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어있는 위치 또한 관계가 없다.

 

사용 방법)

HashMap<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의 초기 용량을 지정해주는 것이 좋다.

 

 

HaspMap 값 추가(put)

HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");

 

HashMap에 값을 추가하려면 put(key, value) 메소드를 사용하면 된다.

선언 시 HashMap에 설정해준 타입과 같은 타입의 key와 value 값을 넣어야 하며, 만약 입력되는 키 값이 HashMap 내부에 존재한다면 기존의 값은 새로 입력되는 값으로 대치된다.

 

 

HashMap값 삭제

HashMap<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값 출력

HashMap<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의 객체를 반환받은 후 출력하면 된다.

그리고 적은 양의 데이터를 가져와야 한다면 keySet()을, 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.