먼저 Enum은 "Enumeration"의 약자다. Enumeration은 "열거, 목록, 일람표" 라는 뜻을 가지고 있으며, 보통 한글로는 열거형이라고 부른다. 즉, 열거형(enum)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다. 어렵게 생각할 필요 없이 상수 데이터들의 집합 으로 치부하면 된다
-> 한정된 데이터 묶음을 열거형 타입인 Enum 으로 묶어주면 보다 구조적으로 프로그래밍 할 수 있다.


enum의 핵심은 이러한 상수를 단순히 정수로 치부하지말고 객체 지향적으로 객체화해서 관리하자는 취지이다.
예를들어 C언어의 enum은 그냥 정수이며, C++의 enum은 타입이지만, JAVA의 enum은 인터페이스와 같이 독립된 특수한 클래스로 구분한다. 즉, 일종의 객체이기 때문에 힙(heap) 메모리에 저장되며 각 enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수를 구성할 수 있는 것이다.
또한 IDE에서 클래스 파일을 생성할때 독립된 열거형 파일도 생성할 수 있다. (독립된 클래스이기 때문에)
-코드가 단순해지며 가독성이 좋아진다
-허용 가능한 값들을 제한하여 유형 안전(type safe)을 제공한다.
-키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
-자체 클래스 상수와 달리 switch문에서도 사용할 수 있다
-단순 상수와 비교해 IDE의 적극적인 지원을 받을 수 있다 (자동완성, 오타검증, 텍스트 리팩토링 등등)
-리팩토링시 변경 범위가 최소화 된다 (enum에서 한번에 관리하기 때문에 내용의 추가가 필요하더라도, Enum 코드외에 수정할 필요가 없다)
-enum은 본질적으로 Thread safe인 싱글톤 객체 이므로 싱글톤 클래스를 생성하는데에도 사용된다
-enum 명은 클래스와 같이 첫 문자를 대문자로하고 나머지는 소문자로 구성한다
-관례적으로, 열거 상수는 모두 대문자로 작성한다
-열거 상수가 여러 단어로 구성될 경우, 단어 사이를 밑줄 (_)로 연결한다
String 같은 자바의 여러 클래스가 자체 내장 메소드를 가지고 있듯이, enum 역시 내장 메소드를 지니고 있다.
모든 Enum 타입은 컴파일 시에 java.lang.Enum 클래스를 상속하게 되어있기 때문에, java.lang.Enum 에 선언된 메소드를 이용할 수 있다.
Enum 객체가 가지는 메소드는 아래와 같다

@RequuredArgument, @Getter 어노테이션과 함께 쓰인다면 필드를 선언해주면 각 객체의 고유의 값을 넣어줄 수 있다.

출처: https://inpa.tistory.com/entry/JAVA-☕-열거형Enum-타입-문법-활용-정리 [Inpa Dev 👨💻:티스토리]