#33 서수 인덱스 대신 EnumMap을 사용하자
서수를 인덱스로 이용한 배열을 볼 수 있습니다.
아래 코드는 허브를 Type(일 년생, 이년생, 다년생) 별로 구분하는 클래스입니다.
이를 각 Type(일 년생, 이년생, 다년생) 별로 하나씩 Set<Herb>을 만들어서, 식물들을 Type에 맞게 적합한 Set<Herb>에 넣어야 합니다.
이때 Set<Herb> 배열(Set<Herb>[])을 만드는데, 인덱스로 Type의 서수(ordinal)를 이용합니다.
이를 직접 구현하면 아래와 같습니다.
따라서 unchecked 경고 메시지가 나타나고 타입 안정성에 문제가 발생할 수 도 있습니다.
게다가 배열이기 때문에 잘못된 인덱스 값을 이용하면 ArrayIndexOutOfBoundsException 예외가 발생할 수 도 있습니다.
EnumMap을 이용하면 좀 더 쉽게 구현할 수 있습니다.
Map은 제네릭과 호환되기 때문에 배열에서 발생할 수 있는 타입 안정성의 문제가 없습니다.
그리고 인덱스를 이용하지 않으므로 인덱스 예외가 발생하지도 않습니다.
당연한 얘기지만 Map에서 제공하는 다양한 기능도 이용할 수 있습니다.
배열이 아닌 Map을 이용하기 때문에 성능 이슈를 우려할 수 있는데, EnumMap 내부적으로 배열을 이용하고 있습니다.
따라서 배열을 이용한 구현에 비해 성능상으로 떨어지지 않습니다.
서수를 이용해 배열을 인덱싱 하면 여러 문제가 발생할 수 있습니다.
배열에서 흔히 발생할 수 있는 문제들인데 EnumMap을 이용합시다.