언어/자바

열거형(enum)

ballde 2021. 9. 16. 20:56

한정된 데이터만을 가지는 타입 → enumeration Type

public enum Week {

	MONDAY,TUESDAY,WEDNESDAY   -> 열거 상수

}

메모리 구조

내부적으로 public static final 필드이면서 객체로 제공됩니다.

즉 static이 붙어있기 때문에 클래스로더가 로드 시점에 JVM 메소드 영역에 해당 클래스 변수를 할당시키고 언제든지 가져다가 사용 할 수 있는 주소공간을 확보합니다.

Week today = Week.MONDAY;

이러한 로직을 만나면 heap 영역에 해당 enum이 생성됩니다. 그리고 method 영역의 열거상수들은 해당 heap영역에 생성된 객체를 바라보게 됩니다.

그래서

Week thisWeek = Week.SUNDAY;
Week nextWeek = Week.SUNDAY;
thisWeek == nextWeek // true

thisWeek과 nextWeek이 같습니다.

SUNDAY는 힙 영역을 바라보고 thisWeek은 method 역역에 있는 값을 가져왔습니다.

그리고 nextWeek도 method 영역에 있는 값을 가져왔습니다. 그러면 서로 주소가 같아서 값이 같습니다.

 

public enum Week {

    MONDAY("월요일", 1), SUNDAY("일요일", 0);

    private String name;
    private Integer weekNum;

    Week(String name, Integer weekNum) {
        this.name = name;
        this.weekNum = weekNum;
    }
}

추사속성 부여 가능합니다.

생성자에 각각의 타입으로 정의가능합니다

 

enum 클래스에 일반 메서드도 가능

public enum Week {

    MONDAY("월요일", 1), SUNDAY("일요일", 0);

    private String name;
    private Integer weekNum;

    Week(String name, Integer weekNum) {
        this.name = name;
        this.weekNum = weekNum;
    }

    void print() {
        System.out.println("MONDAY = " + MONDAY);
    }

}

열거형 상수안에 상수별로 특정 메서드를 재정의 가능

MONDAY("월요일", 1) {
      public void print() {
          System.out.println(MONDAY.name);
      }  
    },

enum 상수끼리 공유하는 코드를 만들고 싶을 때 충첩 Enum 사용 가능

클래스안에 enum클래스도 사용 가능

public enum Week {

    MONDAY("월요일", 1) {
      public void print() {
          System.out.println(MONDAY.name);
      }
    },
    SUNDAY("일요일", 0);

    private String name;
    private Integer weekNum;

    Week(String name, Integer weekNum) {
        this.name = name;
        this.weekNum = weekNum;
    }

    void print() {
        System.out.println("MONDAY = " + MONDAY);
    }
    
    private enum WeekDay {
        WEEK_DAY
    }

}