brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jul 09. 2018

열거형(Enum)과 주석(Annotation)

#33 서수 인덱스 대신 EnumMap을 사용하자

Effective Java - 열거형(Enum)과 주석(Annotation)


#33 서수 인덱스 대신 EnumMap을 사용하자


서수를 인덱스로 이용한 배열을 볼 수 있습니다.


아래 코드는 허브를 Type(일 년생, 이년생, 다년생) 별로 구분하는 클래스입니다.

#01 Herb class


이를 각 Type(일 년생, 이년생, 다년생) 별로 하나씩 Set<Herb>을 만들어서, 식물들을 Type에 맞게 적합한 Set<Herb>에 넣어야 합니다.


이때 Set<Herb> 배열(Set<Herb>[])을 만드는데, 인덱스로 Type의 서수(ordinal)를 이용합니다.

#02 Set<Herb> 배열


이를 직접 구현하면 아래와 같습니다.

#03 서수 index array


배열은 기본적으로 제네릭과 호환되지 않습니다.

따라서 unchecked 경고 메시지가 나타나고 타입 안정성에 문제가 발생할 수 도 있습니다.

게다가 배열이기 때문에 잘못된 인덱스 값을 이용하면 ArrayIndexOutOfBoundsException 예외가 발생할 수 도 있습니다.




EnumMap


EnumMap을 이용하면 좀 더 쉽게 구현할 수 있습니다.


#04 EnumMap<Herb.Type, Set<Herb>>


Map은 제네릭과 호환되기 때문에 배열에서 발생할 수 있는 타입 안정성의 문제가 없습니다.

그리고 인덱스를 이용하지 않으므로 인덱스 예외가 발생하지도 않습니다.

당연한 얘기지만 Map에서 제공하는 다양한 기능도 이용할 수 있습니다.


s#04 EnumMap>#05 EnumMap<Herb.Type, Set<Herb>>#04 EnumMap>


배열이 아닌 Map을 이용하기 때문에 성능 이슈를 우려할 수 있는데, EnumMap 내부적으로 배열을 이용하고 있습니다.

따라서 배열을 이용한 구현에 비해 성능상으로 떨어지지 않습니다.

#06 EnumMap




서수를 이용해 배열을 인덱싱 하면 여러 문제가 발생할 수 있습니다.

배열에서 흔히 발생할 수 있는 문제들인데 EnumMap을 이용합시다.

매거진의 이전글 열거형(Enum)과 주석(Annotation)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari