배열의 index는 열거 객체의 순번과 똑같이 생성되고, 생성된 배열의 index 값들은 각각 열거 객체에 해당하는 번지를 참조하게 된다.
Week[] days = Week.values();
for(Week day : days){
System.out.println(day);
}
static final로 선언하면 되는데 enum 타입을 사용하는 이유는?
1. static final로 선언 시 상수명이 중복되는 문제가 피할 수 있다
2. 타입의 안전성을 보장할 수 있다
3. 코드가 복잡도를 줄이고 가독성을 올린다
4. switch문에 사용할 수 있다
헷갈렸던 것) enum은 클래스처럼 java 파일을 생성해서 사용한다. 사용하려면 열거 타입의 변수를 사용하기 위해 열거타입명을 이용해 열거타입변수를 선언해야 한다. 사용할 때는 열거 타입명에 dot 연산자를 이용해 열거 상수를 불러온다.
>> static처럼 객체 생성 없이 사용가능한 건가? 라는 궁금증을 해결하기 위한 노력
1. 열거 타입은 참조 타입이다.
*참조 타입이란? 메모리(heap 영역)의 번지(=주소값)을 통해 객체를 참조하는 타입이다.
열거 타입을 사용하기 위해 변수를 선언할 때 변수는 stack 영역에 생성된다. 선언한 열거 타입 변수에 열거 상수를 저장할 때 열거 타입 변수에 저장되는 것은 열거 타입에서 선언한 열거 상수에 저장된 객체의 번지이다.
열거 상수는 객체를 참조하고 있다.
2. 열거 상수와 static final로 선언된 상수의 비교 (상수) 상수는 static final로 선언되어 고정되어 절대 변하지 않는(바꿀 수 없는) 값이고, 외부에서 사용할 때 객체 생성 없이 바로 클래스명에 dot 연산자를 사용해 접근 가능하다.
(열거 상수) enum 타입에 선언된 열거 상수는 열거 객체로 생성된다. > 여기서 멘붕 >> 열거 상수마다 객체가 생성되고, 열거 상수는 열거 타입의 객체를 각각 참조한다고 한다. >>> 객체는 어디서 생성되어서 어떻게 참조되는가?
▪ enum can contain a constructor and it is executed separately for each enum constant at the time of enum class loading. ▪ We can’t create enum objects explicitly and hence we can’t invoke enum constructor directly.