enum1. 탄생 배경

오늘 우리는 Java에서 다른 종류의 데이터 유형인 enum. 이름은 enumerationenum 이라는 단어에서 유래했습니다 . 이 데이터 유형은 무엇이며 용도는 무엇입니까?

때때로 프로그래머는 가능한 값이 작은 고정 목록으로 제한되는 새로운 데이터 유형을 만들어야 합니다.

예를 들어, 유형은 , , , ... DayOfTheWeek값만 사용할 수 있습니다. 총 7개의 값이 있습니다. 또는 유형은 , , , ... 값만 사용할 수 있습니다. 총 12개의 값이 있습니다.MONDAYTUESDAYWEDNESDAYMonthJANUARYFEBRUARYMARCH

물론 다음과 같은 수( int유형)를 사용할 수 있습니다. 1— 월요일, 2— 화요일 등. 그러나 누군가 실수로 8or와 같은 유효하지 않은 값을 0변수에 할당할 수 있습니다.

한 프로그래머는 요일(또는 월)이 0부터 시작하여 번호가 매겨진다고 생각하고 다른 프로그래머는 번호가 1부터 시작된다고 생각하는 상황을 쉽게 가질 수 있습니다.

이것이 바로 Java가 유한한 값 집합enum 으로 구성된 데이터 유형을 도입한 이유입니다 .


2. 타입 선언

enum데이터 유형을 선언하는 방법은 다음과 같습니다.

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

여기서 TypeName는 새 유형(클래스)의 이름이며 가능한 값은 쉼표로 구분되고 중괄호로 묶입니다: Value1, Value2, Value3.

예를 들어, 우리 자신을 만들어 봅시다 DayOfTheWeek enum:

암호 메모
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
새로운 Day유형

월요일
화요일
수요일
목요일
금요일 토요일
일요일

새 유형의 변수에 값을 할당하는 방법은 다음과 같습니다.

Day day = Day.MONDAY;

예:

암호 메모
Day day = Day.FRIDAY;
System.out.println(day);
화면 출력은 다음과 같습니다.
FRIDAY


3. 방법enum

유형 enum에는 몇 가지 기본 제공 메소드가 있으며 그 중 두 가지는 매우 흥미롭습니다.

정적 values()메서드는 유형의 모든 값 배열을 반환합니다 enum.

암호 메모
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
변수 는 유형(7개 요소) days의 값을 포함하는 배열을 저장합니다. 배열의 내용을 화면에 표시합니다.Day


MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

메서드 ordinal()는 상수의 서수를 반환합니다. enum클래스 가 아닌 값 으로 호출합니다 enum.

암호 콘솔 출력
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. 클래스로 전환

실제로 여기에는 마법 같은 것이 없습니다. 컴파일러는 우리에게 약간의 구문 설탕을 제공했습니다. 컴파일 타임에 Day열거형은 일반 클래스로 변환됩니다.

코드, 단순화된 버전 메모
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayclass

정적 상수 목록 enum







의 모든 값을 포함하는 배열 특정 객체 의 값을 저장하는 변수 클래스 는 전용이므로 클래스 의 객체는 클래스 내에서만 생성될 수 있습니다 . 메서드는 개체 에서 호출해야 합니다 . 객체의 값인 필드를 반환합니다. 이 메서드는 클래스 의 모든 값이 포함된 정적 배열을 반환합니다.Day


Day

DayconstructorDayDay



ordinalDay

value


Day

클래스에서 모든 정적 메서드와 변수를 제거하면 Day다음과 같은 결과가 나타납니다.

암호 메모
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


객체 value의 값을 저장하는 변수 객체 는 생성자가 이므로 클래스 내에서만 만들 수 있습니다 . 이 메서드는 객체 의 를 반환합니다 . Day

DayDayprivate




ordinal()valueDay

즉, 여기서 무서운 일이 일어나지 않습니다. 컴파일러는 Day클래스를 만들고, 값을 나타내는 상수를 추가하고 enum, 필요한 메서드를 추가하고, 클래스 생성자를 만듭니다 private. 나중에 생성자가 어떻게 작동하는지 살펴보겠습니다.

바라건대, 이제 우리가 이런 식으로 변수에 값을 할당하는 이유가 분명해졌습니다.

Day day = Day.MONDAY;

MONDAY클래스 의 정적 필드(상수)일 뿐입니다 Day. 클래스 외부에서 정적 메서드 및 필드에 액세스할 때 필드 또는 메서드 이름 앞에 클래스 이름을 표시해야 합니다.



5. 더 많은 방법enum

모든 enum클래스에는 몇 가지 흥미로운 기능이 있습니다.

문자열로 또는 문자열에서 변환

열거형 개체를 문자열로 변환하려면 해당 toString()메서드를 호출해야 합니다.

String str = Day.MONDAY.toString();

다른 방향(문자열에서 객체로 Day)으로 변환하려면 정적 valueOf()메서드를 사용할 수 있습니다.

Day day = Day.valueOf("MONDAY");

그것은 매우 편리하고 많은 경우에 도움이 될 것입니다.

숫자로 변환하고 다시 되돌리기

enum개체를 숫자로 변환하는 방법을 이미 알고 있습니다 . ordinal()메서드를 호출합니다.

int index = Day.MONDAY.ordinal();

다른 방향(숫자에서 객체로 Day)으로 변환하려면 보다 투명한 구조가 필요합니다.

Day day = Day.values()[2];

예:

암호 메모
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Monday
월요일의 인덱스 가져오기: 0
월요일 2일 후의 요일

중요한 점:enum 값은 고정된 상수 집합이므로 == 를 사용하여 비교할 수 있습니다 . 즉, MONDAY주소가 다른 두 개의 동일한 객체를 가질 수 없습니다. 각 열거형 값의 단일 인스턴스만 존재합니다. 그리고 그것은 ==를 사용하여 enum 변수를 비교하는 것이 항상 작동한다는 것을 의미합니다.



6. 자신만의 메서드를enum

enuman은 컴파일 타임에 일반 클래스로 바뀌기 때문에 메서드를 선언할 수 있습니다. 이러한 메서드는 컴파일러가 생성하는 클래스에 간단히 추가됩니다. Day enum예를 들어 배열이 아닌 열거형 값 목록을 반환하기를 원한다고 가정합니다 .

그런 다음 다음 코드를 추가할 수 있습니다.

암호 메모
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








값 목록 뒤에는 세미콜론이 필요합니다. 개체



만들기 메서드 에서 반환된 배열에 값을 추가합니다 . 목록을 반환합니다. ArrayList

values()

이제 이 메서드를 코드에서 호출할 수 있습니다.

암호 메모
List<Day> list = Day.asList();
변수 list는 의 모든 값 목록을 저장합니다 Day enum.