서로 관련된 상수를 편리하게 선언하기 위한 것
Java의 열거형은 C언어의 열거형과 다르게 열거형이 갖는 값 뿐만 아니라 타입까지 관리한다.
기존의 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야한다. 하지만 열거형 상수를 사용하면 기존의 소스를 다시 컴파일하지 않아도 된다.
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;
final int kind;
final int num;
}
//-------------------------------------------------->
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE } //열거형 Kind를 정의
enum Value { TWO, THREE, FOUR } //열거형 Value를 정의
final Kind kind; //타입이 int가 아닌 Kind
final Value value;
}
if (Card.CLOVER == Card.TWO) //true지만 false이어야 의미상 맞다.
if (Card.Kind.CLOVER == Card.Value.TWO) //false. 같은 값이지만 타입이 다르다.
열거형 정의 -> 괄호{} 안에 상수의 이름을 나열한다.
enum 열거형이름 { 상수명1, 상수명2, ... }
//동서남북 정의
enum Driection { EAST, SOUTH, WEST, NORTH}
열거형 사용 -> 열거형이름.상수명으로 하고 클래스의 static 변수를 참조하는 것과 동일하다.
class Unit {
int x, y; //유닛의 위치
Direction dir; //열거형을 인스턴스 변수로 선언
void init() {
dir = Direction.EAST; //유닛의 방향을 EAST로 초기화
}
}
열거형 상수간의 비교 -> ==
<, >와 같은 비교 연산자는 사용할 수 없고, compareTo() 사용.
//compareTo()는 두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다.
if (dir == Direction.EAST) {
x++;
} else if (dir > Direction.WEST) { //에러. 열거형 상수에 비교연산자 사용 불가
} else if (dir.compareTo(Direction.WEST) > 0) {} //OK. compareTo()는 사용 가능
//switch문의 조건식에 사용
void move() {
switch(dir) {
case EAST : x++; //Direction.EAST라고 쓰면 안된다.
break;
case WEST : x--;
break;
case SOUTH : y++;
break;
case NORTH : y--;
break;
}
}
case문에 열거형의 이름은 적지 않고 상수의 이름만 적어야 한다는 제약이 있다.
열거형 Direction에 정의된 모든 상수를 출력
Direction[] dArr = Direction.values();
for (Direction d : dArr) //for (Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
values() : 열거형의 모든 상수를 배열에 담아 반환해준다. 이 메서드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해 준다.
| 메서드 | 설명 |
|---|---|
| Class getDeclaringClass() | 열거형의 Class객체를 반환한다. |
| String name() | 열거형 상수의 이름을 문자열로 반환한다. |
| int ordinal() | 열거형 상수가 정의된 순서를 반환한다. (0부터 시작) |
| T valueOf(Class enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다. |
valueOf 메서드는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.
static E values()
static E valueOf(String name)
//이 메서드는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.
Direction d = Direction.valueOf("WEST");
System.out.println(d); //WEST
System.out.println(Direction.WEST == Direction.valueOf("WEST")); //true