Dev./java

[Java] enum은 클래스다.

인쥭 2022. 3. 6. 03:24
반응형
public class Study {
    public static void main(String[] args) {
        for(Animals animal : Animals.values()) {
            animal.greeting();
            animal.move();
        }
    }
}

enum Animals {
    HUMAN(1.11) {
        @Override public void move() {
            System.out.println("move with human");
        }
    },
    BIRD(1, "Birdie"){
        @Override public void move() {
            System.out.println("fly with bird");
        }
    },
    DOG(2, "Doggo"){
        @Override public void move() {
            System.out.println("move with dog");
        }
    },
    CAT(3, "Catch"){
        @Override public void move() {
            System.out.println("move with cat");
        }
    };

    private final int age;
    private final String name;
    Animals(double height) {
        this.age = 10;
        this.name = "Human";
        System.out.println("human height: " + height);
    }
    Animals(int age, String name) {
        this.age = age;
        this.name = name;
        System.out.println(this.name + " created with age: " + this.age);
    }

    void greeting() {
        System.out.println("Hello, my name is " + this.name + " and I'm " + this.age + " years old!");
    }

    abstract void move();
}
  • enum은 열거 패턴을 지원하기 위한 특수한 유형의 클래스이다.
  • enum은 클래스이므로 필드와 메소드, 생성자를 가질 수 있다.
  • enum의 각 값은 대응되는 하나의 인스턴스로 생성되어 public static final 필드로 공개된다.
    • 이 때, enum에서 생성되는 각 인스턴스는 대응되는 형식의 생성자를 통해 생성된다.
    • 상술한 예시에서, HUMAN과 다른 값들은 괄호 안의 매개변수를 대응되는 형식의 생성자에 전달한다.
    • 생성된 인스턴스들은 enum의 형태를 따르므로, 상술한 예시에서는 값 별 인스턴스마다 age, name, greeting 멤버를 갖는다.
  • enum의 각 값에 대응되는 인스턴스는 enum이 최초로 사용되는 시점에 모두 생성된다.
    • 이는 enum의 인스턴스를 표현하는 필드가 static이기 때문으로, 최초 호출 시점에 메모리에 모든 static 필드가 로드된다.
  • enum에 정의된 메소드가 각 값마다 다르게 동작하도록 하고 싶은 경우, enum에 추상 메소드를 정의하고 각 값에서 이를 재정의한다.