본문 바로가기

Java

[Java] Enum ? 열거형 (Enumeration)

📌 Enum 열거형 (Enumeration)

  • 관련이 있는 상수들의 집합이다.
  • enum 타입 이름은 관례적으로 단어의 첫 글자는 대문자로 지정하고 enum의 상수는 전부 대문자로 연결하고 여러 단어는 언더바(_)로 연결한다.
  • 어떤 클래스가 상수만으로 작성되어 있으면 반드시 class로 선언할 필요는 없습니다. 이럴 때 class로 선언된 부분에 enum이라고 선언하면 이 객체는 상수의 집합 enum 클래스가 된다.
  • 인터페이스나 클래스 내에서 상수를 선언함으로써 상수를 관리하였는데 클래스 내에서 선언하는 부분은 네이밍이 겹칠 수 있고 불 필요하게 상수가 많아지는 단점이 있다.
  • 인터페이스로 관리하는 경우 이런 부분은 줄어들지만 여전히 타입 안정성이 떨어지는 단점을 가지고 있었다. 이를 보완하며 나온 것이 Enum이다.

 

📌 생성자와 final 필드 추가

package study;

public enum Animal {
    LION(1),
    TIGER(2),
    DOG(3);

    private final int number;

    Note(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

}

class AnimalTest {
    public static void main(String[] args) {
        System.out.println(Note.LION);
        System.out.println(Note.DOG.getNumber()); // Dog 의 값 출력 = 1
    }
}
  • Enum 요소에 특정 값을 매핑하고 싶다면 위 코드처럼 필드 값을 추가하면 된다.
  • 필드 값을 추가하면 생성자도 함께 추가해야 하는데 Enum 클래스는 생성자가 있다고 하더라도 new 연산으로 생성할 수 없다.

 

📌 특징

클래스를 상수처럼 사용할 수 있다.

  • 생성자가 존재하지만 Default 생성자는 private 만 허용하고, public 으로 변경하는 경우 컴파일 에러가 발생한다. 즉 다른 클래스나 인터페이스에서의 상수 선언이 클래스 로드 시점에서 생성되는 것처럼 Enum 또한 생성자가 존재하지만 클래스가 로드되는 시점에서 생성되기 때문에 임의로 생성하여 사용할 수 없다.

Enum 클래스를 구현하는 경우 상수 값과 같이 유일하게 하나의 인스턴스가 생성되어 사용된다.

서로 관련 있는 상수 값들을 모아 enum으로 구현하는 경우

클래스와 같은 문법 체계를 따른다.

상속을 지원하지 않는다.

  • Enum은 내부적으로 java.lang.enum 클래스에 의해 상속된다. 자바는 다중 상속을 지원하지 않기 때문에 Enum은 다른 클래스를 상속받을 수 없다.
  • 상속은 지원하지 않지만 다양한 인터페이스 들은 구현할 수 있다.

 

📌 Enum 클래스 메서드

👉 values() 메서드

  • values()는 Enum 클래스가 가지고 있는 모든 상수 값을 배열의 형태로 리턴한다. 참고로 단순히 String의 형태로 단순 반환하는 것이 아니라 Enum 클래스가 가지고 있는 모든 인스턴스를 배열에 담아 반환하는 것이다.
class Animal {
    public static void main(String[] args) {
				
        Animal[] Animals = Animal.values();
        for (Animal a : Animals) {
            System.out.print(a + " "); // LION TIGER DOG
        }

        for (int i = 0; i < Animal.length; i++) {
            System.out.print(Animal[i] + " "); // LION TIGER DOG
        }
    }
}

👉 valueOf() 메서드

  • valueOf() 메서드는 String을 파라미터로 받는데 인자로 들어온 String과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환한다.
class Animal {
    public static void main(String[] args) {
        System.out.println(Animal.valueOf("DOG"));
        System.out.println(Animal.valueOf("LION"));
        System.out.println(Animal.valueOf("TIGER"));
    }
}
// Output
DOG
LION
TIGER

👉 ordinal() 메서드

  • Enum 클래스 내부에 있는 상수들의 Index를 리턴하는 메서드이다. 배열과 마찬가지로 0부터 인덱스가 시작하며 인덱스의 length는 상수의 수 - 1이다.
class Animal {
    public static void main(String[] args) {
        Animal[] Animals = Animal.values();
        for (Animal a : Animals) {
            System.out.println(Animal + " " + Animal.ordinal());
        }
    }
}
// Output
LION 0
TIGER 1
DOG 2