공부/Java

[Java-12] 열거형(Enums)

줭♪(´▽`) 2021. 7. 2. 15:17

1. 열거형(enums)이란?

- 서로 관련된 상수를 편리하게 선언하기 위한 것

- 여러 상수를 정의할 때 유용

- 자바의 열거형은 '타입에 안전한 열거형(typesafe enum)'

- 값뿐만 아니라 타입까지 체크하기 때문

- 열거형 상수를 사용하면 기존의 소스를 다시 컴파일하지 않아도 됨

 

2. 열거형의 정의와 사용

1) 열거형의 정의

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

 

2) 열거형의 사용

열거형이름.상수명

 

enum Direction { EAST, SOUTH, NORTH, WEST }

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

 

- swtich문의 조건식에서도 열거형 사용 가능

void move() {
    switch(dir) {
    	case EAST:
            x++;
            break;
        case WEST:
            x--;
            break;
        case SOUTH:
            y++;
            break;
        case NORTH:
            y--;
            break;
    }
}
    	

 

 

3) 열거형의 비교

'=='으로 비교
'<', '>' 같은 비교연산자 불가능
compareTo() 가능 -> 왼쪽이 크면 양수, 같으면 0, 오른쪽이 크면 음수 반환

 

if(dir == Direction.EAST) {
    x++;
} else if (dir > Direction.WEST) {		// Error! 비교연산자 사용 불가
    ...
} else if (dir.compareTo(Direction.WEST) > 0) {		// compareTo() 사용 가능
    ...
}

 

4) 열거형의 조상

- java.lang.Enum : 모든 열거형의 조상

 

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


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

 

 

3. 열거형에 멤버 추가하기

- 열거형 상수의 값이 불연속적인 경우, 괄호와 함께 원하는 값을 적어줌

- 지정된 값을 저장할 수 있는 인스턴스 변수 추가

- 생성자 추가 (외부에서 호출 불가 -> 묵시적으로 제어자가 private이기 때문)

- 열거형 상수 마지막에 ';' 추가

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

 

4. 열거형에 추상 메서드 추가하기

- 각 상수마다 다른 방식으로 구현해야할 때, 추상 메서드를 넣음

- 각 열거형 상수는 이 추상 메서드를 반드시 구현해야 함

enum Transportation {
    BUST(100) { int fare(int distance) { return distance*BASIC_FARE; }},
    TRAIN(150) { int fare(int distance) { return distance*BASIC_FARE; }},
    SHIP(100) { int fare(int distance) { return distance*BASIC_FARE; }},
    AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE; }};
    
    abstract int fare(int distance);	// 각 상수마다 반드시 구현해야하는 추상메서드
    
    protected final int BASIC_FARE;	// 각 상수마다 각각의 값을 가지는 기본요금(protected로 해야 접근 가능)
    
    Transportation(int basicFare) {
        BASIC_FARE = basicFare;
    }
    
    public int getBasicFare() { return BASIC_FARE; }
}

 

 

 

 

 

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)