열거 타입 enumeration type
한정된 값만을 갖는 데이터 타입
서로 관련이 있는 것들을 모아서 번호(=index)를 매겨놓은 것
열거 타입 선언
public enum 열거타입이름 {상수명1, 상수명2, ...}
e.g.
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
열거 타입 Week에 열거 상수 요일들을 작성했다.
열거 타입 변수
열거 **타입**이라는 것에 주의한다. 열거 상수를 이용하기 위해서는 열거 타입의 변수를 선언한 후 사용할 수 있다.
열거 타입 변수 선언하기
열거타입 변수;
Week today;
열거 타입 변수에 열거 상수 저장하기
열거타입 변수 = 열거타입.열거상수;
e.g.
Week today = Week.THURSDAY;
열거 객체의 메서드
- MONDAY~SUNDAY가 저장된 Week enum을 통해 알아보기
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
name()
열거 객체가 가지고 있는 문자열 = 열거 타입을 정의할 때 사용한 열거 상수 이름을 return 한다.
Week today = Week.FRIDAY; //열거 타입 변수에 열거 상수 FRIDAY 할당
String name = today.name(); //today에 저장된 문자열(FRIDAY)을 return
ordinal()
전체 열거 객체 중 몇 번쨰 열거 객체인지 알려준다. 순번은 0부터 시작한다. index
Week today = Week.FRIDAY;
int ordinal = today.ordinal(); // index=4
compareTo()
매개값으로 주어진 열거 객체를 기준으로 순번의 차이 값을 return
매개값보다 순번이 빠르다면 -, 늦다면 +
Week day1 = Week.MONDAY; //MODAY의 순번은 0
Week day2 = Week.FRIDAY; //FRIDAY의 순번은 4
int compareToResult1 = day1.compareTo(day2); //MODAY-FRIDAY = -4
int compareToResult2 = day2.compareTo(day1); //FRIDAY-MONDAY = 4
valueOf(String name)
매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 return
외부로부터 문자열을 입력받아 열거 객체로 변환할 때 사용
Week weekDay = Week.valueOf("WEDNESDAY");
//변수 weekDay는 Week.WEDNESDAY 열거 객체를 참조하게 된다
values()
열거 타입의 모든 열거 객체를 배열로 만들어 return
배열의 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.
>>>> 'at the time of enum class loading'에서 자동으로 만들어진다는 의미이지 않을까 생각해본다. enum type은 special data type이라고 하니까.............
아무튼 열거 상수는 열거 객체의 번지를 참조하고, 따라서 외부에서 열거 타입 변수에 열거 상수를 할당하면 그 변수 또한 열거 객체의 번지를 참조하는 것이므로 열거 상수와 열거 타입 변수는 서로 같은 객체를 참조하게 된다.
🐑
static, final, static final과 객체에 대한 개념이 흔들려서 빠르게 이해하지 못했다.
'diary > codestates (be39)' 카테고리의 다른 글
05/19-20/22 람다식 Lambda (0) | 2022.05.22 |
---|---|
05/19/22 애너테이션 Annotation (0) | 2022.05.20 |
05/17~18/22 제네릭과 컬렉션 프레임워크 공부 중 ㅠㅠ (0) | 2022.05.20 |
05/16/22 (복습) 데일리 회고 (0) | 2022.05.17 |
05/13/22 java/ 다형성과 추상화 (0) | 2022.05.14 |