안녕! 이 기사에서는 Java Enums 에 대해 설명합니다 . 다음 작업이 주어졌다고 상상해 보십시오. 요일을 구현하는 클래스를 만듭니다 . 언뜻보기에 이것은 다소 간단 해 보입니다. 코드는 다음과 같습니다.
public class DayOfWeek {
private String title;
public DayOfWeek(String title) {
this.title = title;
}
public static void main(String[] args) {
DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
System.out.println(dayOfWeek);
}
@Override
public String toString() {
return "DayOfWeek{" +
"title='" + title + '\'' +
'}';
}
}
모든 것이 괜찮아 보이지만 한 가지 문제가 있습니다. DayOfWeek 클래스의 생성자에 모든 텍스트를 전달할 수 있다는 것입니다. 즉, 누군가 "Frog", "Cloud" 또는 "azaza322"라는 이름의 요일을 만들 수 있습니다. 실제 요일은 7개뿐이고 각 요일에는 특정 이름이 있기 때문에 이것은 분명히 우리가 기대하는 동작이 아닙니다. 따라서 우리의 임무는 DayOfWeek 클래스 에 대해 가능한 값의 범위를 어떻게든 제한하는 것입니다 . Java 1.5가 등장하기 전에 개발자는 이 문제에 대한 자체 솔루션을 독립적으로 발명해야 했습니다. 언어에는 기성 솔루션이 없었기 때문입니다. 당시에는 프로그래머가 값의 수를 제한해야 하는 경우 다음과 같이 했습니다.
public class DayOfWeek {
private String title;
private DayOfWeek(String title) {
this.title = title;
}
public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
public static DayOfWeek MONDAY = new DayOfWeek("Monday");
public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");
@Override
public String toString() {
return "DayOfWeek{" +
"title='" + title + '\'' +
'}';
}
}
주의해야 할 사항은 다음과 같습니다.
-
생성자는 비공개입니다. 생성자가 private 한정자 로 표시된 경우 개체를 만드는 데 사용할 수 없습니다. 클래스에는 생성자가 하나만 있으므로 DayOfWeek 개체를 만들 수 없습니다.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
물론 클래스에는 올바르게 초기화된(정확한 요일 이름 사용) 필요한 수의 공용 정적 객체가 있습니다.
이를 통해 이러한 개체를 다른 클래스에서 사용할 수 있습니다.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
산출:
DayOfWeek{제목 = '일요일'}
그렇다면 Java Enum은 무엇입니까?
DayOfWeek 예제를 다시 살펴보겠습니다 .
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
이제 훨씬 간단해 보입니다 :) 내부적으로 Enum 에는 7개의 정적 상수가 있습니다. 그리고 그것은 우리가 프로그램을 구현하는 데 사용할 수 있는 것입니다. 예를 들어 학생이 오늘 학교에 가야 하는지 여부를 결정하는 프로그램을 작성해 봅시다. 학생은 StudentSchedule 클래스 로 표시되는 일일 일정을 갖습니다 .
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
일정 개체의 dayOfWeek 변수는 오늘이 어느 날인지 결정합니다. 다음은 학생 수업입니다.
public class Student {
private StudentSchedule schedule;
private boolean goToSchool;
public void wakeUp() {
if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
System.out.println("Hooray, you can sleep more!");
} else {
System.out.println("Damn, time for school again :(");
}
}
}
wakeUp() 메서드 에서 Java Enum을 사용하여 학생이 다음에 수행해야 할 작업을 결정합니다. DayOfWeek 의 각 필드에 대한 세부 정보도 제공하지 않았으며 그럴 필요도 없습니다. 요일이 어떻게 작동해야 하는지는 분명합니다. 현재 형식으로 사용한다면 모든 개발자가 코드에서 무슨 일이 일어나고 있는지 이해할 것입니다. Enum 의 편리한 또 다른 예는 해당 상수를 switch 문과 함께 사용할 수 있다는 것입니다. 예를 들어, 요리가 요일별로 예정된 엄격한 다이어트 프로그램을 작성해 봅시다.
public class VeryStrictDiet {
public void takeLunch(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case SUNDAY:
System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
break;
case MONDAY:
System.out.println("Lunch for Monday: chicken noodle soup!");
break;
case TUESDAY:
System.out.println("Tuesday, today it's celery soup :(");
break;
//... and so on to the end
}
}
}
이것은 Java 1.5 이전에 사용된 이전 솔루션에 비해 Enum의 장점 중 하나입니다 . 이전 솔루션은 switch 와 함께 사용할 수 없습니다 . Enum 에 대해 더 알아야 할 사항은 무엇입니까 ? Enum은 이것이 수반하는 모든 가능성을 가진 실제 클래스입니다. 예를 들어 요일의 현재 구현이 부적절한 경우 변수, 생성자 및 메서드를 DayOfWeek 에 추가할 수 있습니다 .
public enum DayOfWeek {
SUNDAY ("Sunday"),
MONDAY ("Monday"),
TUESDAY ("Tuesday"),
WEDNESDAY ("Wednesday"),
THURSDAY ("Thursday"),
FRIDAY ("Friday"),
SATURDAY ("Saturday");
private String title;
DayOfWeek(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
@Override
public String toString() {
return "DayOfWeek{" +
"title='" + title + '\'' +
'}';
}
}
이제 Enum 상수에는 제목 필드, getter 및 재정의된 toString 메서드가 있습니다 . 일반 클래스와 비교할 때 Enum 에는 한 가지 심각한 제한이 있습니다 . 상속할 수 없습니다. 또한 열거형에는 다음과 같은 특징적인 메서드가 있습니다.
-
values() : Enum 에 있는 모든 값의 배열을 반환합니다 .
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
산출:
[DayOfWeek{title = '일요일'}, DayOfWeek{title = '월요일'}, DayOfWeek{title = '화요일'}, DayOfWeek{title = '수요일'}, DayOfWeek{title = '목요일'}, DayOfWeek{title = '금요일'}, DayOfWeek{제목 = '토요일'}]
-
ordinal() : 상수의 서수를 반환합니다. 번호 매기기는 0부터 시작합니다.
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
산출:
0
- valueOf() : 전달된 이름에 해당하는 Enum 객체를 반환합니다.
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
산출:
DayOfWeek{제목 = '일요일'}
더 읽어보기: |
---|
GO TO FULL VERSION