JavaRush /Java Blog /Random-KO /Java의 Enum: 클래스 사용 방법

Java의 Enum: 클래스 사용 방법

Random-KO 그룹에 게시되었습니다
안녕하세요! 이번 글에서는 Java Enum에 대해 설명하겠습니다. 당신에게 임무가 주어졌다고 상상해 보세요: 요일을 구현하는 클래스를 생성하세요 . 언뜻 보면 이것에 대해 복잡한 것이 없으며 코드는 다음과 같습니다.
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='일요일'}

이 접근 방식을 통해 문제를 해결할 수 있었습니다. 우리는 일주일 중 7일을 마음대로 사용할 수 있었고 누구도 새로운 날을 만들 수 없었습니다. 이 솔루션은 Joshua Bloch가 Effective Java 라는 책에서 제안했습니다 . 그런데 이 책은 매우 훌륭하고 모든 Java 개발자가 꼭 읽어야 할 책입니다.
Enum 클래스 사용 방법 - 2
Java 1.5가 출시되면서 언어에서는 이러한 상황에 대해 미리 만들어진 솔루션인 Enum 열거형을 도입했습니다 . Enum 도 클래스입니다. 그러나 이는 우리와 유사한 문제, 즉 특정 제한된 범위의 가치 창출을 해결하기 위해 특별히 "맞춤형"되었습니다. Java 제작자는 이미 미리 만들어진 예제(예: Enum이 이미 존재하는 C 언어)를 갖고 있었기 때문에 최적의 옵션을 만들 수 있었습니다.

열거형이란 무엇입니까?

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

주의하세요:Enum 요소 의 이름은 상수이고 camelCase 가 아닌 상수로 지정되므로 대문자로 사용합니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION