본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 비트(bit) 필드 대신 EnumSet 을 사용하자.

by 돼지왕 왕돼지 2016. 12. 26.
반응형

 [Effective Java] 비트(bit) 필드 대신 EnumSet 을 사용하자.


2, 64개 이하, Bit, Collections, constant, enum, enumset, int enum, int enum 상수, long, n승, of, removeall, retainAll, unmodifiableset, 간결함, 교집합, 단점, 불변 enumset, 비트 값, 비트 백터, 비트 벡터, 비트 필드, 상수, 성능, 숫자 출력, 에러, 에로사항, 유일한 단점, 장점, 조작, 집합 값, 차례대로 반복 처리, 합집합, 효율적


-
보통 비트 값을 constant 로 사용할 때 아래와 같이 int enum 패턴을 사용하여 각 상수에 2의 n승을 대입한다.

// 비트 필드
public static final int STYLE_BOLD = 1 << 0;
public static final int STYLE_ITALIC = 1 << 1;
...


-
비트 필드를 이용하면 합집합이나 교집합과 같은 집합 연산을 효율적으로 수행할 수 있다.
그러나 비트 필드는 int enum 상수의 모든 단점을 갖는다.
그리고 숫자로 출력될 때 int enum 상수보다 훨씬 더 알아보기 어렵다.
비트 필드로 표현된 모든 요소를 차례대로 반복 처리할 수 있는 방법이 없다.


-
EnumSet 은 하나의 enum 타입에서 추출한 집합 값을 효율적으로 나타낼 수 있다.
내부적으로 각 EnumSet 은 비트 벡터로 표현된다.
만일 enum 타입이 64개 이하 요소라면 ( 대부분 ), 그 EnumSet 전체가 하나의 long 타입으로 표현된다.
따라서 비트 필드의 성능과 견줄만하다.
removeAll 이나 retainAll 처럼 요소를 한꺼번에 처리하는 경우에는 우리가 수동으로 비트 필드를 처리할 때처럼 비트 연산을 사용해서 구현된다.
그러나 우리가 비트 값을 조작할 때의 어려움이나 에러 발생 가능성은 없다.
EnumSet 이 다 대신 해주기 때문이다.


-
EnumSet 은 쉽게 Set 을 생성할 수 있는 풍부한 static 팩토리 메소드들을 제공한다.
예를 들면, EnumSet.of( Style.BOLD, Style.ITALIC );



Summary


EnumSet 은 비트 필드가 갖는 간결함과 성능은 물론, enum 자체의 많은 장점들을 갖는다.
EnumSet 의 유일한 단점은 불변 EnumSet 을 생성할 수 없다는 것.
Collections.unmodifiableSet 메소드를 사용해 EnumSet 을 불변으로 사용할 수 있겠지만, 간결함이나 성능 면에서 에로사항이 생길 수는 있다.





반응형

댓글