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