Post

열거형 클래스 enum

열거형 클래스 enum

어떤 클래스가 상수만으로 만들어져 있을 경우 class로 선언하는 것이 아닌 열거형으로 선언을 하면 이 객체는 상수의 집합이라는 것을 명시적으로 나타낸다.

열거형이 가지는 값만 관리하는 것이 아니라 타입까지 관리하기 때문에 논리적인 오류를 줄일 수 있다.

특징

  • 모든 Java의 enum들은 암시적으로 java.lang.Enum Class를 확장한다.
  • 정의된 상수 하나당 하나의 인스턴스가 생성된다.
  • 데이터를 비교할 때 실제 값과 함께 타입을 체크한다.
  • 메서드와 필드를 추가하고 인터페이스를 구현할 수 있다.

정의 하는 방법

  • 기본적인 열거형의 정의
    1
    2
    3
    4
    5
    6
    7
    
      enum 열거형이름 { 
          상수명1, 상수명2, ... 
      }
    
      enum Day { 
          SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; 
      }
    
    • enum 클래스는 일반 클래스와 마찬가지로 컴파일 할 때 생성자를 자동으로 만들어준다.
  • 데이터와 메소드가 있는 열거형의 정의
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
     public enum OverTimeValue {
         THREE_HOUR(18000),
         FIVE_HOUR(30000),
         WEEKEND_FOUR_HOUR(40000),
         WEEKEND_EIGHTTHREE_HOUR(60000),
            
         private final int amount;
    
         OverTimeValue(int amount) {
             this.amount = amount;
         }
    
         public int getAmount() {
             return amount;
         }
     }
    
     ### 사용 ###
     public class OberTimeManager {
         public static void main(String[] args) {
             OverTimeValue value = OverTimeValue.FIVE_HOUR;
             System.out.println(value);
             System.out.println(value.getAmount());
         }
     }
    
     ### 결과 ###
     FIVE_HOUR
     30000
    
    • 각 상수들의 값이 지정된 것을 볼 수 있다.
    • 상수 아래에는 변수가 final로 선언되어 있다. 이 변수는 그 다음 줄에 있는 생성자에서 매개 변수로 넘겨받은 값을 할당할 때 사용된다.
    • enum 클래스도 생성자를 사용할 수는 있지만 enum 클래스의 생성자는 아무것도 명시하지 않는 package-private ()과 private만 접근제어자로 사용할 수 있다.
    • public 이나 protected를 생성자로 사용해서는 안된다. 즉 각 상수를 enum 클래스 내에서 선언할 때에만 이 생성자를 사용할 수 있다.

java.lang.Enum

  • enum 클래스는 java.lang.Enum 클래스를 상속 받는다. Enum 클래스의 생성자는 다음과 같이 선언되어 있다.

    접근 제어자메소드설명
    protectedEnum(String name, int ordinal)컴파일러에서 자동으로 호출되도록 해놓은 생성자이다. 사용자가 이 생성자를 호출할 수 없다.
    • name: enum 상수의 이름
    • ordinal : enum의 순서 (상수 선언 순서대로 0부터 증가)

제공 메소드

compareTo (E e)

  • 상수의 ordinal 값을 이용하여 두 개의 상수를 비교하는 메서드이다. 반환 값은 int이다.

values()

  • 정의된 모든 상수를 배열에 담아 반환한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      OverTimeValue[] valueList = OverTimeValue.values();
      for (OverTimeValue value : valueList) {
          System.out.println(value);
      }
    
      ### 결과 ###
      THREE_HOUR
      FIVE_HOUR
      WEEKEND_FOUR_HOUR
      WEEKEND_EIGHTTHREE_HOUR
    

valueOf()

  • 정의된 상수와 변수로 넘긴 문자열을 비교한 뒤 그 결과를 반환한다.
  • 전달된 문자열과 동일한 상수가 없을 경우 NPE가 발생한다.
    1
    2
    3
    4
    
      value = OverTimeValue.valueOf("THREE_HOUR");
    
      // NPE
      value = OverTimeValue.valueOf("aaa");
    
This post is licensed under CC BY 4.0 by the author.