언어/자바
열거형(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
}
}