Language/Java

[Java] 열거형 클래스, Enum

KAispread 2022. 6. 1. 22:04
728x90
반응형

JDK 1.5 부터 도입된 'Enum'은 클래스의 일종으로, 열거형 클래스라고도 불린다.
Enumeration(셈, 계산, 열거)이라는 단어의 앞부분을 따서 만들어졌으며,
Enum 클래스에 상수를 선언할 수 있고 선언된 상수는 수정이 불가능하다.


 

  Enum 선언  

Enum은 클래스 외부에도 선언할 수 있고, 클래스 내부에도 선언할 수 있다.
선언 할 때의 방법은 접근제어자 enum "enum클래스 명" 으로 선언하면 된다.
이후 내부에 상수를 선언하는데 상수명을 대문자로 사용하는 것이 관례이며,
콤마 , 로 연결하여 상수를 선언하면 된다. 

클래스 내부

public class Cafe {

   public enum Coffee {  // Enum 클래스 선언 
      AMERICANO,
      CAPPUCCINO,
      CAFELATTE,
   }
   
   public static void main(String[] args) {
   }
}

예제 코드에서 Coffee라는 Enum 클래스를 선언하고
그 안에 AMERICANO, CAPPUCCINO, CAFELATTE 라는 상수를 선언했다.

 

클래스 외부

public enum Coffee {  // Enum 클래스 선언
   AMERICANO,
   CAPPUCCINO,
   CAFELATTE,
}

클래스 외부에 enum 파일을 따로 생성하여 관리할 수도 있다.
Enum 파일의 확장자는 .java이며, 컴파일한 파일의 확장자도 .class로 클래스와 동일하다.

 

 

  Enum 객체 생성  

Enum 객체를 생성하는 방법은 간단하다.
"Enum 클래스 명.상수 이름" 으로 객체를 생성할 수 있다.

 

public class Cafe {

   public enum Coffee {
      AMERICANO,
      CAPPUCCINO,
      CAFELATTE,
   }
   
   public int getCoffeeValue(Coffee type) {  //Enum 상수를 매개변수로 받음
      switch(type) {
      case AMERICANO:
         return 1500;
      case CAPPUCCINO:
         return 2300;
      case CAFELATTE:
         return 2000;
      default:
         return 0;
      }
   }
   
   public static void main(String[] args) {
      Cafe sample = new Cafe();
      System.out.println(sample.getCoffeeValue(Coffee.AMERICANO));
   }
}

위 예제 코드는 getCoffeeValue 메소드에서 Enum 상수를 파라미터로 전달받아,
각 Enum 상수에 따라 가격을 리턴하고, 이를 출력하는 코드이다.
예제 코드의 main 메소드에서 Coffee.AMERICANO 만으로 Enum 객체를 메소드의 파라미터로 넘겨주는 모습을 볼 수 있다.
이를 변수로 선언하고 싶다면 아래와 같이 사용하면 된다.

Coffee TypeOfCoffee = Coffee.AMERICANO;

 

 

  Enum 상수에 값을 지정 할 수 있다.  

위 예제 코드를 Enum 상수에 값을 지정함으로써 보다 간결하게 만들 수 있다.
다음 Enum 코드를 보자.

public enum Coffee {
   AMERICANO(1500),
   CAPPUCCINO(2300),
   CAFELATTE(2000);
      
   private final int value;
   Coffee(int i) {  // Enum 생성자
      this.value = i;
   }
   public int getValue() { // Enum 상수 값을 불러오기 위한 메소드
      return value;
   }
}

Enum 상수에 값을 지정하기 위해선 소괄호 () 안에 값을 적어주면 된다.

또한, 값을 지정하기 위해선 필수적으로 생성자가 필요하다.
이 생성자는 Enum 객체 생성 시 객체에 값을 저장하기 위한 용도로 실행된다.
(접근제어자는 private, package-private만 가능)

만약 Coffee.AMERICANO로 Enum 객체를 생성했다면
컴파일러에서 자동으로 생성자를 실행하여 AMERICANO에 저장된 1500이라는 값을
private final int value 에 저장한다.
따라서, 이 Enum 객체의 getValue() 메소드를 실행하면 1500이라는 값이 리턴되는 것이다.

 

public class Cafe {

   public enum Coffee {
      AMERICANO(1500),
      CAPPUCCINO(2300),
      CAFELATTE(2000);
      
      private final int value;
      Coffee(int i) {
         this.value = i;
      }
      public int getValue() {
         return value;
      }
   }
   
