Enum 은 같은 성격을 가지는 상수들을 모아놓은 열거형(enumerate) 타입이다. JDK 1.5 부터 추가되었다. 이전에 Enum 이 추가되기 전에는 class 내에서 같은 성격의 상수들을 추가하여 사용했지만 Enum 을 사용함으로써 더 간결한 코드로 가독성을 높일 수 있고 상수의 용도로 만들어졌음을 명시적으로 나타낸다.
상수를 모아놓은 일반 class
class Card {
	static final int CLOVER = 0;
	static final int HEART = 1;
	static final int DIAMOND = 2;
	static final int SPACE = 3;
    
	static final int TWO = 0;
	static final int THREE = 1;
	static final int FOUR = 2;
    
    final int kind;
    final int num;
}
Enum 클래스 활용
class Card {
	enum Kind { CLOVER, HEART, DIAMOND, SPACE };
    enum Value { TWO, THREE, FOUR };
    
    final Kind kind; // type : Kind
    final Valud valud; // type : value
}
Java 공식문서에서 Enum 을 다음과 같이 소개한다.

즉, Enum 클래스는 추상 클래스이며 Enum 에 속해있는 값들은 추상 클래스를 상속받아 생성된 인스턴스이다. Enum 은 상수 의 목적으로 만들어졌기 때문에 기본적으로 불변을 보장하며 Enum 클래스 내에서 선언된 객체 외에 별도의 인스턴스를 생성할 수 없다. Enum 클래스 내 메소드에서도조차 안된다.
아래 예시는 Enum 클래스 내의 메소드에서 생성자를 호출했을 때 경고가 뜨는 모습이다.

순차적으로 접근이 가능하다
일반 클래스에서 상수로 선언할 경우 직접 원하는 값을 선택해서 호출하거나 해당 값들을 별도의 리스트로 감싸주어야한다. Enum 에서는 생성된 인스턴스 객체들을 선언한 순서대로 접근하여 호출하는 values() 메소드를 지원한다. 별도의 처리 없이도 간단하게 순차 접근이 가능하다. 또한 Enum 클래스 내에 몇 개의 인스턴스가 존재하는지도 파악 가능하다.
EnumName.values();
이름으로 접근이 가능하다
public enum Rank {
    FIRST(2_000_000_000, 6, false),
    SECOND(30_000_000, 5, true),
    THIRD(1_500_000, 5, false),
    FOURTH(50_000, 4, false),
    FIFTH(5_000, 3, false),
    NOTHING(0, 0, false);
    private static final int EXCLUDED_NUMBER = 0;
    private final int money;
    private final int count;
    private final boolean bonus;
    Rank(final int money, final int count, final boolean bonus) {
        this.money = money;
        this.count = count;
        this.bonus = bonus;
    }
}
Rank 의 인스턴스로 FIRST, SECOND, THIRD 등을 생성했다. Enum 에서 제공하는 valueOf(name) 을 이용하여 이름으로 랭크 인스턴스에 접근이 가능하다. 당연하지만 선언해둔 인스턴스의 이름과 완전하게 동일해야 한다.
Rank.valueOf("FIRST");
메소드를 가질 수 있다
추상 클래스를 상속받은 객체이므로 필요에 따라 해당 객체에 연관있는 메소드를 추가할 수 있다.
    public int getMoney() {
        return this.money;
    }
    public int getCount() {
        return this.count;
    }
    public boolean isBonus() {
        return this.bonus;
    }
미리 선언한 객체 외에 생성 불가능

Enum 클래스의 인스턴스 객체는 public static final 이며 생성자는 기본적으로 private 을 지원하므로 FIRST, SECOND, THIRD 등 미리 선언해둔 객체 이에는 생성이 불가능하다. 따라서 클라이언트가 인스턴스를 직접 생성하거나 확장할 수 없으니 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나씩만 존재함이 보장된다. 인스턴스 객체를 하나만 선언하여 싱글턴으로도 활용할 수 있다.
잘보고 갑니다