Programming/JAVA
[Effective JAVA 3SE] item 36: 비트 필드 대신 EnumSet을 사용하라
sky Jeong
2021. 7. 19. 17:03
비트 필드
- 열거 값들이 단독이 아닌 집합으로 사용될 경우
- 정수 열거 패턴(아이템 34)를 사용함 (223 페이지 코드 36-1)
- 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있음
이로 만들어진 집합을 비트 필드(bit filed)라고 함
- 비트 필드의 사용
- 비트별 연산으로 합집합과 교집합 같은 집합 연산의 효율적 수행 가능
- 하지만.. 비트 필드의 문제를 안고 있음
- 비트 필드 값이 그대로 출력될 경우 단순 정수 열거 상수 추력시보다 해석하기 훨씬 어려움
- 모든 원소를 순회하기 까다로움
- 최대 몇 비트가 필요한지 API 작성 시 미리 예측해 선택해야 함
(API를 수정하지 않고 비트 수를 더 늘릴 수 없기 때문)
- 현재 비트 필드보다 더 나은 대안이 존재함
EnumSet Class
- 장점
- java.util 패키지의 EnumSet 클래스는 열거 타입 상수의 값으로 구성된 집합을 효과적으로 표현함
- Set 인터페이스 완벽 구현
- 안전한 타입
- 다른 어떤 Set 구현체와도 함께 사용 가능
- 내부적으로 removeAll, retainAll과 같은 대량 작업은 비트를 효율적으로 처리할 수 있는 산술 연산을 써 구현
- 난해한 작업을 EnumSet이 다 처리하기에 비트를 직접 다루며 겪는 오류들에서 해방됨
Git hub에 커밋한 예제 코드 기반으로 작성하기
(회사에서 작성한 코드가 커밋 안돼요 ㅠ 큰일이네..)
- 코드 예제 36-2
- applyStyles에서 Set 인터페이스로 구현체를 받는 것은 코드 교체성이 용이한 인터페이스로 받는 것이 바람직하기 때문 (아이템 64에 따름)
핵심 정리
- 열거 타입을 한데 모아 집합 형태로 사용한다고 해도, 비트 필드를 사용할 이유는 없음
- EnumSet 클래스가 비트 필드 수준의 명료함과 성능을 제공함
아이템 34에서 설명한 열거 타입의 장점까지 선사함 - EnumSet 단점 (자바 11까지의 기준)
- 불변 EnumSet을 만들 수 없다는 것
- 자바 11이하의 버전은 Collections.unmodifiableSet으로 감싸 불변 EnumSet을 사용할 수 있음