Item36 - 비트 필드 대신 EnumSet을 사용하라

2023. 12. 12. 21:40Book/이펙티브 자바

열거한 값들이 주로 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 제곱을 할당한 정수 열거 패턴을 사용해왔다.

 

public static final int STYLE_BOLD = 1;           //1
public static final int STYLE_ITALIC = 1 << 1;    //2
public static final int UNDERLINE = 1 << 2;       //4

public void applyStyles(int styles) {

}

 

다음과 같은 식으로 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있었고 이를 비트 필드라 한다.

public static void main(String[] args) {
    text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
}
=> 3 (1+2)

 

비트 필드를 사용하면 비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다. 하지만 정수 열거 상수의 단점과 다음과 같은 문제가 더 있다.

 

 1. 해석하기 어렵다

 2. 비트 필드에 녹아 있는 원소를 순회하기가 까다롭다.

 3. 최대 몇 비트가 필요한지를 API 작성 시 미리 예측하고 적절한 타입을 선택해야 한다. 

 

하지만 더 나은 대안이 있다. EnumSet 클래스를 사용하는 것이다.

public class Text {

    public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }

    
    public void applyStyles(Set<Style> styles) {
        
    }
    public static void main(String[] args) {
        Text text = new Text();
        text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
    }
}