DJDU 2022. 11. 8. 21:13

열거형(enum)

  • 서로 관련된 상수를 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
더보기

서로 관련된 상수를 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공

class Card {
    static final int CLOVER = 0;
    static final int HEART = 1;
    static final int DIAMOND = 2;
    static final int SPADE = 3;
    
    static final int TWO = 0;
    static final int THREE = 1;
    static final int FOUR = 2;
    
    final int kind;
    final int num;
}
class Card {  //   0,       1,      2,      3
    enum Kind   { CLOVER, HEART, DIAMOND, SPADE }  // 열거형 Kind를 정의
    enum Value  { TWO, THREE, FOUR }               // 열거형 Value를 정의
    
    final Kind   kind;  // 타입이 int가 아닌 Kind임에 유의하자.
    final Value value;
}

if(Card.CLOVER==Card.TWO)  // true지만 false이어야 의미상 맞음. (값만 체크)

Card.CLOVER도 0이고, Card.TWO도 0이 나온다. 따라서 위 조건식의 결과는 true가 된다. 하지만, 무늬와 숫자가 같다고 볼 수 있을까? 값은 같지만 의미(타입)가 다르기 때문에 같다고 볼수 없다.

C언어에서도 열거형이 있는데, '값'만 체크한다. 반면 Java에서는 '값'과 '타입'을 체크하기 때문에 타입에 안전한 열거형을 제공한다.

if(Card.kind.CLOVER==Card.Value.TWO) {  // 컴파일 에러. 타입이 달라서 비교 불가 (값과 타입 체크)

열거형을 이용해서 상수를 정의한 경우는 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생한다.

열거형의 정의와 사용

  • 열거형을 정의하는 방법
  • 열거형 타입의 변수를 선언하고 사용하는 방법
  • 열거형 상수의 비교에 ==와 compareTo() 사용가능
더보기

열거형을 정의하는 방법

enum 열거형이름 { 상수명1, 상수명2, ... }

첫 번째 상수부터 0부터 시작하는 정수가 하나씩 부여된다.

열거형 타입의 변수를 선언하고 사용하는 방법

class Unit {
    int x, y;        // 유닛의 위치
    Direction dir;   // 열거형 인스턴스 변수를 선언
    
    void init() {
        dir = Direction.EAST;  // 유닛의 방향을 EAST로 초기화
    }
}

열거형 상수의 비교에 ==와 compareTo() 사용가능

열거형 상수에 비교연산자(>, <)을 사용할 수 없다. ⭐️

java.lang.Enum

  • 모든 열거형의 최고 조상
  • 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
  • values()와 valueOf()는 컴파일러가 자동으로 추가
더보기

모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.

values()와 valueOf()는 컴파일러가 자동으로 추가

static E[] values()
static E valueOf(String name)

Direction[] dArr = Direction.values();

for(Direction d : Arr)  // for(Direction d : Direction.values())
    System.out.printf("%s=%d%n", d.name(), d.ordinal());

Direction d = Direction.valueOf("WEST");

System.out.println(d);  // WEST
Systme.out.println(Direction.WEST==Direction.valueOf("WEST");  // true

valueOf메서드에 열거형 상수 이름을 주면, 열거형 상수를 반환한다. Direction.WEST와 같다.

예제12-5


열거형에 멤버 추가하기

  • 불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.
  • 괄호()를 사용하려면, 인스턴스변수와 생성자를 새로 추가해줘야 한다.
  • 열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체 생성 불가

더보기

불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.

괄호()를 사용하려면, 인스턴스변수와 생성자를 새로 추가해줘야 한다.

열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체 생성 불가

Direction d = new Direction(1);  // 에러. 열거형의 생성자는 외부에서 호출불가

예제12-6