[Java/자바] Enum(열거형)이란?

열거형은 서로 연관된 상수를 편리하게 선언하기 위한 것으로, 여러 상수를 정의할때 사용하기 좋습니다.

서로 연관된 상수라 함은 아래의 간단한 예시 코드처럼

DOOR와 WHEEL은 String 타입으로 서로 연관된 상수라 할 수 있습니다.

enum Car {
	DOOR("4개의 문을 가진 차"),
    WHEEL("자동차의 바퀴");
}

열거형의 정의와 사용

아래 처럼 중괄호{}안에 상수의 이름을 나열하기만 하면 됩니다.

enum 열거형이름 { 상수명1, 상수명2, .... }

 

열거형에 정의된 상수를 사용하는 방법 "열거형이름.상수명"으로 클래스의 static 변수를 참조하는 것과 동일합니다.

또한 열거형 상수간의 비교에는 "eqauls()와 "=="를 사용할 수 있는데, "<, >"와 같은 비교연산자는 사용할 수 없고 compareTo()는 사용이 가능합니다.

compareTo()는 두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환합니다.

 

Enum클래스의 메서드

메서드 반환 타입 설 명
getDeclaringClass() Class<E> 열거형의 Class 객체를 반환.
name() String 열거형 상수의 이름을 문자열로 반환.
ordinal() int 열거형 상수가 정의된 순서를 반환.(0부터 시작)
valueOf(Class<T> enum Type, String name) T 지정된 열거형에서 name과 일치하는 열거형 상수를 반환.
values() Array 열거형의 모든 상수를 배열에 담아 반환

 

메서드 사용 예제
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)));

        for(Direction d : Direction.values())
            System.out.printf("%s=%d%n", d.name(), d.ordinal());
    }
}


열거형에 멤버 추가하기

열거형 상수들이 각자의 값을 가질 경우 아래 처럼 열거형 상수의 이름 다음에 원하는 값을 괄호()와 함께 적어주면 됩니다.
그리고 마지막 상수에는 끝에 세미콜론 ";" 을 붙여줘야 합니다.

enum Direction {
    EAST(1, ">"), 
    SOUTH(2,"V"), 
    WEST(3, "<"), 
    NORTH(4,"^");
}

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; 
}

그리고 위 값을 저장할 변수를 지정해주고 상수의 값 ( 불변의 값 )이기에 final을 붙여줍니다.

그 다음 생성자를 통해 변수의 값들을 초기화 해주고, 외부에서 이 값을 얻을 수 있게 getter를 추가 해줍니다. ( 열거형의 생성자는 외부에서 호출 불가 )

 

필요하다면 열거형 상수에 여러 값을 지정할 수 있는데,

추가하게 된다면 그에 맞게 인스턴스 변수와 생성자에 추가 된 값을 추가해주면 됩니다.

 


참고 자료 : 자바의 정석3