본문 바로가기

프로그래밍/Java

Java_열거형(enum)_열거형의 정의와 사용, 열거형의 조상, 열거형에 멤버 추가

반응형

- 열거형(enum)

: 열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있는 방법이다.

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

→ 일반적으로 상수를 선언할 때 static final을 붙여 사용하는데, 이처럼 상수가 많을 때는 코드가 불필요하게 길어진다.

 

이럴 때, 열거형을 이용하면 간단히 상수를 선언할 수 있다. 

class Card {
    enum Kind {CLOVER, HEART, DIAMOND, SPADE}
    enum Value {TWO, THREE, FOUR}
    
    final Kind kind;
    final Value value;
}

→ 따로 값을 정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당된다.

(CLOVER의 값은 0 HEART는 1 DIAMOND는 2 SPADE 3으로 할당됨.)

 

if(Card.Kind.CLOVER==Card.Value.TWO)	//컴파일 에러 발생. 타입이 달라서 불가

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

 

 

 

 

- 열거형의 정의와 사용

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

→ 열거형을 정의하는 방법은 다음과 같이 괄호 {}안에 상수의 이름을 나열하기만 하면 된다. 

 

enum Direction { EAST, SOUTH, WEST, NORTH }

class Unit {
    int x, y;
    Direction dir;
    
    void init() {
        dir=Direction.EAST;
    }
}

→ 열거형에 정의된 상수를 사용하는 방법은 '열거형이름.상수명'이다. 

 

if(dir==Direction.EAST) {
    x++;
} else if(dir>Direction.WEST) {	//에러. 열거형 상수에 비교연산자 사용불가
    ...
} else if(dir.compareTo(Direction.WEST)>0) {	//compareTo()는 가능
    ...
}

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

 

 

 

 

- 열거형의 조상 - java.lang.Enum

: 모든 열거형의 조상은 java.lang.Enum이다.

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

 

이외에도 values()처럼 컴파일러가 모든 열거형에 자동적으로 추가해주는 메서드가 두 개 더 있다. 

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

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

 

 

 

 

- 열거형 예제

enum Direction { EAST, SOUTH, WEST, NORTH }

class JavaJungsuk_enum {
    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(d3) ? "+(d1.compareTo(d3)));
        System.out.println("d1.compareTo(d2) ? "+(d1.compareTo(d2)));
        
        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());
    }
}
결과
d1=EAST
d2=WEST
d3=EAST
d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3

→ switch문에서 case Direction.EAST라고 쓸 수 없다. 

→ .values()는 열거형의 모든 상수를 반환한다.

 

 

 

 

- 열거형에 멤버 추가하기

: 열거형 상수의 값이 불규칙적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.

 

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

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

이때 주의할 점은 먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야 한다는 것이다. 

반응형