Enumeration
1) 상수 목록을 담을 수 있는 데이터 타입
2) 타입 세이프티를 보장할 수 있습니다.
3) 싱글톤 패턴을 구현할 때 사용하기도 합니다.
자문자답
간단하게 주문 상태를 가지고 있는 enum 클래스를 구성해보았습니다.
public enum OrderStatus {
PREPARING, SHIPPED, DELIVERING, DELIVERED;
}
1. 특정 enum 타입이 가질 수 있는 모든 값을 순회하여 출력할 수 있는가?
public static void main(String[] args) {
System.out.println(Arrays.stream(OrderStatus.values()).collect(Collectors.toList()));
}
Enumeration의 values를 사용하면 해당 enum의 모든 값을 담고 있습니다. 따라서 values를 사용해서 조회할 수 있습니다.
2. enum은 자바의 클래스처럼 생성자, 메소드, 필드를 가질 수 있는가?
가질 수 있습니다. 예를 들어 위와 같이 주문 상태 enum이 있는데 디비에 저장할 경우에는 0, 1, 2, 3과 같은 값을 저장하고 싶습니다. 어떻게 해야 할까요?
public enum OrderStatus {
PREPARING(0), SHIPPED(1), DELIVERING(2), DELIVERED(3);
private int number;
OrderStatus(int number) {
this.number = number;
}
}
위와 같은 방식으로 생성자와 필드를 통해 사용할 수 있습니다.
3. enum의 값은 == 연산자로 동일성을 비교할 수 있는가?
비교할 수 있습니다. enum을 비교할 때 == 연산자와 equals()가 비교방법이 있는데, equals()는 null일 경우 nullpointerexception을 던지기 때문에 == 연산자를 사용하는 것이 좋습니다. (어차피 다르면 false이기에..)
4. enum을 key로 사용하는 Map을 정의하거나 enum을 담고 있는 Set을 만들 수 있는가?
이럴 경우에는 Set이나 Map, HashMap, HashSet을 사용하면 안 됩니다. enum을 key로 사용하는 경우 EnumMap, EnumSet을 사용해야 합니다. 그 이유는 HashMap은 key를 bucket에 저장하고 각 bucket이 linked list를 참조하고 있습니다. EnumMap은 내부에 데이터를 Array에 저장합니다. 그러면 우리가 많이 사용하는 HashMap처럼 해시를 만들고 해시 충돌(Hash Collision)에 대응하는 작업 자체가 필요 없어집니다. 성능적인 장점을 가져올 수 있습니다. 그리고 특정 enum 타입만을 키로 받기 때문에 인터페이스가 명확해집니다.
EnumSet은 enum 클래스로 작동에 특화된 Set입니다. EnumSet의 모든 메서드들은 산술 비트 연산자를 사용하여 구현되므로 일반적으로 빠르게 연산이 가능합니다. EnumSet과 HashSet 같은 다른 Set 컬랙션들과 비교했을 때 EnumSet 같은 경우 데이터가 예상 가능한 순서로 저장되어있고, 하나하나 계산을 하는데 하나의 비트만 사용하여 성능적으로 장점을 가져올 수 있습니다. 또한 위에서 말했다시피, 데이터를 저장하려는 bucket을 찾는 hashcode를 계산할 필요가 없습니다. EnumSet은 비트 백터의 특성으로 더 작은 메모리를 사용합니다.
'혼자 공부하는 것들 > 독서' 카테고리의 다른 글
메서드 시그니처를 신중히 설계하자! (0) | 2022.04.09 |
---|---|
[함께자라기 애자일로 가는 길]을 읽고 ✅ (0) | 2022.02.03 |
[객체지향의 사실과 오해]를 읽고 🐇 (0) | 2022.02.01 |
댓글