본문 바로가기

Programming/JAVA

[Effective JAVA 3SE] item 36: 비트 필드 대신 EnumSet을 사용하라

비트 필드

  • 열거 값들이 단독이 아닌 집합으로 사용될 경우
    • 정수 열거 패턴(아이템 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을 사용할 수 있음