AVA의 enum은 인터페이스와 같이 독립된 특수한 클래스로 구분한다. 즉, 일종의 객체이기 때문에 힙(heap) 메모리에 저장되며 각 enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수를 구성할 수 있는 것이다.
또한 IDE에서 클래스 파일을 생성할때 독립된 열거형 파일도 생성할 수 있다. (독립된 클래스이기 때문에)
// 요일 열거 타입
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
Enum 타입 객체도 하나의 데이터 타입이므로 변수를 선언하고 사용하면 된다.
// 열거타입 변수 = 열거타입.열거상수;
Week monday = Week.MONDAY;
Week sunday = Week.SUNDAY;
한가지 알아둘 점은 enum 타입은 특수한 클래스 라는 점이다.
즉, primitive 타입이 아닌 referece 타입으로 분류되며, 그래서 enum 상수값은 힙(heap) 영역에 저장되게 된다.
String 처럼 스택 영역에 있는 변수들이 힙 영역에 있는 데이터의 주소값을 저장함으로써 참조 형태를 띄게 된다. 그래서 다음과 같이 같은 enum 타입 변수 끼리 같은 상수 데이터를 바라봄으로써 둘이 주소를 비교하는 == 연산 결과는 true가 되게 된다.
Week today = null; // 참조 타입이기 때문에 null도 저장 가능
today = Week.SUNDAY;
// 주소값 비교
System.out.println(today == Week.SUNDAY); // true
// enum Week 의 모든 상수값들을 배열로 변환
Week[] days = Week.values();
enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
name()
메소드
열거 객체가 가지고 있는 문자열을 리턴
반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일
Week w = Week.FRIDAY;
// 열거 객체의 문자열을 리턴
String weekName = w.name();
System.out.println(weekName); // "FRIDAY"
ordinal()
메소드
열거 타입을 정의 할 때 주어진 순번을 리턴
전체 열거 객체 중 몇 번째 열거 객체인지 알려준다
Week w = Week.FRIDAY;
// 열거 객체의 순번(0부터 시작)을 리턴
// 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다
int weekNum = w.ordinal();
System.out.println(weekNum); // 4
compareTo()
메소드
매개값으로 주어진 열거 객체를 비교해서 순번 차이를 리턴
열거 객체가 매개값의 열거 객체보다 순번이 빠르다 → 음수를 리턴
열거 객체가 매개값의 열거 객체보다 순번이 늦다 → 양수를 리턴
// 열거 객체를 비교해서 순번 차이를 리턴 (시작점을 어느 열거 객체의 기준으로 몇번째 위치하는지)
Week w1 = Week.TUESDAY; // 2
Week w2 = Week.SATURDAY; // 6
// 열거 객체가 매개값의 열거 객체보다 순번이 빠르다 → 음수를 리턴
int compare1 = w1.compareTo(w2); // SATURDAY 기준으로 TUESDAY 위치 (6에서 2가 되기 위한 값)
System.out.println(compare1); // -4
// 열거 객체가 매개값의 열거 객체보다 순번이 늦다 → 양수를 리턴
int compare2 = w2.compareTo(w1); // TUESDAY 기준으로 SATURDAY 위치 (2에서 6가 되기 위한 값)
System.out.println(compare2); // 4
valueOf()
메소드
매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴
// 문자열을 입력받아서 일치하는 열거 객체를 리턴
Week w3 = Week.valueOf("SUNDAY"); // w3 변수는 Week.SUNDAY 열거 객체를 참조하게 됨
System.out.println(w3); // SUNDAY
values()
메소드
열거 타입의 모든 열거 객체들을 배열로 만들어 리턴
// 모든 열거 객체들을 배열로 리턴
Week[] w4 = Week.values();
System.out.println(Arrays.toString(w4)); // [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
for (Week type : Week.values()) { // 열거 순회
System.out.println(type); // 순서대로 열거 객체 출력
}