Java EnumMap 마스터: 열거형 키로 효율적인 키-값 매핑
Java EnumMap
이 튜토리얼에서는 예제를 통해 Java EnumMap 클래스와 연산을 학습합니다.
EnumMap 클래스는 Java 컬렉션 프레임워크에서 열거형의 요소를 위한 맵 구현을 제공합니다.
EnumMap에서 열거형 요소가 키로 사용됩니다. Map 인터페이스를 구현합니다.
EnumMap 생성하기
EnumMap을 생성하려면 먼저 java.util.EnumMap 패키지를 임포트해야 합니다. 패키지 임포트 후 Java에서 EnumMap을 생성하는 방법은 다음과 같습니다.
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
위 예제에서 sizes라는 EnumMap을 생성했습니다.
여기서:
- Size - 값에 매핑되는 열거형의 키
- Integer - 해당 키와 연관된 EnumMap의 값
EnumMap 메서드
EnumMap 클래스는 EnumMap에서 다양한 연산을 수행할 수 있는 메서드를 제공합니다.
EnumMap에 요소 삽입하기
put() - 지정된 키/값 매핑(엔트리)을 EnumMap에 삽입
putAll() - 지정된 맵의 모든 엔트리를 이 맵에 삽입
예제:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size 열거형의 EnumMap 생성
EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);
// put() 메서드 사용
sizes1.put(Size.SMALL, 28);
sizes1.put(Size.MEDIUM, 32);
System.out.println("EnumMap1: " + sizes1);
EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);
// putAll() 메서드 사용
sizes2.putAll(sizes1);
sizes2.put(Size.LARGE, 36);
System.out.println("EnumMap2: " + sizes2);
}
}
출력
EnumMap1: {SMALL=28, MEDIUM=32} EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}
위 예제에서 putAll() 메서드로 EnumMap sizes1의 모든 요소를 sizes2 EnumMap에 삽입했습니다.
HashMap, TreeMap 등 다른 맵의 요소를 putAll()로 EnumMap에 삽입하는 것도 가능합니다. 단, 모든 맵이 같은 열거형 타입이어야 합니다.
EnumMap 요소 접근하기
1. entrySet(), keySet(), values() 사용
entrySet() - EnumMap의 모든 키/값 매핑(엔트리) 집합 반환
keySet() - EnumMap의 모든 키 집합 반환
values() - EnumMap의 모든 값 집합 반환
예제:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size 열거형의 EnumMap 생성
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// entrySet() 메서드 사용
System.out.println("Key/Value mappings: " + sizes.entrySet());
// keySet() 메서드 사용
System.out.println("Keys: " + sizes.keySet());
// values() 메서드 사용
System.out.println("Values: " + sizes.values());
}
}
출력
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40] Keys: [SMALL, MEDIUM, LARGE, EXTRALARGE] Values: [28, 32, 36, 40]
2. get() 메서드 사용
get() 메서드는 지정된 키와 연관된 값을 반환합니다. 지정된 키를 찾지 못하면 null 반환.
예제:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size 열거형의 EnumMap 생성
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// get() 메서드 사용
int value = sizes.get(Size.MEDIUM);
System.out.println("Value of MEDIUM: " + value);
}
}
출력
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Value of MEDIUM: 32
EnumMap 요소 제거하기
remove(key) - 지정된 키와 연관된 엔트리를 맵에서 제거하고 반환
remove(key, value) - 지정된 키가 지정된 값에 매핑된 경우에만 엔트리 제거하고 불리언 반환
예제:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size 열거형의 EnumMap 생성
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// remove() 메서드 사용
int value = sizes.remove(Size.MEDIUM);
System.out.println("Removed Value: " + value);
boolean result = sizes.remove(Size.SMALL, 28);
System.out.println("Is the entry {SMALL=28} removed? " + result);
System.out.println("Updated EnumMap: " + sizes);
}
}
출력
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Removed Value: 32 Is the entry {SMALL=28} removed? True Updated EnumMap: {LARGE=36, EXTRALARGE=40}
EnumMap 요소 교체하기
replace(key, value) - 지정된 key와 연관된 값을 새 value로 교체
replace(key, old, new) - old 값이 지정된 key와 이미 연관된 경우에만 new 값으로 교체
replaceAll(function) - 맵의 각 값을 지정된 function 결과로 교체
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size 열거형의 EnumMap 생성
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// replace() 메서드 사용
sizes.replace(Size.MEDIUM, 30);
sizes.replace(Size.LARGE, 36, 34);
System.out.println("EnumMap using replace(): " + sizes);
// replaceAll() 메서드 사용
sizes.replaceAll((key, oldValue) -> oldValue + 3);
System.out.println("EnumMap using replaceAll(): " + sizes);
}
}
출력
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40} EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}
위 프로그램에서 다음 문장을 주목하세요:
sizes.replaceAll((key, oldValue) -> oldValue + 3);
이 메서드는 맵의 모든 엔트리에 접근한 후 람다 표현식이 제공하는 새 값으로 모든 값을 교체합니다.
기타 메서드
| 메서드 | 설명 |
clone() | EnumMap 복사본 생성 |
containsKey() | 지정된 키 검색하고 불리언 결과 반환 |
containsValue() | 지정된 값 검색하고 불리언 결과 반환 |
size() | EnumMap 크기 반환 |
clear() | EnumMap에서 모든 엔트리 제거 |
EnumSet vs EnumMap
EnumSet과 EnumMap 클래스 모두 열거형 값 저장을 위한 자료구조를 제공하지만 주요 차이점이 존재합니다.
- EnumSet은 비트 시퀀스로 내부 표현, EnumMap은 배열로 내부 표현
- EnumSet은
allOf(), noneOf(), of() 등 사전 정의 메서드로 생성, EnumMap은 생성자로 생성
Cloneable과 Serializable 인터페이스
EnumMap 클래스는 Cloneable과 Serializable 인터페이스도 구현합니다.
Cloneable 인터페이스
EnumMap 클래스가 클래스 인스턴스의 복사본을 만들 수 있게 합니다.
Serializable 인터페이스
Java 객체를 네트워크로 전송해야 할 때 객체를 비트나 바이트로 변환해야 합니다. Java 객체는 네트워크로 직접 전송할 수 없기 때문입니다.
Serializable 인터페이스는 클래스가 직렬화될 수 있게 합니다. 즉, Serializable을 구현한 클래스의 객체를 비트나 바이트로 변환할 수 있습니다.