불연속적인 열거형 상수의 경우, 원하는 값을 괄호()에 적는다
그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해주어야 한다.
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;}
}
필요에 따라 하나의 열거형 상수에 여러 값을 지정할 수 있다.
이에 맞게 인스턴스 변수와 생성자 등을 새로 추가해주어야 한다.
enum Direction {
EAST(1, ">"), SOUTH(5, "V"), WEST(-1, "<"), NORTH(10, "^");
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;}
Transportation은 운송 수단의 종류 별로 상수를 정의하고 있고,
각 운송 수단에는 기본요금이 책정되어 있다.
여기서 거리에 따라 요금을 계산하는 방식이 각 운송 수단마다 다른 경우를 위해,
추상 메서드 fare(int distance)를 선언해 각 열거형 상수가 이 추상 메서드를 반드시 구현해야 한다.
열거형에 추상 메서드를 선언할 일은 그리 많지 않다.
enum Transportation {
BUS(100) { int fare(int distance) { return distance*BASIC_FARE;}},
TRAIN(150) { int fare(int distance) { return distance*BASIC_FARE;}},
SHIP(100) { int fare(int distance) { return distance*BASIC_FARE;}},
AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};
protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
Transportation(int basicFare) { // private Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
public int getBasicFare() { return BASIC_FARE; }
abstract int fare(int distance); // 거리에 따른 요금 계산
}
class EnumEx3 {
public static void main(String[] args) {
System.out.println("bus fare=" +Transportation.BUS.fare(100));
System.out.println("train fare=" +Transportation.TRAIN.fare(100));
System.out.println("ship fare=" +Transportation.SHIP.fare(100));
System.out.println("airplane fare="+Transportation.AIRPLANE.fare(100));
}
}
enum Direction { EAST, SOUTH, WEST, NORTH; }
public class Direction1 {
static final Direction1 EAST = new Direction1("EAST");
static final Direction1 SOUTH = new Direction1("SOUTH");
static final Direction1 WEST = new Direction1("WEST");
static final Direction1 NORTH = new Direction1("NORTH");
private String name;
private Direction1(String name) {
this.name = name;
}
}
이 열거형 상수 하나하나가 Direction 객체이다.
Direction 클래스의 static 상수 EAST, SOUTH, WEST, NORTH의 값은 객체의 주소이고,
이 값은 바뀌지 않는 값이므로 ==로 비교가 가능하다.
enum을 흉내내어 MyEnum클래스를 작성해보면 이렇게 된다.
abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {
static int id = 0;
int ordinal;
String name = "";
public int ordinal() { return ordinal; }
MyEnum(String name) {
this.name = name;
ordinal = id++;
}
public int compareTo(T t) {
return ordinal - t.ordinal();
}
}