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 (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-13] 쓰레드(Thread) (0) | 2021.07.06 |
---|---|
[Java-12] 애너테이션(Annotation) (0) | 2021.07.02 |
[Java-12] 지네릭스(Generics) (0) | 2021.07.02 |
[Java] BufferedReader와 BufferedWriter (0) | 2021.06.13 |
[Java-11] 컬렉션 프레임웍 - HashMap, TreeMap, Properties, Collections (0) | 2021.06.07 |