열거형은 서로 관련된 여러 상수를 편리하게 선언하기 위한 것이다. 관련된 여러 상수란 사계절이 될 수도 있고, 게임의 규칙이 될 수도 있다. 한정되고, 정해진 값을 쓰는 데이터 타입이기 때문에 경우를 나눠야 할 때 많이 사용한다.
enum 열거형이름 { 상수명1, 상수명2, 상수명3, ... }
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, NAVY, PURPLE }
열거형을 정의하는 방법은 위와 같다. 상수는 대소문자 모두 표현 가능하지만, 통상적으로는 대문자 작성을 한다.
Rainbow firstColor = Rainbow.RED;
Rainbow eighthColor = null;
열거형은 데이터 타입이기 때문에 변수를 선언하고 대입할 수 있다. 위 코드를 보면 열거 타입이 참조 타입이기 때문에 null
선언도 가능하다는 것을 알 수 있다. 참조 타입은 객체를 참조하는 변수이므로, 열거 상수로 열거 객체를 생성할 수 있음도 알 수 있다.
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, NAVY, PURPLE}
public class EnumPractice {
public static void main(String[] args) {
System.out.println(Rainbow.RED); // RED
열거형에 정의된 상수는 클래스의 static변수를 참조하는 것과 동일하게 '열거형이름.상수명
방법으로 사용할 수 있다. 아래는 열거형을 활용해 간단히 적어본 예제 코드이다.
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, NAVY, PURPLE}
public class EnumPractice {
public static void main(String[] args) {
Rainbow r1 = Rainbow.RED;
Rainbow r2 = Rainbow.ORANGE;
Rainbow r3 = Enum.valueOf(Rainbow.class, "RED");
System.out.println("r1 = " + r1);
System.out.println("r2 = " + r2);
System.out.println("r3 = " + r3);
System.out.println("r1 = r2 ? " + (r1 == r2));
System.out.println("r1 = r3 ? " + (r1 == r3));
System.out.println("r1.equals(r3) ? " + (r1.equals(r3)));
switch(r1){
case RED:
System.out.println("The color is RED.");
break;
case ORANGE:
System.out.println("The color is ORANGE.");
break;
case YELLOW:
System.out.println("The color is YELLOW.");
break;
default:
System.out.println("Invalid color.");
}
Rainbow[] rainbowArr = Rainbow.values();
for(Rainbow r : rainbowArr)
System.out.printf("%s=%d%n", r.name(), r.ordinal());
}
}
// 출력:
//r1 = RED
//r2 = ORANGE
//r3 = RED
//r1 = r2 ? false
//r1 = r3 ? true
//r1.equals(r3) ? true
//The color is RED.
//RED=0
//ORANGE=1
//YELLOW=2
//GREEN=3
//BLUE=4
//NAVY=5
//PURPLE=6
==
는 사용 가능하나, <
, >
와 같은 비교연산자는 사용할 수 없다.compareTo()
를 쓸 수 있다. int 타입으로 리턴되며, 비교값을 주어진 매개값과 비교해서 순번 차이를 리턴하는 열거 객체 메서드이다.