본문으로 바로가기

Java- 열거형

category 프로그래밍 언어/Java 2019. 7. 26. 16:55

1. Enums

C에 열거형이 있었지만 Java에서도 jdk1.5부터 추가되었습니다.

 

더욱 향상되었는데 그 이유는 값이 같을 뿐만 아니라 타입까지 같아야 true를 반환해주는 성질이 있습니다.

 

class Card {
  enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind 정의
  enum Value { TWO, THREE, FOUR } // 열거형 Value 정의

  final Kind kind; // 타입이 int가 아닌 Kind임에 유의
  final Value value;
}
if (Card.Kind.CLOVER == Card.Value.TWO) 

즉 타입이 다르게되면 바로 false를 반환합니다.

 

열거형의 사용법은 아래와 같습니다.

// 열거형의 정의 방법
enum EnumName { constantName1, constantName2, constantName3, }

상수의 이름만 나열하면 됩니다.

 

이를 사용하기 위해서는 열거형 인스턴스 변수로 선언하고 초기화 시키는 방향으로 진행됩니다.

class Unit {
  int x, y; // Unit의 위치

  Direction dir;  // 열거형을 인스턴스 변수로 선언

  void int() {
    dir = Direction.WEST; // Unit의 방향을 WEST로 초기화
  }
}

2. 열거형 특징

==로 비교하기 때문에 속도가 훨씬 빠릅니다.

 

비교부호는 사용할 수 없고 compareTo() 메서드를 사용할 수 있습니다. 

 

a.compareTo(b)에서 a가 b보다 크면 양수 a보다 b가 크면 음수 a와 b가 같다면 0을 반환합니다.

 

주의사항으로 switch 문에서 정의한 상수 이름만 적어줘야 오류가 생기지 않습니다.

if (dir == Direction.WEST) {
  x++;
} else if (dir > Direction.WEST) { // 에러, 열거형 상수에 비교연산자 사용불가
  // ...
} else if (dir.compareTo(Direction.WEST) > 0) { // OK, compareTO는 사용가능
  // ...
}
void move() {
  switch (dir) {
    case EAST: x++; // Direction.EAST 라고 쓰지 않음
      break;
    case WEST: x--;
      break;
    case SOUTH: y++;
      break;
    case NORTH: y--;
      break;

  }
}

3. 열거형 요소 모두 뽑기

values() 메서드로 상수를 배열에 담아서 반환 합니다.

 

그 후 for( : )을 돌려서 배열을 enum에 넣으면서 그것의 변수에 name()과 ordinal()로 상수 이름을 문자열로 반환하고 순서를 반환할 수 있습니다.

Direction[] dArr = Direction.values();

for (Direction d : dArr)
  System.out.printf("%s=%d%n", d.name(), d.ordinal());
public class EnumEx1 {
    public static void main(String[] args) {
        Direction d1 = Direction.EAST;
        Direction d2 = Direction.valueOf("WEST");
        Direction d3 = Enum.valueOf(Direction.class, "EAST");

        System.out.println("d1 = " + d1);
        System.out.println("d2 = " + d2);
        System.out.println("d3 = " + d3);

        System.out.println("d1 == d2 ? " + (d1 == d2));
        System.out.println("d1 == d3 ? " + (d1 == d3));
        System.out.println("d1.equals(d3) ? " + d1.equals(d3));
        // System.out.println("(d2 > d3) ? " + (d2 > d3)); // 에러
        System.out.println("d1.compareTo(d2) ? " + d1.compareTo(d2));
        System.out.println("d1.compareTo(d3) ? " + d1.compareTo(d3));

        switch (d1) {
            case EAST:
                System.out.println("The direction is EAST.");
                break;
            case SOUTH:
                System.out.println("The direction is SOUTH.");
                break;
            case WEST:
                System.out.println("The direction is WEST.");
                break;
            case NORTH:
                System.out.println("The direction is NORTH.");
                break;
            default:
                System.out.println("Invalid direction.");
                break;
        }

        Direction[] dArr = Direction.values();
        for (Direction d : dArr)
            System.out.printf("%s=%d%n", d.name(), d.ordinal());
    }
}

enum Direction {
    EAST, SOUTH, WEST, NORTH
}
d1 = EAST
d2 = WEST
d3 = EAST
d1 == d2 ? false
d1 == d3 ? true
d1.equals(d3) ? true
d1.compareTo(d2) ? -2
d1.compareTo(d3) ? 0
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3

 


4. 열거형 멤버 추가

enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }

ordinar()로 따로 순서 반환해서값을 지정할 수 있찌만 비효율적이기 때문에 위에 처럼 직접 값을 지정해줍니다.

 

마찬가지로 생성자와 getter를 생성해주고 정수를 저장할 필드를 추가해줍니다. 

enum Direction {

  EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 상수 마지막에는 항상 세미콜론을 꼭 붙여야한다.

  private final int value; // 정수를 저장할 필드를 추가, 열거형 상수를 저장하기 위해 final을 붙임

  // 생성자 추가
  Direction(int value) {
    this.value = value;
  }

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

}
// 열거형 상수에 숫자와 방향을 나타내는 기호 두가지를 지정
  EAST(1, ">"), SOUTH(5, "V"), WEST(-1, "<"), NORTH(10, "^");

  private final int value; // 정수를 저장할 필드
  private finla String symbol; // 기호를 저장할 필드

  Direction(int value, String symbol) {
    this.value = value;
    this.symbol = symbol;
  }

  public int getValue() {
    return value;
  }

  public String getSymbol() {
    return symbol;
  }

}

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

자바 공부(취업 준비)  (0) 2019.07.29
Java - 람다  (0) 2019.07.28
Java - 제네릭  (0) 2019.07.25
Java- 컬렉션 프레임워크(Collections)  (0) 2019.07.24
Java- 컬렉션 프레임워크(Properties)  (0) 2019.07.23