JAVA

[Java] enum(열거형)

SangRok Jung 2022. 8. 3. 13:51
반응형

enum(열거형)


관련된 상수들을 같이 묶어 놓은것

Java는 타입에 안전한 열거형을 제공한다.

 

 

▷ 아래의 코드는 상수가 많아 불편함이 발생한다.

public 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;
}

 

 

 

▷ 위와 같은 상황에 열거형을 이용하여 간단히 상수를 선언할 수 있다.

public class Card{
    //          0       1       2       3
    enum Kind {CLOVER, HEART, DIAMOND, SPADE};
    enum Value {TWO, THREE, FOUR};

    final Kind kind;
    final Value value;

    if(Card.CLOVER == Card.TWO)     // true지만 false가 의미상 맞다.
    if(Card.kind.CLOVER == Card.Value.TWO) // 컴파일에러. 타입이 달라서 비교 불가.
}

 

 

 

 

 

 

 

 

▶ 열거형의 정의와 사용

▷ 열겨형의 정의

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

 

 

▷ 열거형의 사용

  • 열거형 상수간에 비교에는 '=='를 사용할 수 있다.
  • '>', '<'와 같은 비교 연산자는 사용할 수 없다.
  • compareTo()가 사용 가능하다.

 

 

 

 

 

 

 

 

▶ 열거형의 조상 - Java.lang.Enum

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

메서드 설명
Class<E> getDeclaringClass() 열거형의 Class객체를 반환
String name() 열거형 상수의 이름을 문자열로 반환
int ordinal() 열거형 상수가 정의된 순서를 반환(0부터 시작)
T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환

 

 

▷ values(), valueOf()는 컴파일러가 자동으로 추가한다.

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

Direction[] dArr = Direction.values();

for(Direction d : DArr){
    System.out.println("%s=%d%n", d.name(), d.ordinal());
}

values()는 열거형 Driection에 정의된 모든 상수를 출력하는데 사용한다.

valueOf(String name)는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을수 있게 한다.

 

 

 

▷예제

enum Direction { EAST, SOUTH, WEST, NORTH}

public class ex {
    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==d2);
        System.out.println(d1.equals(d3));
        System.out.println(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(1), SOUTH(5), WEST(-1), NORTH(10)};

 

 

 

 

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

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

    private final int value;

    Direction(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
};

 

 

 

 

▷ 열거형의 생성자는 외부에서 호출이 불가하다.

Direction d = new Direction(1);

 

 

 

 

▷ 예제

enum Direction2{
    EAST(10, ">"), SOUTH(20, "V"), WEST(3, "<"), NORTH(4, "^");

    private static final Direction2[] DIR_ARR = Direction2.values();
    private final int value;
    private final String symbol;

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

    public int getValue() {
        return value;
    }
    public String getSymbol() {
        return symbol;
    }

    public static Direction2 of(int dir){
        if (dir < 1 || dir > 4){
            throw new IllegalArgumentException("Invalid value : " + dir);
        }
        return DIR_ARR[dir - 1];
    }
}
반응형

'JAVA' 카테고리의 다른 글

[Java] Coding Test (Lotto)  (0) 2022.08.04
[Java] Annotation  (0) 2022.08.04
[Java] Generic Programming  (0) 2022.08.01
[Java] WildCard  (0) 2022.08.01
[Java] Collections Framework 예제  (0) 2022.07.28