μ΄κ±°νμ΄λ?
JDK 1.5 λΆν° μλ‘ μΆκ°λ κ°λ μ΄λ€.
κΈ°μ‘΄μ μΈμ΄λ€κ³Ό μλ°μ Enumμ΄ λ€λ₯Έ μ μ
- μ΄κ±°νμ΄ κ°λ κ° λΏλ§ μλλΌ νμ κΉμ§ κ΄λ¦¬νκΈ° λλ¬Έμ λ³΄λ€ λ Όλ¦¬μ μΈ μ€λ₯λ₯Ό μ€μΌ μ μλ€.
- βνμ μ μμ ν μ΄κ±°νβμ μ 곡νμ¬ μ€μ κ°μ΄ κ°μλ νμ μ΄ λ€λ₯΄λ©΄ 쑰건μ κ²°κ³Όκ° falseμ΄λ€. κ° λΏλ§ μλλΌ νμ κΉμ§ 체ν¬νλ€.
- μμ κ°μ΄ λ°λμ΄λ κΈ°μ‘΄ μμ€λ₯Ό λ€μ μ»΄νμΌνμ§ μμλ λλ€.
μ΄κ±°νμ μ μμ μ¬μ©
enum μ΄κ±°νμ΄λ¦ {μμλͺ
1, μμλͺ
2, ...}
μ΄κ±°νμ μ μλ μμλ₯Ό μ¬μμλ λ°©λ²μ μ΄κ±°νμ΄λ¦.μμλͺ
μ΄λ€.
ν΄λμ€μ static λ³μλ₯Ό μ°Έμ‘°νλ κ²κ³Ό λμΌνλ€.
μ΄κ±°ν μμκ° λΉκ΅
==
μ°μ°μλ₯Ό μ¬μ©νμ¬ λΉκ΅ν μ μλ€.
equals()
κ° μλ ==
μΌλ‘ λΉκ΅κ° κ°λ₯νλ€λ κ²μ κ·Έλ§νΌ μ±λ₯μ΄ μ’λ€λ κ²μ΄λ€.
<, >
λ‘λ λΉκ΅ν μ μμ§λ§ compareTo()
λ μ¬μ©μ΄ κ°λ₯νλ€.
λ switch
λ¬Έμ 쑰건μμλ μ¬μ©ν μ μλ€.
switch(d1) {
case EAST: // Direction.EASTλΌκ³ μ°λ©΄ μλλ€.
System.out.println("The direction is EAST.");
break;
case SOUTH:
System.out.println("The direction is SOUTH.");
break;
case WEST:
System.out.println("The direction is WEST.");
break;
case NORTH:
System.out.println("The direction is NORTH.");
break;
default:
System.out.println("Invalid direction.");
break;
}
λ€μν λ©μλ
μ΄κ±°νμ μ μλ λͺ¨λ μμλ₯Ό μΆλ ₯νλ €λ©΄ λ€μκ³Ό κ°μ΄ νλ€.
Direction[] dArr = Direction.values();
for(Direction d : dArr )
System.out.printf("%s=%d%n", d.name(), d.original());
values()
: μ΄κ±°νμ λͺ¨λ μμλ₯Ό λ°°μ΄μ λ΄μ λ°ννλ€.ordinal()
: λͺ¨λ μ΄κ±°νμ μ‘°μμΈjava.lang.Enum
ν΄λμ€μ μ μλ κ²μΌλ‘, μ μλ μμλ₯Ό μ μλ‘ λ°ννλ€.name()
: μ΄κ±°ν μμμ μ΄λ¦μ λ¬Έμμ΄λ‘ λ°ννλ€.valueOf()
: μ§μ λ μ΄κ±°νμμ nameκ³Ό μΌμΉνλ μ΄κ±°ν μμλ₯Ό λ°ννλ€.
μ΄κ±°νμ μμ±μ
Enum νμ
μ μ΄κ±°νμ μλ―Ένλ νΉλ³ν ννμ ν΄λμ€μ΄κΈ° λλ¬Έμ μΌλ° ν΄λμ€μ κ°μ΄
μμ±μκ° μ‘΄μ¬νμ¬μ νλ€. μλ°κ° κΈ°λ³Έ μμ±μλ₯Ό λ§λ€μ΄μ£ΌκΈ΄ νμ§λ§,
μ΄κ±°νμ μμ±μλ μ μ΄μκ° λ¬΅μμ μΌλ‘ privateμΌλ‘ μ§μ ν΄μ€μΌ νλ€.
μ΄μ λ κ³ μ λ μμμ μ§ν©μΌλ‘ λ°νμμ΄ μλ μ»΄νμΌ νμμ λͺ¨λ κ°μ
μκ³ μμ΄μΌ νκΈ° λλ¬Έμ΄λ€.
μ¦, λ€λ₯Έ ν¨ν€μ§λ ν΄λμ€μμ μ κ·Όν΄ λμ μΌλ‘ κ°μ ν λΉν μ μλ€.
μ΄κ±°νμ λ©€λ² μΆκ°νκΈ°
oridinal()
μ΄ μ΄κ±°ν μμκ° μ μλ μμλ₯Ό λ°ννμ§λ§,
λ΄λΆμ μΈ μ©λλ‘λ§ μ¬μ©λκΈ° μν κ²μ΄κΈ° λλ¬Έμ μ΄κ±°ν μμμ κ°μΌλ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
μ΄κ±° μμμ κ°μ΄ λΆκ·μΉμ μΈ κ²½μ°μλ λ€μκ³Ό κ°μ΄ μ΄κ±°ν μμ μ΄λ¦ μμ
μνλ κ°μ κ΄νΈμ ν¨κ» μ μ΄μ€λ€.
κ·Έλ¦¬κ³ μ§μ λ κ°μ μ μ₯ν μ μλ μΈμ€ν΄μ€ λ³μμ μμ±μλ₯Ό μλ‘ μΆκ°ν΄μ£Όμ΄μΌ νλ€.
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;}
Example
enum Direction {
EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");
private static final Direction[] DIR_ARR = Direction.values();
private final int value;
private final String symbol;
Direction(int value, String symbol) { // private Direction(int value)
this.value = value;
this.symbol = symbol;
}
public int getValue() { return value; }
public String getSymbol() { return symbol; }
public static Direction of(int dir) {
if (dir < 1 || dir > 4) {
throw new IllegalArgumentException("Invalid value :" + dir);
}
return DIR_ARR[dir - 1];
}
// λ°©ν₯μ νμ μν€λ λ©μλ. numμ κ°λ§νΌ 90λμ© μκ³λ°©ν₯μΌλ‘ νμ νλ€.
public Direction rotate(int num) {
num = num % 4;
if(num < 0) num +=4; // numμ΄ μμμΌ λλ μκ³λ°λ λ°©ν₯μΌλ‘ νμ
return DIR_ARR[(value-1+num) % 4];
}
public String toString() {
return name()+getSymbol();
}
} // enum Direction
class EnumEx2 {
public static void main(String[] args) {
for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.getValue());
Direction d1 = Direction.EAST;
Direction d2 = Direction.of(1);
System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());
System.out.println(Direction.EAST.rotate(1));
System.out.println(Direction.EAST.rotate(2));
System.out.println(Direction.EAST.rotate(-1));
System.out.println(Direction.EAST.rotate(-2));
}
}
μ΄κ±°νμ μΆμ λ©μλ μΆκ°νκΈ°
Example
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));
}
}
Transportationμ μ΄μ‘ μλ¨μ μ’
λ₯ λ³λ‘ μμλ₯Ό μ μνκ³ μκ³ ,
κ° μ΄μ‘ μλ¨μλ κΈ°λ³ΈμκΈμ΄ μ±
μ λμ΄ μλ€.
μ¬κΈ°μ 거리μ λ°λΌ μκΈμ κ³μ°νλ λ°©μμ΄ κ° μ΄μ‘ μλ¨λ§λ€ λ€λ₯Έ κ²½μ°λ₯Ό μν΄,
μΆμ λ©μλ fare(int distance)
λ₯Ό μ μΈν΄ κ° μ΄κ±°ν μμκ° μ΄ μΆμ λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ νλ€.
μ΄κ±°νμ μΆμ λ©μλλ₯Ό μ μΈν μΌμ 그리 λ§μ§ μλ€.
μ΄κ±°νμ λΉκ΅
enum Direction { EAST, SOUTH, WEST, NORTH; }
μ΄ μ΄κ±°ν μμ νλνλκ° Direction κ°μ²΄μ΄λ€.
Direction ν΄λμ€μ static μμ EAST, SOUTH, WEST, NORTHμ κ°μ κ°μ²΄μ μ£Όμμ΄κ³ ,
μ΄ κ°μ λ°λμ§ μλ κ°μ΄λ―λ‘ ==
λ‘ λΉκ΅κ° κ°λ₯νλ€.
Example
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();
}
}
κ°μ²΄κ° μμ±λ λλ§λ€ λ²νΈλ₯Ό λΆμ¬μ μΈμ€ν΄μ€ λ³μ ordinalμ μ μ₯νλ€.
κ·Έλ¦¬κ³ Comparable μΈν°νμ΄μ€λ₯Ό ꡬνν΄μ μ΄κ±°ν μμκ°μ λΉκ΅κ° κ°λ₯νλλ‘ λμ΄ μλ€.
λ§μΌ ν΄λμ€λ₯Ό MyEnum<T>
μ κ°μ΄ μ μΈνμλ€λ©΄, compareTo()λ₯Ό μμ κ°μ΄
κ°λ¨ν μμ±ν μ μμμ κ²μ΄λ€.
νμ
Tμ ordinal()
μ΄ μ μλμ΄ μλμ§ νμΈν μ μκΈ° λλ¬Έμ΄λ€.
κ·Έλμ MyEnum<T extends<MyEnum<T>>
μ κ°μ΄ μ μΈν κ²μ΄λ©°,
μ΄κ²μ νμ
Tκ° MyEnum<T>
μ μμμ΄μ΄μΌ νλ€λ μλ―Έμ΄λ€.
νμ
Tκ° MyEnumμ μμμ΄λ―λ‘ ordinal()μ΄ μ μλμ΄ μλ κ²μ λΆλͺ
νλ―λ‘,
νλ³ν μμ΄λ μλ¬κ° λμ§ μλλ€.
κ·Έλ¦¬κ³ μΆμ λ©μλλ₯Ό μλ‘ μΆκ°νλ©΄, ν΄λμ€ μμλ abstractλ₯Ό λΆμ¬μ€μΌ νκ³ ,
κ° static μμλ€λ μΆμ λ©μλλ₯Ό ꡬνν΄μ£Όμ΄μΌ νλ€.
μ°Έκ³ μλ£
- μλ°μ μ μ 3ν
- Java: enumμ λΏλ¦¬λ₯Ό μ°Ύμμ