비트 필드 열거 상수
•
열거형이 나오기 이전 열거한 값들 중 특정 상수값을 단독으로 사용하거나 여러 상수값들을 집합으로 사용해야하는 경우, 비트 시프팅을 통해 표현하는 비트 필드 열거 상수 방식을 사용했다.
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을 사용하면 해석하기 쉽고, 각 요소를 순회하기도 쉬우며 내부 변수의 크기를 자동으로 결정해주기 때문에 훨씬 깔끔하게 사용할 수 있다.