Java - Enum

Dasole Kwon·2023년 1월 18일
0

Enums - 열거형이란?

  • c언어의 열거형보다 향상된 기능: 값 뿐만 아니라 타입까지 관리(논리적인 오류를 줄임)
public class Card {
    enum Kind { CLOVER, HEART, DIAMOND, SPADE }
    enum Value {TWO, THREE, FOUR }

    final Kind kind = Kind.CLOVER;
    final Value value = Value.TWO;
}
  • 상수 사용할 경우, 상수를 사용하면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야함
  • 열거형 상수를 사용하면 기존 소스를 다시 컴파일 하지 않아도 된다.

열거형의 정의와 사용
열거형 정의

  // enum 열거형 이름 { 상수명1, 상수명2, ...} 
  enum Direction { EAST, WEST, SOUTH, NORTH }

열거형 사용

  • 사용: 열거형 이름.상수명
  • 비교 연산:
    • "=="사용 (eqauls(0))
    • "compareTo()" 사용 (">", "<" 사용 불가): 왼쪽이 크면 양수, 오른쪽이 크면 음수
  • 모든 열거형의 조상 - java.lang.Enum
    • 다음과 같은 메서드가 정의되어 있음
Class<E> getDeclaringClass() // 열거형의 클래스 객체를 반환
String name() // 열거형 상수의 이름을 문자열로 반환
int ordinal() // 열거형 상수가 정의된 순서를 반환 (0부터 시작)
T valueOf(Class<T> enumType, String name) // 지정된 열거형에서 name 과 일치하는 열거형 상수를 반환
 Direction direction = Enum.ValueOf(Direction.class, "EAST");
 String name = direction.name();
  • 열거형에 모든 상수를 출력하려면...
 Direction[] directionArr = Direction.values();
 for(Direction direction : directionArr) {
   System.out.println("%s=%d\n", direction.name(), direction.ordinal());
 }

열거형에 멤버 추가하기

  • 열거형 상수에 지정한 값을 넣기 -> 인스턴스 변수와 생성자를 새로 추가해주어야 한다.
public enum Table {
  App("tbl_app"), 
  AppInfo("tbl_app_info"), 
  GameCompany("tbl_game_company");

  // 인스턴스 변수에 반드시 final 을 붙여야한다는 제약은 없지만,
  // value는 열거형 상수값을 저장하기 위한 것이므로 final을 붙였음.
  private final String value;

  private Table(String value) {
      this.value = value;
  }

  public String getValue() { return tableName; }
}
  • 열거형에 추상 메서드 추가하기
public enum Transportation {
  BUS(100) {
      @Override
      int fare(int distance) {
          return distance * BASIC_FARE;
      }
  },
  TRAIN(150) {
      int fare(int distance) {
          return distance * BASIC_FARE;
      }
  };

  /***********************************
   * 거리에 따른 요금 계산하 추상 메서드
   ***********************************/
  abstract int fare(int distance);

  // protected로 해야 각 열거형 상수에서 접근 가능
  protected final int BASIC_FARE;
  private Transportation(int basicFare) {
      BASIC_FARE = basicFare;
  }

  int fare() {
      return BASIC_FARE;
  }
}

열거형의 이해

  • 기본 Enum과 유사한 MyEnum을 만들어보는 예제
public abstract class MyEnum<T> implements Comparable<T> {

    static int id = 0;
    int ordinal;
    String name;

    public int ordinal() { return ordinal; }
    MyEnum(String name) {
        this.name = name;
        ordinal = id++; // 객체를 생성할 때마다 1씩 증가시킨다.
    }

    public int compareTo(T t) {
        return ordinal - t.ordinal(); // 에러. 타입 T에 ordinal 사용불가
    }
}

// compareTo 에러 수정 
public abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {

    //...

    public int compareTo(T t) {
        return ordinal - t.ordinal(); // 에러. 타입 T에 ordinal 사용 가능
    }
}
MyEnum<T extends MyEnum<T>>
// 타입 T가 MyEnum<T> 의 자손이어야 한다는 의미
// T가 MyEnum의 자손이므로 t.ordinal() 접근이 가능해짐
abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {

    //...
}

abstract class MyTransportation extends MyEnum {
  static final MyTransportation BUS = new MyTransportation("BUS", 100);
  static final MyTransportation TRAIN = new MyTransportation("TRAIN", 150);

  protected final int BASIC_FARE;
  private MyTransportation(String name, int basicFare) {
    super(name);   // ordinal 값 접근 가능
    BASIC_FARE = basicFare;
  }

  public String name() { return name; }
  public String toString() { return name; }
}

class EnumEX {
  public static void main(String[] args) {
    MyTransportation t1 = MyTransportation.BUS;
    MyTransportation t2 = MyTransportation.TRAIN;

    ...
  }
}

링크텍스트

0개의 댓글

관련 채용 정보