열거형이란?
관련된 상수들을 같이 묶어 놓은 것으로 Java는 열거형이 갖는 값뿐만 아니라 타입까지 안전한 열거형을 제공한다. 실제 값이 같아도 타입이 다르면 조건식의 결과가 false가 된다. 이 때문에 타입에 안전하다고 하는 것이다.
// enum 열거형이름 {상수명1, 상수명2, ... }
enum Kind {CLOVER, HEART, DIAMOND, SPACE} // 열거형 Kind 정의
→ 열거형 상수 하나하나가 Kind 객체이다. 위의 열거형을 클래스로 정의한다면 아래와 같다.
class Kind {
static final Kind CLOVER = new Kind("CLOVER");
static final Kind HEART = new Kind("HEART");
static final Kind DIAMOND = new Kind("DIAMOND");
static final Kind SPACE = new Kind("SPACE");
private String name;
private Kind(String name) { this.name = name }
}
=> Kind 클래스의 static상수의 값은 객체의 주소이고 이 값이 바뀌지 않으므로 '=='로 비교가 가능한 것이다.
열거형에 정의된 상수 사용하는 방법
열거형이름.상수명
=> 클래스의 static변수를 참조하는 것과 동일하다.
=> 열거형 상수간의 비교에는 '=='을 사용할 수 있다.
=> '<', '>'와 같은 비교 연산자는 사용할 수 없으며 compareTo()는 사용가능하다.
switch문에서의 열거형
enum Direction { EAST, SOUTH, WEST, NORTH}
...
void move() {
switch(dir) {
case EAST: // Direction.EAST 라고 쓰면 안됨.
break;
case WEST:
break;
case SOUTH:
break;
case NORTH:
break;
}
}
=> case문에 열거형의 이름은 적지 않고 상수의 이름만 적어야 한다는 제약이 있다!!
모든 열거형의 조상 - java.lang.Enum
- 열거형 Direction에 정의된 모든 상수 출력하기
Direction[] dArr = Direction.values();
for(Direction d : dArr)
System.out.println("%s = %d%n", d.name(), d.ordinal());
=> values()는 열거형의 모든 상수를 배열에 담아 반환한다. 이 메서드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해준다. ordinal()은 모든 열거형의 조상인 java.lang.Enum 클래스에 정의된 것으로 열거형 상수가 정의된 순서(0부터 시작)를 정수로 반환한다.
열거형에 멤버 추가하기
Enum 클래스에 정의된 ordinal()은 내부적인 용도로만 사용되기 때문에 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다. 열거형 상수의 값이 불규칙적인 경우에는 아래와 같이 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
- 열거형에 다른 멤버 추가하기
enum Diraction {
EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 반드시 ';' 추가
private final int value; // 정수를 저장할 필드(iv)를 추가
Direction(int value) { this.value = value; } // 생성자 추가
public int getValue() { return value; } // 외부에서 얻을 수 있도록
}
* 열거형 Direction에 새로운 생성자가 추가되었지만, 열거형의 객체를 생성할 수 없다. 열거형의 생성자는 제어자가 묵시적으로 private이기 때문이다.
* 필요 시, 하나의 열거형 상수에 여러 값을 지정할 수도 있다. 다만 그에 맞게 인스턴스 변수와 생성자 등을 새로 추가해주어야 한다.
- 열거형에 추상 메서드 추가하기
enum Transportation {
BUS(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;}};
protected final int BASIC_FARE;
Transportation(int basicFare){ BASIC_FARE = basicFare; }
public int getBasicFare() { return BASIC_FARE; }
abstract int fare(int distance);
}
public class EnumEx3 {
public static void main(String[] args) {
System.out.println("BUS fare = " + Transportation.BUS.fare(100));
System.out.println("TRAIN fare = " + Transportation.TRAIN.fare(100));
System.out.println("SHIP fare = " + Transportation.SHIP.fare(100));
System.out.println("AIRPLANE fare = " + Transportation.AIRPLANE.fare(100));
}
}
[참고]
Java의 정석(남궁성 저)
'공부 > 자바' 카테고리의 다른 글
JVM 내부 구조와 메모리 영역 (2) | 2024.10.17 |
---|---|
어노테이션(Annotation) (0) | 2024.07.03 |
제네릭스(Generics) (0) | 2024.06.12 |
컬렉션 프레임워크(Collections Framework) (0) | 2024.06.10 |
예외 처리(Exception handling) (0) | 2024.06.04 |