Language/Java & Kotlin

[Java] 자주 쓰이는 util 클래스 정리하기 (1) HashMap

Joonfluence 2022. 5. 12. 22:03

서론

오늘은 자바 프로그래밍을 하면서 유용하게 쓰이는 util 클래스 중 하나인 HashMap에 관해 정리하는 시간을 갖겠습니다.

본론

정의

먼저, Map은 key와 value로 구성된 객체를 저장하는 자료구조입니다. key와 value는 모두 객체이며, value는 중복될 수 있지만 key 값은 중복될 수 없습니다. 식별자로 유일한 key를 갖으므로 O(1)의 탐색시간을 특성을 갖고 있습니다. HashMap은 이러한 Map의 인터페이스를 구현한 대표적인 Map 컬렉션입니다. 차이점은 Map의 key 값을 저장할 때 Hashing(해싱)을 사용하여 많은 양의 데이터를 검색할 때 빠른 속도로 탐색할 수 있도록 돕는다는 점입니다.

선언방법

HashMap은 아래와 같이 선언할 수 있습니다. 첫번째 제너릭 인자로는 key 타입이 오고, 두번째 인자로는 value의 타입이 오면 됩니다.

// general 
HashMap<K, V> numbers = new HashMap<>();

// exmaples
HashMap<Integer, String> numbers = new HashMap<>(10); // key 타입으로 Integer, value 타입으로 String이 오며 초기 용량을 10으로 설정합니다. 

생성 : put(K key, V value)

put(key, value) 메서드를 사용합니다. 위에 선언한 형태 그대로 사용하겠습니다. 만약 중복된 key 값으로 데이터를 생성하면 기존 value 값을 반환됨과 동시에 기존 value 값은 대체(!)됩니다. 존재하지 않으면, null을 반환합니다.

numbers.put(1, "1234");
numbers.put(2, "1231");
numbers.put(3, "1232");
numbers.put(4, "1238");

조회 : get(K key), values()

하나의 값을 조회하려면 get 메서드, 전체를 조회하려면 values 메서드를 쓰면 됩니다. 전자는 value를, 후자는 value 타입의 Array를 반환해줍니다.

System.out.println(numbers.get(1)); // 1234 
System.out.println(numbers.get(2)); // 1231 
System.out.println(numbers.get(3)); // 1232 
System.out.println(numbers.get(4)); // 1237 
System.out.println(numbers.values()); // [1234, 1231, 1232, 1237] 

삭제 : remove(K key, (V value)), clear()

remove(K key, (V value)) 메서드를 사용합니다. 삭제가 성공하면 true를 반환합니다. 또 전체 삭제하려면 clear 메서드를 사용해주면 됩니다.

numbers.remove(1);
numbers.remove(2);
numbers.remove(3, "1234"); // key의 value 값이 인자로 입력된 값과 다르면, 삭제되지 않습니다. value가 중복일 때 유용하게 사용할 수 있겠죠?
numbers.remove(4, "1238");
numbers.clear();

수정 : replace(K key, (V oldValue), V newValue), replaceAll(Bifunction<K, V> function)

하나의 값을 바꿀 땐, replace. 전체를 변경할 때는 replaceAll 메서드를 사용합니다. JDK 8 버젼부터 사용되는 기능이며, 특이한 점은 함수를 인자로 전달해줍니다. 자바스크립트의 콜백함수처럼 말이죠. 그리고 전달된 함수의 return 값이 그대로 반환됩니다.

numbers.replace(1, "one two three four");
numbers.replace(2, "one two three one");
numbers.replace(3, "one two three two");
numbers.replace(4, "one two three eight");
System.out.println(numbers.values()); // [one two three four, one two three one, one two three two, one two three eight]

numbers.replaceAll((k, v) -> v.toUpperCase()); 
System.out.println(numbers.values()); // [ONE TWO THREE FOUR, ONE TWO THREE ONE, ONE TWO THREE TWO, ONE TWO THREE EIGHT]

마무리

이상으로 HashMap에서 자주 쓰이는 메서드들을 간단하게 정리해보았습니다. 읽어주셔서 감사합니다.

참고한 포스트

https://www.programiz.com/java-programming/hashmap
https://coding-factory.tistory.com/556

반응형