Item 36. 비트 필드 대신 EnumSet을 사용하라

생성일
2023/07/27 00:28
챕터
6장 - 열거 타입과 애너테이션

비트 필드 열거 상수

열거형이 나오기 이전 열거한 값들 중 특정 상수값을 단독으로 사용하거나 여러 상수값들을 집합으로 사용해야하는 경우, 비트 시프팅을 통해 표현하는 비트 필드 열거 상수 방식을 사용했다.
public class Text { public static final int STYLE_BOLD = 1 << 0; public static final int STYLE_INTALIC = 1 << 1; public static final int STYLE_UNDERLINE = 1 << 2; public static final int STYLE_STRIKETHROUGH = 1 << 3; public void applyStyles(int styles) { ... } }
Java
복사
이와 같은 비트 필드 열거 상수를 사용하여
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
Java
복사
이와 같이 비트 연산을 진행하여 합집합이나 교집합 같은 집합 연산을 효율적으로 수행하기 위해 사용했었다.
하지만 이런 비트 필드 열거 상수는 비트 필드 값이 그대로 출력되면 단순한 정수 열거 상수보다 해석하기 훨씬 어렵고, 비트 하나에 녹아 있는 모든 원소를 순회하기도 까다롭다. 또한 최대 몇 비트가 필요한지를 미리 예측해 선언할 타입을 선택해야 한다.

EnumSet

위와 같은 비트 필드의 단점들은 열거형과 EnumSet을 함께 사용하면 해결된다.
public class Text { public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHORUGH } // 아무 Set을 사용해도 되지만, EnumSet이 가장 좋다. public void applyStyles(Set<Style> style) { ... } }
Java
복사
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
Java
복사
이렇게 EnumSet을 사용하면 해석하기 쉽고, 각 요소를 순회하기도 쉬우며 내부 변수의 크기를 자동으로 결정해주기 때문에 훨씬 깔끔하게 사용할 수 있다.