열거 자료형은 고정 개수의 상수들로 값이 구성되는 자료형이다. 자바에는 enum이라는 자료형이 도입되기 전에는 아래와 같이 통상 int 형의 상수를 정의해서 열거 자료형을 흉내냈다.
이 기법은 INT ENUM 패턴으로 알려져 있는데, 단점이 많다. int 형의 값으로 상수를 비교하기 때문에 int형 값이 중복되는 경우 제대로 된 비교가 되지 않는다. 또한 이러한 상수는 출력하거나 디버거로 봤을 경우 의미없는 숫자로만 보인다. 또한 int enum 깨지기 쉬운데 그 이유는 상수는 컴파일 시점 상수이기 떄문에 상수를 사용하는 클라이언트 코드와 함께 컴파일 된다. 상수의 int 값이 변경되면 클라이언트도 다시 컴파일해야 한다.
자바의 enum 자료형 이면에 감춰진 기본적 아이디어는 단순하다. 열거 상수별로 하나의 객체를 public static final 필드 형태로 제공하는 것이다. enum 자료형으로 새로운 객체를 생성하거나 계승을 통해 확장할 수 없기 때문에, 이미 선언된 enum 상수 이외의 객체는 사용할 수 없다. 즉 enum 자료형의 개체수는 엄격이 통제된다는 것이다.
또한 enum 자료형은 컴파일 시점 형 안전성을 제공한다. Apple형의 인자를 받는다고 선언한 메서드는 반드시 Apple 값 중 하나의 값만 받을 수 있다. 엉뚱한 자료형의 값을 인자로 전달하려 하면, 자료형 불일치 때문에 컴파일 할 떄 오류가 발생한ㄷ.ㅏ
enum 자료형은 같은 이름으 ㅣ상수가 평화롭게 공존할 수 있도록 한다. 이름 공간이 분리되기 떄문이다. 상수를 추가하거나 순서를 변경해도 클라이언트는 다시 컴파일할 필요가 없다. 상수를 제공하는 필드가 enum 자료형과 클라이언트 사이에서 격리 계층 구실을 하기 때문이다. 또한 enum 자료형은 toString 메서드를 통해 인쇄 가능 문자열로 쉽게 변환할 수 있다.
enum 자료형은 임의의 메서드나 필드도 추가할 수 있도록 한다. 임의의 인터페이스를 구현할 수도 있다. 그렇다면 enum 자료형에 메서드나 필드를 추가하는 이유는 무엇일까? 상수에 데이터를 연관시키면 좋겠다는 생각이 들어서인데, enum 자료형은 상수 묶음에서 출발해서 점차로 완전한 기능을 갖춘 추상화 단위로 진화해 나갈 수 있다.
일반적으로 유용하게 쓰일 enum이라면, 최상위 클래스로 선언해야 한다. 특정한 최상위 클래스에서만 쓰이는 enum이라면 해당 클래스의 멤버 클래스로 선언해야 한다.
요약
enum 자료형은 int 상수에 비해 많은 중요한 장점을 가지고 있다. enum을 사용한 코드는 가독성도 높고, 안전하며, 더 강력하다. 상당수의 enum은 생성자나 멤버가 필요없으나, 데이터 또는 그 데이터에 관계된 메서드를 추가해서 기능을 향상 시킬수도 있다. 또한 동일한 메서드가 상수별로 다르게 동작하도록 만들어야 하는 enum도 구현 가능하다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[열거형과 어노테이션]규칙32. 비트 필드대신 EnumSet을 사용하라 (0) | 2017.05.03 |
---|---|
[열거형과 어노테이션]규칙31. ordinal 대신 객체 필드를 사용하라 (0) | 2017.05.03 |
[제네릭]규칙29. 형 안전 다형성 컨테이너를 쓰면 어떨지 따져보라 (0) | 2017.05.03 |
[제네릭]규칙28. 한정적 와일드카드를 써서 API유연성을 높여라 (0) | 2017.05.03 |
[제네릭]규칙27.가능하면 제네릭 메서드로 만들 것 (0) | 2017.05.03 |