본문 바로가기

JAVA/Effective Java

item 36) 비트 필드 대신 EnumSet을 사용하라

728x90

비트 필드 : 비트별 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){...}
}

장점 : 비트 필드를 사용하면 비트별 연산 (AND ,OR)를 사용해 합집과 교집합 같은 집합 연산을 효율적으로 수행할수 있다.

 

단점 :

  • 비트 필드값이 그대로 노출되면 해석하기가 어렵다.
  • 원소 순회를 하기 어렵다.
  • 최대 몇비트가 필요한지 API 작성시 미리 예측하여 적절한 타입을 선택해야한다.(int, long)

EnumSet

 

Java 7에 추가된 java.util 클래스로 열거타입의 값으로 구성된 집합으로 Set 인터페이스를 완벽히 구현한다.

원소가 64개 이하면 Enumset 전체를 long 변수 하나로 표현, 64개 이상이면 Set으로.

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

    public void applyStyles(Set<Style> styles) { //객체는 인터페이스 타입으로 참조하라 - 아이템 64)
	/*메소드 구현*/
}

}