brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jun 26. 2018

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

#30 int 상수 대신 enum을 사용하자

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


#30 int 상수 대신 enum을 사용하자


열거형(enumerated type)은 상수들로 구성된 타입입니다.


enum 타입에 대해 알아보면 아래와 같습니다.

클래스 (변수처럼 보이는데 클래스입니다.)

public static final 필드를 이용해서 각 열거형 상수마다 하나의 인스턴스를 외부에 제공

접근 가능한 생성자가 없음 -> 실질적으로 final -> enum 인스턴스 생성 불가능 -> 상속 불가능
(외부에서 생성자를 통한 인스턴스 생성이 불가능하기 때문에 상속도 불가능합니다.)

인스턴스 생성을 제어 (접근 가능한 생성자가 없습니다.)

싱글톤을 일반화시킨 것으로써, 타입 안전 패턴을 언어 차원에서 지원
(직렬화, 리플렉션을 통한 인스턴스 생성도 불가능하기 때문에 싱글톤으로 이용할 수 있습니다.)


int 상수 대신 enum 사용을 추천하는 이유에 대해 알아보겠습니다.




int enum 패턴


Enum이 아닌 int 상수들을 이용해 int enum 패턴을 표현할 수 있습니다.

#01 int enum 패턴


하지만 아래처럼 서로 다른(MEDIA, DEVICE) 그룹 간 비교를 해도 컴파일 에러가 발생하지 않기 때문에 타입 안정성이 떨어지고, 그 외 편리성도 떨어지는 단점이 있습니다.

#02 타입 안전 보장 X


그리고 각각의 그룹에 대한 namespace를 제공하고 있지 않기 때문에, 그룹 별 관리도 별도로 처리해줘야 합니다.




enum


Media와 Device 그룹을 나눠서 enum을 생성할 수 있습니다.

#03 enum


enum은 int enum 패턴과 달리, 컴파일 시점에서 타입 안전을 제공합니다.

#04 타입 안정 보장 O


이 외에도 별도의 메서드나 필드를 추가할 수 있기 때문에 좀 더 유연하게 이용할 수 있습니다.


아래 코드는 enum 타입의 Media입니다.

name과 isFree 값을 가지고, 이를 내부 생성자를 통해 지정할 수 있습니다.

#05 데이터와 메서드를 갖는 enum 타입


enum에서 기본 제공하는 values 메서드를 통해 내부 상수를 배열 형태로 얻어온 다음, 다양하게 활용할 수 있습니다.

#06 Media enum




상수마다 다른 동작


상수를 switch 문을 이용해서 각기 다르게 동작하게 할 수 있습니다.

만약 새로운 상수를 추가하고 switch 문에 추가하지 않는다면, 런타임 에러가 발생할 수 있습니다.

#07 switch 문

추상 메서드(apply)를 enum 타입에 선언하고, 각 상수마다 직접 오버 라이딩하게 하면 새로운 상수 추가로 인한 문제를 해결할 수 있습니다.

#08 특정 상수 메서드 구현



int enum 패턴에 비해 enum 타입은 장점이 많습니다.

가독성도 좋고, 타입 안정성이 좋고, 보다 유연합니다.


하지만 성능이나 메모리 소모적인 측면에서는 int enum 패턴보다 좋지 않습니다.

https://brunch.co.kr/@oemilk/94


뭐든지 양면성이 있기 마련인데, 상황에 맞게 이용하면 될 거 같습니다.




매거진의 이전글 제네릭(Generics)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari