본문 바로가기
Java

Enum

by k0o9 2022. 5. 27.

Enum

JDK 1.5부터 자바에 열거형이라는 것이 추가 되었다.

서로 관련된 상수들을 정의하여 편리하게 사용하기 위한 자료형이다.

public class Something {
    static final int ZERO = 0;
    static final int ONE = 1;

    static final int A = 0;
    static final int B = 1;

    final int number;
    final int word;

    public Something(int number, int word) {
        this.number = number;
        this.word = word;
    }

    public static void main(String[] args) {
        Something something = new Something(Something.ZERO, Something.A);
        int number = something.number;
        int word = something.word;

        System.out.println(number == word);  //true

    }
}

위의 코드를 살펴보면 의미상 number와 word의 값은 달라야 하지만 실질적인 값은 0이어서 true가 출력이 된다. 위의 코드를 enum을 사용해 수정해 보자.

public class Something {
    enum Number { ZERO, ONE}
    enum Word { A, B}

    final Number number;
    final Word word;

    public Something(Number number, Word word) {
        this.number = number;
        this.word = word;
    }

    public static void main(String[] args) {
        System.out.println(Number.ZERO==Word.A); // 컴파일 에러
    }
}

위의 코드를 보면 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다.

이처럼 자바의 열거형의 실제 값과 타입을 모두 확인한다.

또한 상수를 사용할 경우, 상수의 값이 변경되면 그 상수를 참조하는 모든 소스를 다시 컴파일 해야 한다. 하지만 열거형 상수를 사용하면 기존의 소스를 다시 컴파일 하지 않아도 된다.

enum 정의하는 방법


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

//사용
열거형이름.상수명
  • 열거형 상수 비교에는 ‘==’을 사용할 수 있다.
    • eqals()에 비해 빠른성능 제공.
    • 단 ‘<’ , ‘>’ 비교는 불가하고 대신 compareTo()를 제공한다.
  • case문 안에서는 열거형의 이름은 적지않고 상수의 이름만 적어서 비교 한다.

enum이 제공하는 메소드

enum에서 모든 상수를 출력하려면 다음과 같이 코드를 작성해야 한다.

열거형[] enums = 열거형.values();
for (열거형 e : enums) {
    System.out.println(d.name + " = " + d.ordinal());
}

values()와 valueOf(String name)의 경우 컴파일러가 자동으로 추가 해준다.

values()

  • 열거형의 모든 상수를 배열에 담아 반환한다.
  • 이 메서드는 모든 enum이 가지고 있는 것으로 컴파일러가 자동으로 추가해 준다.

valueOf(String name)

열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있다.

모든 열거형은 java.lang.Enum이라는 공통 조상을 가지게 된다.

Enum클래스가 가지고 있는 메서드는 다음과 같다.

ordinal()

열거형 상수가 정의 순서(0부터 시작)를 정수로 반환한다.

getDeclaringClass()

열거형의 Class객체를 반환한다.

name()

열거형 상수의 이름을 문자열로 반환한다.

valueOf(class enumType, String name)

지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

EnumSet

enum 클래스로 작동하기 위해 특화된 Set컬렉션이다.

Set인터페이스를 구현하고 AbstractSet을 상속한다.

  • ordinal값의 순서대로 저장 된다.
  • 쓰레드 safe하지 않기 때문에 동기화 문제를 고려해야 한다.
  • null 값을 허용하지 않으며 nullPointException을 허용하지 않는다.
  • 인스턴스 생성을 위한 다양한 정적 팩토리 메서드가 정의 되어 있다.
    • JDK에서는 RegularEnumSet, JumboEnumSet 2가지의 EnumSet 구현체를 제공한다.

'Java' 카테고리의 다른 글

입출력  (0) 2022.05.27
에노테이션  (0) 2022.05.27
Thread  (0) 2022.05.27
예외처리  (0) 2022.05.27
인터페이스  (0) 2022.05.27