안녕하세요! 이번 글에서는 Java Enum에 대해 설명하겠습니다. 당신에게 임무가 주어졌다고 상상해 보세요: 요일을 구현하는 클래스를 생성하세요 . 언뜻 보면 이것에 대해 복잡한 것이 없으며 코드는 다음과 같습니다.
Java 1.5가 출시되면서 언어에서는 이러한 상황에 대해 미리 만들어진 솔루션인 Enum 열거형을 도입했습니다 . Enum 도 클래스입니다. 그러나 이는 우리와 유사한 문제, 즉 특정 제한된 범위의 가치 창출을 해결하기 위해 특별히 "맞춤형"되었습니다. Java 제작자는 이미 미리 만들어진 예제(예: Enum이 이미 존재하는 C 언어)를 갖고 있었기 때문에 최적의 옵션을 만들 수 있었습니다.
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일뿐이고 각 요일에는 이름이 있기 때문에 이것은 분명히 우리가 기대하는 동작이 아닙니다. 따라서 우리의 임무는 " 요일 " 클래스 에 대해 가능한 값의 범위를 어떻게든 제한하는 것입니다 . 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 Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
결론:
DayOfWeek{title='일요일'}
열거형이란 무엇입니까?
그렇다면 Java의 Enum은 무엇입니까 ? 동일한 DayOfWeek 의 예를 살펴보겠습니다 .public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
이미 훨씬 간단해 보입니다 :) Enum 내부에는 정적 액세스가 가능한 7개의 상수가 있습니다. 우리는 이미 이를 사용하여 프로그램에서 논리를 구현할 수 있습니다. 예를 들어, 학생이 오늘 학교에 가야 하는지 여부를 결정하는 프로그램을 작성해 보겠습니다. 우리 학생은 ScholarSchedule 클래스 에 의해 지정된 자신만의 일상을 갖게 됩니다 .
public class ScholarSchedule {
private DayOfWeek dayOfWeek;
//...other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
요일 모드의 dayOfWeek 변수는 현재 날짜를 결정합니다. 그리고 여기 우리 학생의 수업이 있습니다:
public class Scholar {
private ScholarSchedule schedule;
private boolean goToSchool;
public void wakeUp() {
if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
System.out.println("Hooray, you can sleep some more!");
} else {
System.out.println("Damn, back to school :(");
}
}
}
wakeUp() 메서드 에서는 Enum을 사용하여 학생의 추가 작업을 결정합니다. DayOfWeek 의 각 변수가 무엇을 의미하는지 자세히 설명하지도 않았 으며 이는 필요하지 않습니다. 요일의 메커니즘은 이미 명확하며 현재 형식으로 사용하면 모든 개발자가 무엇을 이해할 것입니다. 당신의 코드에서 일어나고 있습니다. Enum의 편리함을 보여주는 또 다른 예는 해당 상수를 switch 문과 함께 사용할 수 있다는 것입니다 . 예를 들어, 우리는 식사를 날짜별로 계획하는 엄격한 다이어트 프로그램을 작성하고 있습니다.
public class VeryStrictDiet {
public void takeLunch(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case SUNDAY:
System.out.println("Sunday lunch! Today you can even have a little sweet");
break;
case MONDAY:
System.out.println("Monday Lunch: Chicken Noodles!");
break;
case TUESDAY:
System.out.println("Tuesday, today is celery soup :(");
break;
//...and so on until 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 에는 한 가지 심각한 제한 사항이 있습니다. 즉, 상속할 수 없다는 것입니다. 또한 열거형에는 고유한 메서드가 있습니다.
-
value() : 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{title='토요일'}]
-
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{title='일요일'}
GO TO FULL VERSION