728x90
1. 비트 필드란?
비트 필드 : 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있는 집합
public class Text{
public static final int STYLE_BOLD = 1 << 0; // 1
public static final int STYLE_ITALIC = 1 << 1; // 2
public static final int STYLE_UNDERLINE = 1 << 2; // 4
public static final int STYLE_STRIKETHROUGH = 1 << 3; // 5
// 매개변수 styles는 0개 이상의 STYLE_ 상수를 비트별 OR 한 값
public void applyStyle(int styles){...}
}
비트 필드의 문제점
- 정수 열거 상수의 단점을 그대로 지님
- 비트 필드 값이 그대로 출력되면 단순 정수 열거 상수 출력보다 해석이 어렵다
- 비트 필드 하나에 녹아있는 모든 원소 순회도 까다롭다
- 최대 몇 비트가 필요한지 API 작성시 미리 예측해야한다.
2. 비트 필드의 해결 : EnumSet
열거 타입 상수의 값으로 구성된 집합을 효과적으로 표현한다
내부에서 비트 벡터로 구현되어있어 성능도 비트 필드에 비견된다.
EnumSet javadoc 내용
- enum type을 구현할 때 특화된다.
- Enum set들은 bit vector들로 표현된다 : 극도로 시간과 공간 복잡도에서 효율적이다 (bit flag)
- 인자가 enum set이라면 containsAll, retainAll 같은 대형 연산에서도 매우 빠르다.
import java.util.*;
// 코드 36-2 EnumSet - 비트 필드를 대체하는 현대적 기법 (224쪽)
public class Text {
public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}
// 어떤 Set을 넘겨도 되나, EnumSet이 가장 좋다.
public void applyStyles(Set<Style> styles) {
System.out.printf("Applying styles %s to text%n",
Objects.requireNonNull(styles));
}
// 사용 예
public static void main(String[] args) {
Text text = new Text();
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
}
}
EnumSet을 건네리라 짐작되는 상황이라도 이왕이면 인터페이스로 받는게 좋은 습관이다
'Dev Book Review > Effective Java' 카테고리의 다른 글
[Effective Java] item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 (0) | 2020.06.27 |
---|---|
[Effective Java] item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (1) | 2020.06.27 |
[Effective Java] item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) | 2020.06.27 |
[Effective Java] item 34. int 상수 대신 열거 타입을 사용하라 (2) | 2020.06.27 |
[Effective Java] Chapter 5: 제네릭 (0) | 2020.05.19 |