[JAVA] 열거형(enum)

DANI·2023년 12월 5일
0

JAVA를 공부해보자

목록 보기
18/29
post-thumbnail

📕 열거형(enums) 이란?

Enum이라는 것은 Enumeration의 앞글자로 열거형이라는 뜻을 가지고 있으며 서로 연관되거나 또는 관련이 있는 상수들의 집합을 의미한다.


Calendar 클래스에서는 enums 클래스가 없어서 모든 필드가 상수(final)로 정의되어있음(JDK1.5부터 추가)


https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Calendar.html



📑 열거형의 장점

  • 값뿐만 아니라 타입까지 체크하여 타입에 안전하다
  • 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야한다. 그러나 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 된다.


🔍 Enum 클래스 예시


✅ ChronoField 클래스

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/temporal/ChronoField.html

✅ ChronoUnit 클래스

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/temporal/ChronoUnit.html



📝 Enum 정의와 사용

🔴 정의

enum 열거형이름 { 상수명1, 상수명2, ... }
  • 상수는 정적 상수(public static final) 로 정의됨

🔴 사용

열거형이름.상수명1

클래스의 static 변수를 참조하는 것과 동일하다.



🔴 예시 1

/**
* 모든 열거형의 상위 클래스 - java.lang.Enum
*/
package enums1;
import java.util.Arrays;
public class DirectionMain {
  public static void main(String[] args) {
      /**
       * values()는 열거형의 모든 상수를 배열에 담아서 반환
       * 이 메서드는 모든 열거형이 가지고 있는 것으로
       * 컴파일러가 자동으로 추가해준다
       */
      Direction[] arr = Direction.values();
      Arrays.stream(arr).forEach(System.out::println);
      for(Direction d : arr){
          System.out.println(d.name() + ", " + d.ordinal());
			// .ordinal() -> 인덱스값 반환
			// .name() -> 이름
      }
  }
}

🔵 실행결과

EAST
WEST
NORTH
SOUTH
EAST, 0
WEST, 1
NORTH, 2
SOUTH, 3

enum 클래스는 java.lang.Enum을 상속하고 있는 클래스


📝 열거형에 멤버 추가하기

1. 열거형 상수의 값이 불연속적인 경우에는 다음과 같이 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함게 적어주면 된다.(끝에 ";" 추가)

public enum Direction {
  EAST(1),
  WEST(2),
  NORTH(-3),
  SOUTH(5);
}

2. 지정된 값을 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다.

public enum Direction {
  EAST(1),
  WEST(2),
  NORTH(-3),
  SOUTH(5);

	// 인스턴스 변수 추가
  private final int value;

	// 생성자 추가 (외부에서 호출 불가 묵시적 private타입)
  Direction(int i) {
      this.value = i;
  }

	// 외부에서 값을 얻어올 수 있도록 추가
  public int getValue(){
      return value;
  }
}

열거형 상수에 여러 값을 지정할 수 있다. 단, 변수도 추가해야하며 생성자에도 추가해줘야 한다.



💾 열거형에 추상메서드 추가하기

package enums;

public enum Transportation {
  BUS("버스", 1400) {
      @Override
      public int getFee(int person) {
          return fee * person;
      }
  },
  SUBWAY("지하철", 1400) {
      @Override
      public int getFee(int person) {
          return fee * person;
      }
  },
  TAXI("택시", 4800) {
      @Override
      public int getFee(int person) {
          return fee * person;
      }
  };

  // enum 상수는 상수기 때문에 값이 바뀌지 않는 것이 특징
  // 생성자를 오버로딩할 수 있다.
  private final String title;

  // private으로 할 경우 추상메소드 구현시 변수를 불러올 수 없음
  protected final int fee;

  Transportation(String title, int fee) {
      this.title = title;
      this.fee = fee;
  }

  public String getTitle(){
      return title;
  }

  // Enum 클래스는 추상클래스기 때문에 추상메서드를 정의할 수 있다.
  public abstract int getFee(int person);
}

💾 Main 클래스

package enums;
public class Main1 {
  public static void main(String[] args) {
      String str = "TAXI";

      Transportation trans = Enum.valueOf(Transportation.class, str); // 문자열 -> Enum상수로 변환
      System.out.println(trans);

      // 모든 생성자는 private
      System.out.println(Transportation.BUS instanceof Transportation);

      Transportation trans1 = Transportation.TAXI;
      System.out.println(trans1.getTitle());
      System.out.println(trans.getFee(5));
  }
}

🔵 실행결과

TAXI
true
택시
24000

Enum.valueOf(클래스, "상수") -> 상수를 원래 문자형으로 바꿔줌
valueOf() -> 컴파일러가 자동으로 추가해주는 메서드
열거형이름.valueOf("상수") -> 문자열로 반환해줌

0개의 댓글