enum 요일 {
월, 화, 수, 목, 금, 토, 일
}
public class Example {
public static void main(String[] args) {
System.out.println(요일.월.ordinal()); // 출력: 0
System.out.println(요일.수.ordinal()); // 출력: 2
System.out.println(요일.일.ordinal()); // 출력: 6
}
}
public class Plant {
enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL}
final String name;
final LifeCycle lifeCycle;
public Plant(String name, LifeCycle lifeCycle) {
this.name = name;
this.lifeCycle = lifeCycle;
}
@Override
public String toString() {
return name;
}
}
public class OrdinalIndexingMain {
public static void main(String[] args) {
List<Plant> garden = List.of(
new Plant("A", Plant.LifeCycle.ANNUAL),
new Plant("B", Plant.LifeCycle.BIENNIAL),
new Plant("C", Plant.LifeCycle.PERENNIAL),
new Plant("D", Plant.LifeCycle.ANNUAL));
Set<Plant>[] plantsByLifeCycle = (Set<Plant>[]) new Set[Plant.LifeCycle.values().length];
for (int i = 0; i < plantsByLifeCycle.length; i++) {
plantsByLifeCycle[i] = new HashSet<>();
}
for (Plant plant : garden) {
plantsByLifeCycle[plant.lifeCycle.ordinal()].add(plant);
}
// 결과 출력
for (int i = 0; i < plantsByLifeCycle.length; i++) {
System.out.printf("%s: %s%n", Plant.LifeCycle.values()[i], plantsByLifeCycle[i]);
}
}
}
배열에서 인덱스를 얻고자 한다면 ordinal을 종종 사용할 수 있다.
그런데 ordinal 인덱싱은 좋지않다.
ordinal을 통한 배열 인덱싱은 사실상 내부적으로 많은 문제를 야기한다.
해당 타입의 정수 값이 정말 올바른지를 판단할 수 없어서 런타임에서나 되어야 에러를 만날 수 있다.
Map<LifeCycle, Set<Plant>> plantsByLifeCycle = new EnumMap<>(LifeCycle.class);
for (LifeCycle lifeCycle : LifeCycle.values()) {
plantsByLifeCycle.put(lifeCycle,new HashSet<>());
}
for (Plant plant : garden) {
plantsByLifeCycle.get(plant.lifeCycle).add(plant);
}
//EnumMap은 toString을 재정의
System.out.println(plantsByLifeCycle);
ordinal을 사용한 인덱싱은 여러 위험을 내포하고 있어 피하는 것이 좋고, 대신 EnumMap을 사용하면 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있다.