관련된 상수들을 같이 묶어놓은 것
- java는 타입에 안전한 열거형을 제공
=> java는 열거형, 값, 타입을 모두 체크한다
https://www.youtube.com/watch?v=ODHC-n4mpMY&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=142
enum 열거형이름 { 상수명1, 상수명2 ...}
enum Direction{EAST, SOUTH, WEST, NORTH}
class Unit {
int x, y;
Direction dir;
void init(){
dir = Direction.EAST;
}
< 또는 >
는 안됨
public class Enumi {
enum Direction { EAST, SOUTH, WEST, NORTH }
class EnumEx1 {
public static void main(String[] args) {
Direction d1 = Direction.EAST;
Direction d2 = Direction.valueOf("WEST");
Direction d3 = Enum.valueOf(Direction.class, "EAST");
System.out.println("d1="+d1);
System.out.println("d2="+d2);
System.out.println("d3="+d3);
System.out.println("d1==d2 ? "+ (d1==d2));
System.out.println("d1==d3 ? "+ (d1==d3));
System.out.println("d1.equals(d3) ? "+ d1.equals(d3));
// System.out.println("d2 > d3 ? "+ (d1 > d3)); // ¿¡·¯
System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3)));
System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2)));
switch(d1) {
case 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) // for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
}
}
}
d1=EAST
d2=WEST
d3=EAST
d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3
public enum ItemType {
NONE(0),
ITEM1(0),
ITEM2(1),
ITEM3(2),
ITEM4(3),
;
private final Integer label;
ItemType(Integer label){
this.label = label;
}
public Integer label() {
return label;
}
}
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;
}
//getter 선언
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
또한 열거형의 생성자는 묵시적으로 private 이라 외부서 객체 새로 생성하는 것은 불가능
변하지 않고 항상 동일한 인스턴스를 반환하는 용도일 때 쓰기 좋음, (외부에서 건드리면 안되고 변할 일이 없는 것)