본문 바로가기

이펙티브 자바

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

비트 필드 : 정수 상수의 집합을 표현하는 방법 중 하나로, 각 비트를 특정 상수에 대응시키는 방식. 하지만 비트 필드는 가독성이 낮고, 오류가 발생하기 쉽다.

 

public class FontExample {
    // 글꼴 종류를 비트 필드로 표현
    public static final int PLAIN    = 1 << 0;  // 0001
    public static final int BOLD     = 1 << 1;  // 0010
    public static final int ITALIC   = 1 << 2;  // 0100
    public static final int UNDERLINE= 1 << 3;  // 1000

    // 비트 필드로 표현된 글꼴 스타일 설정 메서드
    public void setStyle(int style) {
        // 스타일 설정
    }

    // 비트 필드로 표현된 글꼴 스타일 반환 메서드
    public int getStyle() {
        // 스타일 반환
        return 0;
    }
}

 

EnumSet : 열거형(Enum)을 기반으로 하는 집합(Set) 구현체 중 하나. 이 클래스는 열거 상수(Enum 상수) 집합을 효율적으로 저장하고 다룰 수 있도록 최적화되어 있다.

import java.util.EnumSet;

public class FontExample {
    // 글꼴 종류를 열거형으로 정의
    public enum Style {
        PLAIN, BOLD, ITALIC, UNDERLINE
    }

    // EnumSet으로 표현된 글꼴 스타일 설정 메서드
    public void setStyle(EnumSet<Style> styles) {
        // 스타일 설정
    }

    // EnumSet으로 표현된 글꼴 스타일 반환 메서드
    public EnumSet<Style> getStyle() {
        // 스타일 반환
        return EnumSet.noneOf(Style.class);
    }
}

 

결론 : 열거할 수 있는 타입을 한데 모아 집합 형태로 사용한다고 해도 비트 필드를 사용할 이유는 없다. EnumSet 클래스가 비트 필드 수준의 명료함과 성능을 제공하고 열거 타입의 장점까지 선사하기 때문이다. EnumSet의 유일한 단점이라면 불변 EnumSet을 만들 수 없다는 것이다.