CodeGym /Java Blog /무작위의 /Java의 열거형 클래스
John Squirrels
레벨 41
San Francisco

Java의 열거형 클래스

무작위의 그룹에 게시되었습니다
안녕! 이 기사에서는 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{제목 = '일요일'}

이 접근 방식은 대부분 문제를 해결합니다. 우리는 마음대로 사용할 수 있는 주 7일이 있으며 아무도 새로운 날을 만들 수 없습니다. 이 솔루션은 Joshua Bloch가 그의 저서 Effective Java 에서 제공했습니다 . 그건 그렇고, 그 책은 매우 훌륭하고 Java 개발자라면 반드시 읽어야 할 책입니다. Enum 클래스 사용 방법 - 2Java 1.5의 릴리스와 함께 언어는 이러한 상황에 대한 기성 솔루션을 얻었습니다. Java Enums . Java의 Enum 도 클래스입니다. 이는 이와 같은 문제를 해결하기 위해 특별히 "미세 조정"됩니다. 즉, 특정 제한된 범위의 값을 생성합니다. Java 작성자는 이미 준비된 예제(예: C에는 enum 이 있음 )가 있으므로 최상의 변형을 만들 수 있었습니다.

그렇다면 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{제목 = '일요일'}

메모:대문자를 사용하여 Enum 필드를 지정합니다. 이들은 상수이므로 camelCase 대신 모두 대문자를 사용합니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION