enum
키워드 사용 public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY:
System.out.println("월요일이네..");
break;
case WEDNESDAY:;
System.out.println("수요일에 쉬면 좋아");
break;
case SATURDAY:
System.out.println("토요일이닷!");
break;
case SUNDAY:
System.out.println("내일이 월요일이네..");
break;
default:
System.out.println("평일이다");
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
결과
월요일이네..
수요일에 쉬면 좋아
평일이다
토요일이닷!
내일이 월요일이네..
enum
의 선언은 enum type
이라고 불리는 클래스를 정의한다.
enum 클래스의 바디는 메소드나 다른 필드를 포함할 수 있다.
모든 enum 들은 java.lang.Enum을 상속하기 때문에 enum은 다른 클래스를 상속하지 못한다.
enum의 생성자의 접근제어자는 package-private 또는 private 여야만 한다. enum body에 정의될 때 자동적으로 해당 상수가 만들어지기 때문에 따로 생성자를 호출할 필요가 없다.
enum은 '==' 로 비교 가능하다. (compareTo 사용가능)
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public static void main(String[] args) {
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
System.out.println(fifthDay.day == seventhDay.day);
System.out.println(fifthDay.day.compareTo(seventhDay.day));
}
}
values()
메소드enum Day {
SUNDAY("일"), MONDAY("월"), TUESDAY("화"), WEDNESDAY("수"),
THURSDAY("목"), FRIDAY("금"), SATURDAY("토");
private final String Korean;
Day(String korean) {
Korean = korean;
}
public String korean() {
return Korean;
}
}
public class EnumTest {
public static void main(String[] args) {
for( Day d : Day.values()) {
System.out.println(d.korean());
}
}
}
valueOf(String name)
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public static void main(String[] args) {
Day day = Day.valueOf("MONDAY");
System.out.println(day); //MONDAY
System.out.println(Day.valueOf("MONDAY")==Day.MONDAY); // true
}
}
메서드 | 설명 |
---|---|
Class<E> getDeclaringClass() | 열거형의 클래스 객체를 반환한다 |
String name() | 열거형 상수의 이름을 문자열로 반환한다. |
int ordinal() | 열거형 상수가 정의된 순서를 반환한다.(0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다 |
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public static void main(String[] args) {
Day day = Day.valueOf("MONDAY");
System.out.println(day); //MONDAY
System.out.println(day.getDeclaringClass()); // class bongf.week11.study.Day
String name = day.name();
System.out.println(name); // MONDAY
System.out.println(day.ordinal()); // 1
Day day3 = Day.WEDNESDAY;
System.out.println(day3.ordinal()); // 3
}
}
NullPointerException
발생한다.Collections.synchronizedSet(java.util.Set<T>) method
로 가능 Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
private EnumSet<Day> workedDays = EnumSet.allOf(Day.class);
EnumSet.noneOf(Color.class);
of
메소드 활용. 요소의 갯수에 따라 5개의 오버로딩 메소드가 있다. 그리고 가변인자(갯수에 상관없이 사용할 수 있는 메소드가 있다) 이 가변인자를 사용하는 메소드는 느리므로 요소 갯수가 1~5개라면 오버로딩된 메소드를 사용하자
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
@SafeVarargs public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
range()
enum에 정의된 순서대로 범위를 지정하여 생성하는 방법public static <E extends Enum<E>> EnumSet<E> range(E from, E to)
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
public class WorkingDay {
private EnumSet<Day> workedDays;
public WorkingDay() {
this.workedDays = EnumSet.noneOf(Day.class);
}
public EnumSet<Day> getWorkedDays() {
return workedDays;
}
public void setWorkedDays(EnumSet<Day> days) {
this.workedDays = days;
}
public boolean didWorkOn(Day day) {
return workedDays.contains(day);
}
public void add(Day day) {
workedDays.add(day);
}
public void remove(Day day) {
workedDays.remove(day);
}
}
class WorkingDayTest {
private static WorkingDay workingDay;
@BeforeEach
void set() {
workingDay = new WorkingDay();
}
@Test
@DisplayName("처음 생성시에 EnumSet.noneOf()로 비어있는 set을 만들어야 한다")
void startWithEmptySet() {
assertThat(workingDay.getWorkedDays().size()).isEqualTo(0);
System.out.println(workingDay.getWorkedDays());// []
}
@Test
@DisplayName("Set에 있는 add, remove, contains가 EnumSet에서도 동작해야 한다.")
void workWithSetMethod() {
workingDay.add(Day.FRIDAY);
workingDay.add(Day.WEDNESDAY);
workingDay.add(Day.MONDAY);
assertThat(workingDay.didWorkOn(Day.SUNDAY)).isFalse();
workingDay.remove(Day.FRIDAY);
assertThat(workingDay.getWorkedDays().size()).isEqualTo(2);
workingDay.getWorkedDays().forEach(System.out::println); // MONDAY, WEDNESDAY (enum에 정의된 순서대로 출력)
}
}
MON("월", 1)
@Enumerated(EnumType.String)
붙이면 테이블에 저장시 Enum의 name이 저장된다. CASH
, CARD
, ETC
가 있고 CASH(토스, 현장결제, 계좌이체)
가 있다고 했을 때 enum PayGrup {
CASH(Arrays.asList("토스", "현장결제", "계좌이체) ..
}