정리

열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입니다. 정수열거패턴(int enum pattern)은 단점이 많다. 타입안전 보장이 안되고 표현력도 좋지 않다. 문자열려거패턴(string enum pattern)은 더 나쁘다. 상수의 의미를 출력할 수 있다는 좋지만, 경험이 부족한 프로그래머가 문자열 상수의 이름 대신 문자열 값을 그대로 하드코딩하게 만들기 때문이다. 다행이 자바는 열거패턴의 단점을 말끔히 씻어주는 동시여 여러 장점을 주는 열거(enum) 타입이 있다. 자바의 열거 타입은 완전한 형태의 클래스라서 다른언어의 열거타입보다 훨씬 강력하다. 열거타입은 클래스이며, 상수하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. 열거타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final 이다. 열거타입은 싱글턴을 일반화한 형태라고 볼수 있다. 열거 타입에는 임의의 메서드나 필드를 추가할 수 있고 임의의 인터페이스를 구현하게 할 수 도 있다. 열거 타입 상수 각각을 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스필드에 저장하면 된다. 열거타입은 근복적으로 불변이라 모든 필드는 final 이어야 한다. 필드를 public 로 선언해도 되지만, private 를 두고 별도의 접근자 메서드를 두는게 낫다.

  public enum Operation {
    PLUS  {public double apply(double x, double y){ return x + y; }},
    MINUS {public double apply(double x, double y){ return x 0 y; }};
    
    public abstract double apply(double x, double y);


  }

기존 열거 타입에 상수별 동작을 혼합해 넣을때는 switch 문이 좋은 선택이 될수 있다.

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

핵심정리

열거 타입은 확실히 정수 상수보다 뛰어나다. 더 읽기 쉽고 안전하고 강력하다. 대다수 열거 타입이 명시적 생성자나 메서드 없이 쓰이지만 각 상수를 특정 데이터와 연결 짓거나 상수마다 다르게 동작하게할때는 필요하다. 드물게는 하나의 메서드가 상수별로 다르게 동작해야 할때도 있다. 이런 열거 타입에서는 switch 문 대신 상수별 메서드 구현을 사용하자. 열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거 타입 패턴을 사용하자.