[이펙티브 자바] 아이템 36. 비트 필드 대신 EnumSet을 사용하라

비트 필드 열거 상수

비트 열거 상수

public class Text {
    public static final int STYLE_BOLD = 1 << 0; // 1
    public static final int STYLE_ITALID = 1 << 1; // 2
    public static final int STYLE_UNDERLINE = 1 << 2; // 4
    public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8
    
    public void applyStyles(int styles) { ... }
}
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

예전에는 열거 값들이 집합으로 사용될 경우 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해왔다. 비트별 OR를 이용해 여러 상수를 하나의 집합으로 모을 수 있고, 이런 집합을 비트 필드라 한다.

단점

하지만 비트 필드는 정수 열거 상수의 단점을 그대로 가진다. 또한 비트 필드 값은 해석하기 어렵고, 비트 필드 하나에 녹아 있는 모든 원소를 순회하기도 어렵다. 또한 최대 몇 비트가 필요한지 API 작성시 미리 예측해서 선택해야 한다.

대안 - EnumSet

EnumSet 클ㄹ스는 열거 타입 상수의 값으로 구성된 집합을 효과적으로 표현해준다. Set 인터페이스를 완벽히 구현하며, 타입 안전하고, 다른 어떤 Set 구현체와도 함께 사용할 수 있다.

EnumSet 내부는 비트 벡터로 구현되어있다. 원소가 총 64개 이하면 EnumSet 전체를 long 변수 하나로 표현한다.

EnumSet

public class Text {
    puiblic enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }
    
    public void applyStyles(Set<Style> styles) { ... }
}

좋은 웹페이지 즐겨찾기