열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있다.
class Card{
enum Kind { clover, heart, diamond, spade}
enum Value { two, three, four}
final Kind kind;
final Value value;
이런게 열거형의 방식인데, 따로 값을 지정해주지 않아도, 자동적으로 0부터 시작하는 정수값이 할당된다.
ex) clover = 1 , heart = 2, diamond = 3 ....
if(Card.CLOVER == Card.TWO) // true지만, false여야 의미상 맞다.
왜냐면 카드의 무늬와 숫자는 비교 대상이 아니라서..
열거형을 이용해 상수를 정의한 경우, 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생.
if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러 타입이 달라서 비교 불가
열거형 정의
enum 열거형이름 { 상수명 1, 상수명 2, .....}
열거형에 정의된 상수를 사용한느 방법
열거형이름.상수형
열거형 상수간의 비교에는 '==' 사용가능
그러나, < > 이러한 비교 연산자는 사용불가.
compareTo()는 사용가능.
compareTo()?
두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환
열거형 상수의 값이 불규칙적인 경우
enum Direction{ EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
이런식으로, 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해줘야 함.
*주의할점 - 열거형 상수를 먼저 모두 정의 후 다른 멤버를 추가해야함
enum Direction {
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
private final int value; // 정수를 저장할 필드(인스턴스 변수) 추가
Direction(int value) { this.value = value; } // 생성자 추가
public int getValue() {return value;}
열거형의 인스턴스 변수는 반드시 final이어야 한다는 제약은 없지만, value는 열거형 상수의 값을 저장하기 위한 것이므로 final을 붙임.
그리고 외부에서 이 값을 얻을 수 있게 getValue()도 추가
열거형 Direction d = new Direction(1); // 에러. 열거형의 생성자는 외부에서 호출x
열거형 Direction에 새로운 생성자가 추가되었지만, 위와 같이 열거형의 객체를 생성할 수 없다. 왜냐면 열거형의 생성자는 제어자가 묵시적으로 private이기 때문.