서로 관련된 상수를 편리하게 선언하기 위한 것이다.
여러 상수를 정의할때 사용하면 유용하다.
만약 동서남북의 방향을 상수로 정의하고 싶다고 해보자.
enum Direction{
EAST, WEST, SOUTH, NORTH
}
위에 작성된 Enum의 상수를 사용하고 싶다면
Enum 이름에 .을 붙히고 상수의 이름을 쓰면 된다.
System.out.println(Direction.EAST); //EAST
System.out.println(Direction.SOUTH); //SOUTH
마치 static 멤버를 불러오는 것과 비슷한 모습이다.
만약 각 방향에 대해 요소(멤버)들을 추가하고 싶다면
아래와 같이 작성한다.
멤버에 대한 인스턴스 변수와 생성자를 추가해야 된다는 것을 주의하자.
enum Direction{
EAST("→"), WEST("←"), SOUTH("↓"), NORTH("↑");
//관련된 상수에 대한 변수를 선언해야 한다.
private final String symbol;
//변수를 받는 생성자가 있어야 한다.
//생성자는 묵시적으로 private이다.
Direction(String symbol){
this.symbol = symbol;
}
//화살표를 외부에서 가져오기 위한 setter
public String getSymbol() {
return symbol;
}
}
왜 이렇게 해야 하는지는 좀 더 아래에서 설명할 것이다.
화살표(멤버)를 출력하려면 아래와 같이 코드를 작성한다.
System.out.println("EAST: " + Direction.EAST.getSymbol()); //EAST: →
System.out.println("WEST: " + Direction.WEST.getSymbol()); //WEST: ←
사실 위의 EAST, WEST, SOUTH, NORTH 는
사실 Direction 인스턴스다.
//인스턴스의 클래스의 이름을 출력하는 코드
System.out.println(Direction.SOUTH.getClass().getName());
System.out.println(Direction.NORTH.getClass().getName());
//둘 모두 Direction 이 출력된다.
그래서 Direction.EAST.getSymbol() 과 같이 메서드를 호출 할 수 있었던 것이다.
열거형 Direction을 클래스로 다시 구현한다면 아래와 같아진다.
아래의 코드를 보면 왜 인스턴스 변수와 생성자를 만들어야 하는지
알 수 있을 것이다.
class Direction{
static Direction EAST = new Direction("→");
static Direction WEST = new Direction("←");
static Direction SOUTH = new Direction("↓");
static Direction NORTH = new Direction("↑");
private final String symbol;
private Direction(String symbol){
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
}