[Effective Java]item36. 비트 필드 대신 EnumSet을 사용하라

최강일·2024년 8월 14일
0

Effective Java

목록 보기
14/17

비트 필드란?

비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있는 집합

비트 필드 예제

여러 컬러가 있고 text에 여러 style을 적용

public class Text{
  public static final int STYLE_BOLD = 1 << 0; // 1
  public static final int STYLE_ITALIC = 1 << 1; // 2

  //0개 이상의 STYLE_* 상수를 비트별 OR한 값
  public void applyStyle(int styles){...}
}

//사용 예
text.applyStyles(STYLE_BOLD | STYLE_ITALIC); // 비트 필드

비트 필드의 문제점

  • 정수 열거 상수의 단점을 그대로 지님(ex. 1이 "굵게"를 의미하는지, "기울임"을 의미하는지 코드만 보고는 알기 어려움)
  • 비트 필드 값이 그대로 출력되면 단순 정수 열거 상수 출력보다 해석이 어렵다.(ex. 1이 "굵게"를 의미하는지, "기울임"을 의미하는지 어려움)
  • 비트 필드 하나에 녹아있는 모든 원소 순회도 까다롭다(ex. 어떤 원소가 있는지 알려면 비트 단위 연산 필요. 이에비해 EnumSet은 단순 for루프)

비트 필드의 해결책 : EnumSet

//비트 필드를 대체하는 현대적 기법
public class Text {
    public enum Style {BOLD, ITALIC}

    // 어떤 Set을 넘겨도 되나, EnumSet이 가장 좋다.
    public void applyStyles(Set<Style) styles) { ... }
}

// 사용 예
public static void main(String[] args) {
    Text text = new Text();
    text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
}

결론

열거타입의 집합을 사용해야한다면 EnumSet을 사용하도록 하자.
내부에서 비트 벡터로 구현되어있어 성능도 비트 필드에 비견된다.

profile
Search & Backend Engineer

0개의 댓글