Enum
목표
- 자바의 열거형에 대해 학습하세요.
학습할 것
- enum 정의하는 방법
- enum이 제공하는 메소드 (values()와 valueOf())
- java.lang.Enum
- EnumSet
enum 정의하는 방법
enum을 정의하는 방법은 괄호{}안에 상수의 이름을 나열하면 됩니다.
enum 열거형이름 { 상수명1, 상수명2, 상수명3 }
예를 들어 동서남북 4방향을 상수로 정의하는 enum Direction은 다음과 같습니다.
enum Direction { EAST, SOUTH, WEST, NORTH }
실제 코드에서 쓰임은 아래와 같습니다.
class Unit {
int x, y; // 유닛의 위치
Direction dir; // enum을 인스턴스 변수로 추가
void init() {
dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
}
}
enum 상수간의 비교
- enum 상수간의 비교에는 ’==’을 사용가능
- equals()도 사용가능
- ’<’,’>’와 같은 비교연산자는 사용할 수 없음
- compareTo()는 사용가능
- 두 비교대상이 같으면 0을 반환
- 왼쪽이 크면 양수를 반환
- 오른쪽이 크면 음수를 반환
enum이 제공하는 메소드 (values()와 valueOf())
values()
values()는 enum의 모든 상수를 배열로 담아 반환합니다. 이 메서드는 모든 enum이 가지고 있는 것으로 컴파일러가 자동으로 추가해줍니다.
Direction[] dArr = Direction.values();
for (Direction d : dArr) {
System.out.printf("%s = %d%n", d.name(), d.ordinal());
}
int ordinal()
ordinal()은 모든 enum의 조상인 java.lang.Enum클래스에 정의된 것으로, enum 상수가 정의된 순서(0부터 시작)를 정수로 반환합니다.
String name()
name()은 enum의 상수의 이름을 문자열로 반환합니다.
Class getDeclaringClasss()
enum의 Class 객체를 반환합니다.
T valueOf(Class enumType, String name)
지정된 enum에서 name과 일치하는 enum 상수를 반환합니다.
valueOf(String name)
이 메서드는 enum의 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있습니다.
Direction d = Direction.valueOf("WEST");
System.out.println(d);
System.out.println(Direction.WEST == Direction.valueOf("WEST")); // true
java.lang.Enum
java.lang.Enum은 열거형 객체의 최상위 조상 클래스입니다.
EnumSet
EnumSet은 enum 클래스를 위한 set 컬렉션으로, AbstractSet을 상속받고 Set을 구현받아 만들어졌습니다.
예제를 통해 좀더 알아보겠습니다.
public enum Color {
RED, YELLOW, GREEN, BLUE, BLACK, WHITE
}
allof를 이용해 enumSet을 만들 수 있습니다.
EnumSet<Color> t = EnumSet.allOf(Color.class);
t.forEach(System.out::println);
출처
자바의 정석
https://www.baeldung.com/java-enumset