-
Item 36. 비트 필드 대신 EnumSet을 사용하라Book/Effective Java 3E 2023. 2. 18. 09:00반응형
비트 필드(bit field)
열거한 값들이 주로 집합으로 사용될 경우, 예전에는 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴을 사용해 왔습니다.
// 코드 36-1 비트 필드 열거 상수 - 구닥다리 기법! 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; // 8 // 매개변수 styles는 0개 이상의 STYLE_ 상수를 비트별 OR한 값이다. public void applyStyles(int styles) {...} }
다음과 같은 식으로 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있으며, 이렇게 만들어진 집합을 비트 필드(bit field)라 합니다.
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
비트 필드를 사용하면 비트별 연산을 사용해 합집합과 교집합 같은 연산을 효율적으로 수행할 수 있습니다. 하지만 비트 필드는 정수 열거 상수의 단점을 그대로 지니며, 해석이 어렵고 모든 원소를 순회하기도 까다롭습니다.
EnumSet
다음은 앞의 예를 열거 타입과 EnumSet을 사용해 수정한 코드입니다.
package effectivejava.chapter6.item36; import java.util.*; // 코드 36-2 EnumSet - 비트 필드를 대체하는 현대적 기법 public class Text { public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH} // 어떤 Set을 넘겨도 되나, EnumSet이 가장 좋다. public void applyStyles(Set<Style> styles) { System.out.printf("Applying styles %s to text%n", Objects.requireNonNull(styles)); } // 사용 예 public static void main(String[] args) { Text text = new Text(); text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); } }
열거할 수 있는 타입을 한데 모아 집합 형태로 사용한다고 해도 비트 필드를 사용할 이유는 없다.
EnumSet 클래스가 비트 필드 수준의 명료함과 성능을 제공하고 Item 34에서 설명한 열거 타입의 장점까지 선사하기 때문이다.
[참고 정보]
이펙티브 자바 Effective Java 3/E 도서 [조슈아 블로크 저]
반응형'Book > Effective Java 3E' 카테고리의 다른 글
Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) 2023.02.24 Item 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) 2022.12.29 Item 34. int 상수 대신 열거 타입을 사용하라 (0) 2022.12.28 Item 33. 타입 안전 이종 컨테이너를 고려하라 (1) 2022.12.23 Item 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라 (0) 2022.12.20