열거형(enumerate type)이라고 부르며, 서로 연관된 상수들의 집합, 즉 바뀌지 않는 값들의 집합이다.
enum 클래스는 JDK 1.5 이상의 버전에서만 사용이 가능하다.
enum 클래스를 간단히 정의하면
클래스처럼 보이게 하는 상수
서로 관련 있는 상수들끼리 모아 상수들을 정의
enum 클래스 형을 기반으로 한 클래스형 선언
으로 정의할 수 있다.
1. 열거형으로 선언된 순서에 따라 0 ~ index 값을 가진다.
2. enum 열거형으로 지정된 상수들은 모두 대문자로 선언한다.
3. 열거형 변수들을 선언한 후 마지막에 세미콜론(;)을 찍지 않는다.
4. 상수와 특정 값을 연결시킬 경우 마지막에 세미콜론(;)을 붙여줘야한다.
public enum Fruit {
APPLE("사과"),
PEACH("복숭아"),
BANANA("바나나");
private final String name;
Fruit(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
상수와 특정 값을 연결시켜 놓음으로 특정 값을 연결시키려면 해당 값들을 리턴할 수 있는 함수가 선언되어야 한다.
for(Fruit fruits : Fruit.values()) {
System.out.println(fruits.getName()); // 사과, 복숭아, 바나나
}
System.out.println(Fruit.BANANA.getName()); // 바나나
System.out.println(Fruit.APPLE.ordinal()); // 0
여기서 어떻게 Enum class 는 별도의 선언없이 사용할 수 있을까?
이 문제에 대해 Enum이 어떻게 동작하는지 보면 된다.
enum Fruit {
APPLE, PEACH, BANANA
}
이렇게 정의된 코드는 다시말해서
class Fruit {
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}
와 같은 의미이다.
static이 붙은 클래스 변수들은 인스턴스와 무관하게 클래스에 바로 접근이 가능하며, 클래스에 소속되어 있다.
클래스 변수는 메서드 영역에서 관리되어지며, 자바 프로그램을 시작할 때 딱 1개가 만들어진다.
이 내용에 대해 잘 모른다거나 이해가 안간다면, [Java]메모리 구조 를 다시 공부해보자..
따라서 Enum class를 사용할 때 별도의 선언없이 바로 사용할 수 있게 된다.
1. 코드가 단순해지며 가독성이 좋아진다.
2. 인스턴스 생성과 상속을 방지하여 상수값의 타입 안정성이 보장이 된다.
3. 키워드 enum을 사용하기에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
대표적으로 values(), ordinal(), valueOf() 이 있다.
Static Methods
메서드 | 내용 |
---|---|
valueOf(String args) | String 값을 enum에서 가져온다. 값이 없으면 Exception 발생 |
valueOf(Class class, String arg) | 넘겨받은 class에서 String을 찾아, enum에서 가져온다. valueOf(String arg)는 내부적으로 자기 자신의 class를 가져오는 것이다. |
values() | enum의 요소들을 순서대로 enum타입의 배열로 리턴한다. ENUM$VALUES의 카피이므로, 너무 자주 호출하는 것은 좋지 않다. |
Non Static Methods
메서드 | 내용 |
---|---|
name() | 호출된 값의 이름을 String으로 리턴한다. |
ordinal() | 해당 값이 enum에 정의된 순서를 리턴한다.(index값 리턴) |
compareTo(E o) | 이 enum과 지정된 객체의 순서를 비교한다. 지정된 객체보다 작은 경우 음의정수, 동일하면 0, 크면 양의 정수를 반환 |
equals(Object other) | 지정된 객체가 이 enum 정수와 같은 경우,true를 반환 |