열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것
-> 여러 상수를 정의 할 때 사용하면 좋다
class Card{
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIAMOND = 2;
....
}
class Card{
enum Kind;
enum Value;
final Kind kind;
final Value value;
}
enum 열거형이름 {상수1, 상수2, 상수3...}
enum Direction {EAST, SOUTH, WEST, NORTH}
정의된 상수를 사용하는 방법은 열거형 이름.상수명 이다
Direction.EAST;
| 메서드 | 설명 |
|---|---|
Class<T> getDeclaringClass() | 열거형의 Class 객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환 |
T valueOf(Class<T> enumType, String name) | 열거형 상수가 정의된 순서를 반환 |
-> 이외에도 values()처럼 컴파일러가 자동으로 추가해주는 메서드가 있다
- static E values()
- static E valuesOf(String name)
==를 사용할 수 있다. -> 빠른성능 제공compareTo() 사용 가능Direction d = Direction.valueOf("WEST");
System.out.println(d); //WEST
System.out.println(Direction.WEST==Direction.valueOf("WEST")); //true
열거형 상수형의 값이 불연속적인 경우 상수의 이름 옆에 괄호와 함게 원하는 값을 적는다.
enum Direction {EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
-> 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 추가해야함
-> 상수 값에 여러 값을 넣을수도 있다.
package chapter3.enumm;
public enum Direction {
EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^");
private static final Direction2[] dArr = Direction.values();
private final int value; //인스턴스 변수
private final String symbol;
Direction(int value, String symbol) {
this.value = value; //생성자
this.symbol = symbol;
}
public int getValue() {
return value;
}
public String getSymbol() {
return symbol;
}
}
enum TransPortation 구현하면서 알아보기
package chapter3.enumm;
public enum Transportation {
BUS(10),
TRAIN(150),
SHIP(100),
AIRPLANE(300);
protected final int BASIC_FARE;
Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
}
이렇게 해도 되지만 이동거리에 따른 요금도 계산해야 한다.
-> 거리에 따라 요금을 계산하는 방식이 다르기 때문에
-> 추상메서드를 선언하여 요금계산 메소드를 구현하자
package chapter3.enumm;
public enum Transportation {
BUS(10){int fare(int distance){return this.BASIC_FARE * distance;}},
TRAIN(150){int fare(int distance){return this.BASIC_FARE * distance;}},
SHIP(100){int fare(int distance){return this.BASIC_FARE * distance;}},
AIRPLANE(300){int fare(int distance){return this.BASIC_FARE * distance;}};
protected final int BASIC_FARE;
Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
public int getBASIC_FARE() {
return BASIC_FARE;
}
abstract int fare(int distance);
}
내부적으로 열거형이 어떻게 구현되었을까..
enum Direction {EAST, SOUTH, WEST, NORTH}
class Direction{
static final Direction EAST = new Direction("EAST");
static final Direction SOUTH = new Direction("SOUTH");
static final Direction WEST = new Direction("WEST");
static final Direction NORTH = new Direction("NORTH");
private String name;
private Direction(String name){
this.name = name;
}
}
또 열거형 상수끼리 == 비교가 가능한 것은 객체의 주소값이 바뀌지 않기 때문에
객체가 생성될 때마다 번호를 붙여서 인스턴스 변수에 저장한다.
Comparable인터페이스를 구현해서 ordinal값으로 비교 할 수 있다.