본문 바로가기

자바

JAVA Enum

Enum

JDK 1.5 이전의 자바에서는 열거체(enumeration type)를 사용할 수 없었다.

하지만, JDK 1.5부터는 C언어의 열거체보다 더욱 향상된 성능으로 사용할 수 있어졌다.

Enum은 "연관된 상수들의 집합"이라고 표현되기도 하며 서로 관련된 상수를 편리하게 선언할 수 있다.

보통, 대문자 형태로 정의하며 중복되지 않아야 한다.

대체 왜 Enum을 사용할까?를 고민한다면 이유는 다음과 같다.

  • 동등 연산자로 비교할 때 기존의 final static으로 선언한 상수와 달리 타입을 체크하여 비교해주기 때문에 타입 안전하다.
  • 기존의 final static으로 선언한 상수는 변경 후 컴파일해야했지만 Enum의 경우 변경되더라도 재컴파일할 필요가 없다.

자 그러면 어떻게 Enum을 어떻게 사용하는지에 대해서 살펴보자.

Enum 사용

우리는 기존에 상수를 사용하기 위해 다음과 같이 작성했다.

class Week {
    public static final String MONDAY = "월요일";
    public static final String TUESDAY = "화요일";
    public static final String WEDNESDAY = "수요일";
    public static final String THURSDAY = "목요일";
    public static final String FRIDAY = "금요일";
    public static final String SATURDAY = "토요일";
    public static final String SUNDAY = "일요일";
}

public class enumTest {
    public static void main(String[] args) {
        String today = "월요일";

        switch(today) {
            case Week.MONDAY:
                System.out.println("월요일입니다.");
                break;
            case Week.TUESDAY:
                System.out.println("화요일입니다.");
                break;
            case Week.WEDNESDAY:
                System.out.println("수요일입니다.");
                break;

            ...

        }
    }
}
  • 만약 MONDAY를 누군가 "월요"로 실수로 변경한다면 컴파일 타임에 오류를 잡을 수 없다.
enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week today = Week.MONDAY;

        switch(today) {
            case MONDAY:
                System.out.println("월요일입니다.");
                break;
            case TUESDAY:
                System.out.println("화요일입니다.");
                break;
            case WEDNESDAY:
                System.out.println("수요일입니다.");
                break;
        }
    }
}
  • 각각의 엘리먼트에 대한 고유 문자열을 가지기 때문에 의미가 명확하고 사용자의 실수를 방지할 수 있다.
  • 외부에 Enum type이 노출되기 때문에 중복이나 오타에 대한 염려를 하지 않아도 된다.

Enum 메서드

메서드를 살펴보면 다음과 같다.

1. Static Methods

(1) valueOf()

enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week monday = Week.valueOf("MONDAY");
        System.out.println("monday = " + monday);
    }
}
  • valueOf()는 입력한 파라미터에 해당하는 문자열과 동일한 Enum 객체를 리턴한다.
  • 없을시, Exception을 리턴한다.

(2) values()

enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week[] values = Week.values();
        for (Week value : values) {
            System.out.println("value = " + value);
        }
    }
}

// value = MONDAY
// value = TUESDAY
// value = WEDNESDAY
// value = THURSDAY
// value = FRIDAY
// value = SATURDAY
// value = SUNDAY
  • values()는 Enum의 모든 객체를 리턴한다.

(3) ordinal()

enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week monday = Week.MONDAY;
        System.out.println("monday.ordinal() = " + monday.ordinal());
    }
}

// monday.ordinal() = 0
  • ordinal()은 Enum 객체 중 몇번째 객체인지를 리턴한다.
  • 0부터 시작한다.

(4) name()

enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week monday = Week.MONDAY;
        System.out.println("monday.name() = " + monday.name());
    }
}

// monday.name() = MONDAY
  • name()은 Enum 객체가 가진 문자열을 리턴한다.

(5) compareTo()

enum Week {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private String value;

    Week(String value) {
        this.value = value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        Week monday = Week.MONDAY;
        Week tuesday = Week.TUESDAY;
        System.out.println("monday.compareTo(tuesday) = " + monday.compareTo(tuesday));
        System.out.println("tuesday.compareTo(monday) = " + tuesday.compareTo(monday));
    }
}

// monday.compareTo(tuesday) = -1
// tuesday.compareTo(monday) = 1
  • compareTo()는 Enum 객체를 기준으로 ordinal을 기준으로 비교한다.
  • 더 앞에 위치한다면 음수, 더 뒤에 위치한다면 양수를 리턴한다.

'자바' 카테고리의 다른 글

JAVA Generic  (0) 2021.10.16
JAVA Collection  (0) 2021.10.15
JAVA Lambda, Functional Interface  (0) 2021.10.14
JAVA Exception  (0) 2021.10.13
Java Optional  (1) 2021.10.04