Enum이라는 것은 Enumeration의 앞글자로 열거형이라는 뜻을 가지고 있으며 서로 연관되거나 또는 관련이 있는 상수들의 집합을 의미한다.
Calendar
클래스에서는enums 클래스
가 없어서 모든 필드가 상수(final
)로 정의되어있음(JDK1.5부터 추가)
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Calendar.html
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/temporal/ChronoField.html
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/temporal/ChronoUnit.html
enum 열거형이름 { 상수명1, 상수명2, ... }
public static final
) 로 정의됨열거형이름.상수명1
클래스의
static
변수를 참조하는 것과 동일하다.
/**
* 모든 열거형의 상위 클래스 - java.lang.Enum
*/
package enums1;
import java.util.Arrays;
public class DirectionMain {
public static void main(String[] args) {
/**
* values()는 열거형의 모든 상수를 배열에 담아서 반환
* 이 메서드는 모든 열거형이 가지고 있는 것으로
* 컴파일러가 자동으로 추가해준다
*/
Direction[] arr = Direction.values();
Arrays.stream(arr).forEach(System.out::println);
for(Direction d : arr){
System.out.println(d.name() + ", " + d.ordinal());
// .ordinal() -> 인덱스값 반환
// .name() -> 이름
}
}
}
EAST
WEST
NORTH
SOUTH
EAST, 0
WEST, 1
NORTH, 2
SOUTH, 3
enum 클래스는
java.lang.Enum
을 상속하고 있는 클래스
1. 열거형 상수의 값이 불연속적인 경우에는 다음과 같이 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함게 적어주면 된다.(끝에 ";" 추가)
public enum Direction {
EAST(1),
WEST(2),
NORTH(-3),
SOUTH(5);
}
2. 지정된 값을 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다.
public enum Direction {
EAST(1),
WEST(2),
NORTH(-3),
SOUTH(5);
// 인스턴스 변수 추가
private final int value;
// 생성자 추가 (외부에서 호출 불가 묵시적 private타입)
Direction(int i) {
this.value = i;
}
// 외부에서 값을 얻어올 수 있도록 추가
public int getValue(){
return value;
}
}
열거형 상수에 여러 값을 지정할 수 있다. 단, 변수도 추가해야하며 생성자에도 추가해줘야 한다.
package enums;
public enum Transportation {
BUS("버스", 1400) {
@Override
public int getFee(int person) {
return fee * person;
}
},
SUBWAY("지하철", 1400) {
@Override
public int getFee(int person) {
return fee * person;
}
},
TAXI("택시", 4800) {
@Override
public int getFee(int person) {
return fee * person;
}
};
// enum 상수는 상수기 때문에 값이 바뀌지 않는 것이 특징
// 생성자를 오버로딩할 수 있다.
private final String title;
// private으로 할 경우 추상메소드 구현시 변수를 불러올 수 없음
protected final int fee;
Transportation(String title, int fee) {
this.title = title;
this.fee = fee;
}
public String getTitle(){
return title;
}
// Enum 클래스는 추상클래스기 때문에 추상메서드를 정의할 수 있다.
public abstract int getFee(int person);
}
package enums;
public class Main1 {
public static void main(String[] args) {
String str = "TAXI";
Transportation trans = Enum.valueOf(Transportation.class, str); // 문자열 -> Enum상수로 변환
System.out.println(trans);
// 모든 생성자는 private
System.out.println(Transportation.BUS instanceof Transportation);
Transportation trans1 = Transportation.TAXI;
System.out.println(trans1.getTitle());
System.out.println(trans.getFee(5));
}
}
TAXI
true
택시
24000
Enum.valueOf(클래스, "상수")
-> 상수를 원래 문자형으로 바꿔줌
valueOf()
-> 컴파일러가 자동으로 추가해주는 메서드
열거형이름.valueOf("상수")
-> 문자열로 반환해줌