서로 관련된 상수들을 함께 묶어놓은 것.
Java는 타입에 안전한 열거형을 제공한다. (값, 타입 둘 다 체크함)
즉, 값은 같아도 타입이 다르면 비교불가 컴파일 에러가 발생한다.
열거형 상수의 비교에 '=='과 'compareTo()'만 사용 가능
비교 연산자 >, < 등은 사용 불가!
compareTo() 복습 : a.compareTo(b)
-> a가 크면 양수 반환
-> 같으면 0 반환
-> b가 크면 음수 반환
열거형의 조상 : java.lang.Enum
name() -> 열거형 상수의 이름을 문자열로 반환
ordinal() -> 열거형 상수가 정의된 순서를 반환(몇 번째로 선언되었나? 0부터 시작!)
T valueOf(Class<T> enumType, String name) -> 지정된 열거형에서, name과 일치하는 열거형 상수 반환
values(), valueOf()는 컴파일러가 자동으로 추가
values() : 모든 열거형 상수를 배열로 반환
valueOf() : 열거형 상수의 이름을 주면, 열거형상수 반환 == Kind.상수1과 같음
class Card {
// 열거형 정의 방법 : enum 열거형 이름 { 상수명1, 상수명2, ... }
// 기본적으로, 상수의 순서대로 0, 1, 2, 3... 의 값이 부여됨.
enum Kind { 상수1, 상수2, 상수3, 상수4 }
enum Value { 상수5, 상수6, 상수7 }
// 열거형 인스턴스 변수 선언
final Kind kind; // 타입이 int가 아닌 Kind임!
final Value value; // 열거형 안에 있는 값만 들어올 수 있음
void init() {
kind = Kind.상수1; // kind 변수에 Kind 열거형 안에 있는 상수1이라는 값 저장.
}
}
불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.
열거형의 생성자는, 묵시적으로 항상 private이다. 외부에서 객체 생성이 불가함!
enum Direction {
// ↓ 이거 사실 생성자임. 생성자 호출하는거임.
EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ; 를 추가해야 함.
private final int value; // 정수를 저장할 필드(인스턴스 변수)를 선언 해주어야 함.
// 생성자를 호출할 수 있으려면, 생성자가 있어야함.
// 열거형의 생성자는 항상 private!
Direction(int value) { this.value = value; } // 생성자 추가
public int getValue() { return value; }
}