[Java] Enum values 배열을 리스트 변환 (Baeldung, Enum values to List)공부/Java2023. 7. 21. 22:50
Table of Contents
반응형
Enum values to List
기본적으로 제공하는 values() method를 사용하게 되면 아래와 같이 배열[] 형태로 값이 반환된다.
PizzaStatus[] values = PizzaStatus.values(); // [ORDERED, READY, DELIVERED]
개인적으로 values()와 forEach 구문을 활용하여 많이 사용했는데, Array -> List 로 변경하는 방식에 대해 Baeldung 포스팅이 있어서 내용을 정리해본다.
1. 클래스 타입 토큰을 인자로 전달받아 사용하는 static method 경우
static <T> List<T> enumValuesInList(Class<T> enumClass) {
T[] arr = enumClass.getEnumConstants(); // Enum 아닌 경우 null
return arr == null ? Collections.EMPTY_LIST : Arrays.asList(arr);
}
@DisplayName("enumValuesInList()는 Enum 클래스인 경우 List를 반환하고, 아닌 경우 빈 리스트를 반환한다")
@Test
void enumValuesInListOrEmptyList_test() {
// given
List<PizzaStatus> givenPizzaStatuses = Arrays.asList(PizzaStatus.values());
// when
List<PizzaStatus> pizzaStatuses = enumValuesInList(PizzaStatus.class);
List<Integer> emptyList = enumValuesInList(Integer.class);
// then
assertThat(givenPizzaStatuses).isEqualTo(pizzaStatuses); // Ok
assertThat(emptyList).isEmpty(); // Ok
}
위의 static method에서 타입 매개 변수를 enum으로만 제한하는 것도 가능하다.
static <T extends Enum<T>> List<T> enumValuesInList(Class<T> enumClass) {
return Arrays.asList(enumClass.getEnumConstants());
}
List<PizzaStatus> pizzaStatuses = enumValuesInList(PizzaStatus.class); // Ok. Enum PizzaStatus
List<Integer> integers = enumValuesInList(Integer.class); // Compile Error. Integer 클래스
- 클래스 타입 인자가 enum 클래스가 아닌 경우 Compile Error 가 발생한다. (generic type safe)
2. EnumSet.allOf() 사용하는 경우
@DisplayName("EnumSet의 allOf 메서드를 활용하여 Enum List를 만들 수 있다")
@Test
void test() {
// give
List<PizzaStatus> givenPizzaStatusList = Arrays.asList(PizzaStatus.values());
// when
List<PizzaStatus> pizzaStatuses = new ArrayList<>(EnumSet.allOf(PizzaStatus.class)); // 인자로 EnumSet<PizzaStatus> 전달
// then
Assertions.assertThat(givenPizzaStatusList).isEqualTo(pizzaStatuses); // Ok
}
ArrayList 생성자
- 내부에서 EnumSet 를 Object[] 로 변환 후 처리하고 있다
매개변수에 있는 상한 경계 와일드 카드 제네릭 Collection<? extends E>을 풀어보면
Collection<? extends PizzaStatus> 이므로 EnumSet<PizzaStatus>을 인자로 전달 가능
EnumSet의 경우 클래스를 타고 올라가다보면 Collection을 구현하고 있다.
Arrays.asList() 나 List.of() static method의 경우에도 List를 만들어주는 걸로 알아서 테스트 해봤는데,메서드 매개변수가 T(Object)만 할당 받아서 이중 배열 형태가 되었다. (비추천)
// [[READY, ORDERED, DERIVERED]]
List<EnumSet<PizzaStatus>> test1 = Arrays.asList(EnumSet.allOf(PizzaStatus.class));
List<EnumSet<PizzaStatus>> test2 = List.of(EnumSet.allOf(PizzaStatus.class));
출처
반응형
'공부 > Java' 카테고리의 다른 글
[Java] Enum (이펙티브 자바 3판) (0) | 2023.07.26 |
---|---|
[Java] Enum values 조회 (Baeldung) (0) | 2023.07.26 |
[Java] Generics (제네릭) - 공변/무공변/반공변, PECS (0) | 2023.07.21 |
[Java] Annotation - 어노테이션 (자바의 정석) (0) | 2023.07.19 |
[Java] Primitive type (기본형 타입) (0) | 2023.05.31 |
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!