기존에는 상수를 정의할 때 final String mon = "월요일"
같은 형식으로 정했다면,
enum day {"월요일","화요일"...}
처럼 하나의 집합 형식으로 선언이 가능하다.
이렇게 쓰면 변수를 쭉 선언한 상태보다 가독성과 연관성을 한눈에 알아보기 쉬워지고, '타입에 의한 열거형' 이기 때문에 상수의 값이 같더라도 타입까지 체크해주기 때문에 좀 더 안전하게 변수 사용이 가능해진다.
// 클래스 상수로만 선언했을 때
class Card {
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIAMOND = 2;
static final int SPADE = 3;
static final int TWO = 0;
static final int THREE = 1;
static final int FOUR = 2;
}
// enum 을 활용했을 때
class Card{
enum Kind {CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO, THREE, FOUR}
}
위와 같은 상황일 때,
if(Card.CLOVER == Card.TWO) // true 가 뜨지만 개발자의 의도와는 다름
if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러. 타입 불일치
이런 식으로 타입의 안전함을 얻을 수 있어서 개발자의 의도에 좀 더 가까운 코드가 가능해진다.
Enum 클래스에 정의된 ordinal()은 열거형 상수가 정의된 순서를 반환한다. (마치 index 처럼)
정의된 순서가 아니라 각 상수에 값을 지정해 주고 싶으면 아래처럼 구현하면 된다.
enum Direction {
//상수(값)으로 적고 끝에 ; 붙여주기
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
private final int value; //정수를 저장할 인스턴스 변수 추가
// 생성자 추가.
// 제어자는 기본적으로 private
// 외부에서 Direction d = new Direction(1) 같은 방식으로 호출 불가
Direction(int value) {
this.value = value;
}
public int getValue(){
return value;
}
}