public class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE }
enum Value {TWO, THREE, FOUR }
final Kind kind = Kind.CLOVER;
final Value value = Value.TWO;
}
열거형의 정의와 사용
열거형 정의
// enum 열거형 이름 { 상수명1, 상수명2, ...}
enum Direction { EAST, WEST, SOUTH, NORTH }
열거형 사용
Class<E> getDeclaringClass() // 열거형의 클래스 객체를 반환
String name() // 열거형 상수의 이름을 문자열로 반환
int ordinal() // 열거형 상수가 정의된 순서를 반환 (0부터 시작)
T valueOf(Class<T> enumType, String name) // 지정된 열거형에서 name 과 일치하는 열거형 상수를 반환
Direction direction = Enum.ValueOf(Direction.class, "EAST");
String name = direction.name();
Direction[] directionArr = Direction.values();
for(Direction direction : directionArr) {
System.out.println("%s=%d\n", direction.name(), direction.ordinal());
}
열거형에 멤버 추가하기
public enum Table {
App("tbl_app"),
AppInfo("tbl_app_info"),
GameCompany("tbl_game_company");
// 인스턴스 변수에 반드시 final 을 붙여야한다는 제약은 없지만,
// value는 열거형 상수값을 저장하기 위한 것이므로 final을 붙였음.
private final String value;
private Table(String value) {
this.value = value;
}
public String getValue() { return tableName; }
}
public enum Transportation {
BUS(100) {
@Override
int fare(int distance) {
return distance * BASIC_FARE;
}
},
TRAIN(150) {
int fare(int distance) {
return distance * BASIC_FARE;
}
};
/***********************************
* 거리에 따른 요금 계산하 추상 메서드
***********************************/
abstract int fare(int distance);
// protected로 해야 각 열거형 상수에서 접근 가능
protected final int BASIC_FARE;
private Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
int fare() {
return BASIC_FARE;
}
}
열거형의 이해
public abstract class 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++; // 객체를 생성할 때마다 1씩 증가시킨다.
}
public int compareTo(T t) {
return ordinal - t.ordinal(); // 에러. 타입 T에 ordinal 사용불가
}
}
// compareTo 에러 수정
public abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {
//...
public int compareTo(T t) {
return ordinal - t.ordinal(); // 에러. 타입 T에 ordinal 사용 가능
}
}
MyEnum<T extends MyEnum<T>>
// 타입 T가 MyEnum<T> 의 자손이어야 한다는 의미
// T가 MyEnum의 자손이므로 t.ordinal() 접근이 가능해짐
abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {
//...
}
abstract class MyTransportation extends MyEnum {
static final MyTransportation BUS = new MyTransportation("BUS", 100);
static final MyTransportation TRAIN = new MyTransportation("TRAIN", 150);
protected final int BASIC_FARE;
private MyTransportation(String name, int basicFare) {
super(name); // ordinal 값 접근 가능
BASIC_FARE = basicFare;
}
public String name() { return name; }
public String toString() { return name; }
}
class EnumEX {
public static void main(String[] args) {
MyTransportation t1 = MyTransportation.BUS;
MyTransportation t2 = MyTransportation.TRAIN;
...
}
}