Enum은 열거형 상수를 위한 타입이다. Enum 도입 이전 상수를 관리하기 위해서 인터페이스나 클래스의 static final 필드를 통한 개발을 해왔었다. Enum 이전의 클래스 형태의 상수 관리를 알아보자.

클래스 방식의 상수 관리


class Shoes{
    static final int RUNNING = 0;
    static final int WALKING = 1;
}

class Brand{
    static final int NIKE = 0;
    static final int ADIDAS = 1;
}

if(Shoes.RUNNING == Brand.NIKE) {
	// 실행되면 안 되는 코드
}

위처럼 클래스를 통해 상수를 관리할 때 몇 가지 문제점이 생길 수 있다. Shoes.RUNNING == Brand.NIKE를 비교하는 과정에서 컴파일 에러가 발생하지 않는다. 상수이긴 하지만 정수형을 사용하는 한 고유한 값이 아니기 때문이다. 사람의 관점으로 본다면 비교조차 되지 못해 컴파일 에러가 발생해야 하는 값이다.

다음은 인스턴스를 생성하여 관리하는 방법이다.

class Season {
	public static final Season SPRING = new Season("봄");
	public static final Season SUMMER = new Season("여름");
	public static final Season FALL = new Season("가을");
	public static final Season WINTER = new Season("겨울");
	
	private String name;
	
	private Season(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return this.name;
	}
}

그러나 위의 코드는 switch에서 사용할 수 없다. switch의 조건식에 들어가는 자료형이 정수형, String, enum 뿐으로 제한되기 때문이다.

Enum