   public static void main(String[] args) {
      System.out.println(Coffee.AMERICANO.getValue());
      // 1500 출력
   }
}

 

다음과 같이 상수에 여러 값을 저장해도 된다.

public enum Coffee {
   AMERICANO(1500, true, "Y"),
   CAPPUCCINO(2300, true, "Y"),
   CAFELATTE(2000, false, "N");
      
   private final int value;
   private final boolean discount;
   private final String count;
   Coffee(int value, boolean discount, String count) {
      this.value = value;
      this.discount = discount;
      this.count = count;
   }
   public int getValue() {
      return value;
   }
   public boolean getDiscount() {
      return discount;
   }
   public String getCount() {
      return count;
   }
}

 

 

  Enum 메소드  

Enum 객체에서 사용할 수 있는 메소드에 대해 알아보자.

Object의 메소드인 hashCode(), equals() 메소드는 Override 할 수 없고,
toString() 메소드는 Override 하여 사용할 수 있다.

  • equals() : 두 Enum 객체가 같은 상수를 가지는지 판별한다.
public class Cafe {

   public enum Coffee {
      AMERICANO(1500),
      CAPPUCCINO(2300),
      CAFELATTE(2000);
      
      private final int value;
      Coffee(int i) {
         this.value = i;
      }
      public int getValue() {
         return value;
      }
   }
   
   public static void main(String[] args) {
      Cafe sample = new Cafe();
      Coffee Cof1 = Coffee.AMERICANO;
      Coffee Cof2 = Coffee.AMERICANO;
      Coffee Cof3 = Coffee.CAFELATTE;
      System.out.println(Cof1.equals(Cof3));
      // false
      System.out.println(Cof1.equals(Cof2));
      // true
   }
}

 

 

메소드 내용
compareTo(E e) 매개 변수로 받은 enum 객체 상수와의 순서차이를 리턴한다.
getDeclaringClass() 클래스 타입의 enum을 리턴한다.
name() 상수의 이름을 리턴한다.
ordinal() 상수의 순서를 리턴한다.
valueOf() static 메소드로 enum에 선언된 모든 상수를 배열로 리턴한다.

 

  • compareTo() : Enum은 선언된 순서대로 상수들의 순서가 정해진다. compareTo 메소드는 이 상수의 순서 차이를 리턴한다. 같은 상수라면 '0', 호출한 객체의 상수가 매개변수로 받은 상수보다 앞에있다면 음수(-)를 뒤에 있다면 양수를(+) 리턴한다.
public class Cafe {

   public enum Coffee {
      AMERICANO(1500),
      CAPPUCCINO(2300),
      CAFELATTE(2000);
      
      private final int value;
      Coffee(int i) {
         this.value = i;
      }
      public int getValue() {
         return value;
      }
   }
   
   public static void main(String[] args) {
      Coffee Cof1 = Coffee.AMERICANO;
      Coffee Cof3 = Coffee.CAFELATTE;
      System.out.println(Cof1.compareTo(Cof3));
      // -2 출력
   }
}

 

  • ordinal() : Enum 객체 상수의 순서를 리턴한다. 배열과 같이 첫번째 상수는 0부터 시작하여 1씩 커진다. 
public class Cafe {

   public enum Coffee {
      AMERICANO(1500),
      CAPPUCCINO(2300),
      CAFELATTE(2000);
      
      private final int value;
      Coffee(int i) {
         this.value = i;
      }
      public int getValue() {
         return value;
      }
   }
   
   public static void main(String[] args) {
      Coffee Cof1 = Coffee.AMERICANO;
      Coffee Cof3 = Coffee.CAFELATTE;
      System.out.println(Cof1.ordinal());
      // 0 출력
      System.out.println(Cof3.ordinal());
      // 2 출력
   }
}

 

  • name() : Enum 객체 상수를 리턴한다.
public static void main(String[] args) {
   Coffee Cof1 = Coffee.AMERICANO;
   System.out.println(Cof1.name());
   // AMERICANO 출력
}

 

  • value() : Enum에 선언된 모든 상수를 Enum 자료형의 배열로 리턴한다.
public static void main(String[] args) {
   Coffee [] CofffeeArray = Coffee.values();
   for(Coffee cof: CofffeeArray) {
      System.out.print(cof+" ");
      // AMERICANO CAPPUCCINO CAFELATTE 출력
   } 
}

 

 

 

참고
ㆍ"자바의 신 vol.1", 이상민 저자

 

728x90
반응형