이 글은 GeeksforGeeksenum in Java를 참조하여 쓴 글입니다.

Enumeration은 프로그래밍언어에서 상수의 그룹을 나타낼 때 사용한다.

Enum은 컴파일 당시 우리가 모든 가능한 값을 알고있는 경우 사용된다. 항상 enum안의 상수는 타입이 정해져 있어야 되는 것은 아니다.

Java 1.5버전 부터, enum은 enum 데이터 타입이라고 표시되었다. 자바 enum은 C/C++ enum보다 더 강력한 기능을 제공한다. 자바에서 변수, 메소드 그리고 생성자를 추가할 수 있다. enum의 주된 목적은 우리만의 데이터 타입을 가지기 위해서이다. (Enumberated Data Type)

enum의 선언

enum Color {
    RED, GREEN, BLUE
}

아래와 같이 호출하여 사용할 수 있고 값은 RED가 된다.

Color color = Color.RED;
  • enum의 첫번째 라인은 상수 리스트가 되어야하고 메소드, 변수나 생성자가 올 수 있다.
  • 자바 네이밍 컨벤션에 따르면, 대문자로 상수를 이름짓는 것을 추천하고 있다.

자바 네이밍 컨벤션

스크린샷 2019-09-05 오후 1.48.48.png

enum의 중요점

  • 모든 enum은 클래스를 사용해서 내부적으로 정의된다.
/* 내부적으로 위의 enum은 아래처럼 바뀐다.
class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}*/
  • 모든 enum 상수들은 객체 타입의 enum이다. (new Color())
  • enum 타입은 switch 구문아규먼트로 넣을 수 있다.
enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY; 
} 

public class Test { 
    Day day; 

    public Test(Day day) { this.day = day; } 

    public void dayIsLike() { 
        switch (day) { 
        case MONDAY: 
            System.out.println("Mondays are bad."); 
            break; 
        case FRIDAY: 
            System.out.println("Fridays are better."); 
            break; 
        case SATURDAY: 
        case SUNDAY: 
            System.out.println("Weekends are best."); 
            break; 
        default: 
            System.out.println("Midweek days are so-so."); 
            break; 
        } 
    } 

    public static void main(String[] args) 
    { 
        String str = "MONDAY"; 
        Test t1 = new Test(Day.valueOf(str)); 
        t1.dayIsLike(); 
    } 
} 

결과는 아래와 같이 나온다

Mondays are bad.
  • 모든 enum은 상수는 내부적으로 public static final 으로 정의되고, enum 이름으로 사용할 수있다. final이므로 자식 enum을 만들 수는 없다.
  • enum 내부에 main() 메서드를 선언할 수 있다. 그래서 enum을 커맨드 프롬프트에서 직접 호출할 수 있다.
enum Color { 
    RED, GREEN, BLUE; 

    // Driver method 
    public static void main(String[] args) 
    { 
        Color c1 = Color.RED; 
        System.out.println(c1); 
    } 
} 

결과는 아래와 같이 나온다.

RED

enum과 상속

  • 모든 enum들은 내부적으로 java.lang.Enum 클래스에 의해 상속된다. 클래스는 하나의 부모 클래스에 의해서만 상속되므로, enum은 다른것을 상속할 수가 없다.
  • toString() 메서드는 java.lang.Enum 클래스에서 오버라이드 된다. 이것은 enum 상수 이름을 리턴한다.
  • enum은 다양한 인터페이스들을 상속 할 수 있다.

values(), ordinal() 그리고 valueOf() 메서드 :

  • 이 메소드들은 java.lang.Enum 내부에 존재한다.
  • values() 메소드는 enum안에 존재하는 모든 값들은 반환한다.
  • enum안에서 순서는 중요하다. ordinal() 메소드를 사용하여 배열 인덱스처럼 각 enum 상수 인덱스를 찾을 수 있다.
  • valueOf() 메소드는 존재한다면 특정 enum 상수의 스트링 값을 반환한다.
enum Color { 
    RED, GREEN, BLUE; 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
        Color arr[] = Color.values(); 

        for (Color col : arr) { 
            System.out.println(col + " at index " + col.ordinal()); 
        } 

        System.out.println(Color.valueOf("RED")); 
    } 
} 

결과는 아래와 같다.

RED at index 0
GREEN at index 1
BLUE at index 2
RED
메소드 역할
values() 모든 상수 반환
ordinal() 상수 인덱스 반환
valueOf() 상수 문자 값 반환

enum과 생성자

  • enum은 생성자를 가질 수 있고 enum 클래스가 로드 될 때 각 상수들이 개별적으로 실행된다.
  • enum 객체를 명시적으로 생성할 수 없으므로 enum 생성자를 직접 부를 수는 없다. (new Color() 형식으로 부를 수 없음)

enum과 메소드

  • enum은 다른 추상 메소드가 아닌 일반 메소드를 가질 수 있다.
enum Color 
{ 
    RED, GREEN, BLUE; 

    private Color() 
    { 
        System.out.println("Constructor called for : " + this.toString()); 
    } 

    public void colorInfo() 
    { 
        System.out.println("Universal Color"); 
    } 
} 

public class Test 
{     
    public static void main(String[] args) 
    { 
        Color c1 = Color.RED; 
        System.out.println(c1); 
        c1.colorInfo(); 
    } 
} 
Output:

결과는 아래와 같이 나온다.

Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color

enum 정리

정의

enum Color {
    RED, GREEN, BLUE
}

호출

Color color = Color.RED;

내부

class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}*/

메서드

메소드 역할
values() 모든 상수 반환
ordinal() 상수 인덱스 반환
valueOf() 상수 문자 값 반환