본문 바로가기
IT/Java

이펙티브 자바 6장 - enum

by 봉즙 2019. 12. 12.

int 상수 대신 열거 타입을 사용하라

열거 타입 자체는 클래스이며 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개하며 열거 타입은 밖에서 접근 할 수 있는 생성자를 제공하지 않으므로 final이다. 인스턴스를 직접 확장하거나 생성할 수 없으므로 하나씩만 존재하는 것ㅇ이 보장된다. 열거 타입은 근본적으로 불변이기에 모든 필드는 final이여야한다.
  기존 열거 타입에 상수별 동작을 혼합해 넣는 경우 switch문을 사용하는 것이 좋다.

사용시기 필요한 원소를 컴파일 타임에 다 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하며, 열거 타입에 정의된 상수 개수가 영원히 고정 불변일 필요는 없다.

 

 

ordianl 메서드 대신 인스턴스 필드를 사용

열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고, 인스턴스 필드에 저장하여야 더미를 발생하는 일을 줄일 수 있다. 대부분의 프로그래머는 사용할 일이 없으며 열거타입 기반의 범용자료구조에 사용할 목적으로 설계되엇다.

 

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

열거할 수 있는 타입을 모아 사용하더라도 비트필드를 사용하는 것은 좋지 않으며 java.util 패키지의 Enumset 클래스가 비트 필드 수준의 명료함과 성능을 제공하며 열거 타입의 장점인 안정성을 보장해준다. EnumSet은 불변을 만들 수 없는 것이 단점이다.

ordinal 인덱싱 대신 EnumMap을 사용하라

배열의 인덱스를 얻기 위해 ordinal을 사용하는 것은 좋지않다. 배열은 제네릭과 호환되지 않아 비검사 형변환을 수행해야 하기때문이다. EnumMap을 사용하면 원래와 성능은 거의 동일하며 짧고 안전하다.

 

확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

열거 타입 자체는 확장하는 것이 불가능하다. 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 사용해 같은 효과를 낼 수 있다. 인터페이스 기반으로 작성한다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대체해 사용할 수 있다.

'IT > Java' 카테고리의 다른 글

이펙티브 자바 - 7장 람다와 스트림  (0) 2020.01.03
이펙티브 자바 6장 - enum 2  (0) 2020.01.03
이펙티브 자바 5장 - 제네릭 2  (0) 2019.12.05
이펙티브 자바 5장  (0) 2019.12.03
이펙티브 자바 4장 -2  (0) 2019.12.02

댓글