Java
Java 열거형(Enum)
코드깎는머슴
2024. 2. 26. 16:41
728x90
반응형
열거형
서로 관련된 상수를 편하게 선언하기 위한 것, 상수를 정의 할 때 사용
C는 타입이 달라도 값이 같으면 조건식이 참이지만, 자바는 컴파일 에러다
열거형 정의와 사용
enum 열거형이름 {상수명1, 상수명2, ...}
동서남북 4방향
enum Direction{EAST, SOUTH, WEST, NORTH}
사용법은 '열거형이름'.'상수명'
class Unit{
int x, y;
Direction dir;
void init(){
dir = Direction.EAST;
}
}
열거형 상수간 비교
'==' 사용 가능
equals()가 아닌 ==로 가능하다는 것은 그만큼 빠르다는 의미다.
하지만 <, >같은 비교연산자는 사용할 수 없고, compareTo()는 사용 가능하다.
비교 대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환
enum{
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
private final int value;
Direction(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
열거형의 인스턴스 변수는 반드시 final이어야 한다는 제약은 없지만, value는 열거형 상수의 값을 지정하기 위한 것이므로 붙였다
Direction d = new Direction(1); //에러
생성자를 만들어놧지만 열거형의 생성자는 묵시적으로 private라서 에러다
다음과 같이 하나의 열거형 상수에 여러값을 지정할 수도 있다.
다만 그에 맞게 인스턴스 변수와 생성자도 추가해야 한다
enum{
EAST(1, 1), SOUTH(5, 5), WEST(-1, -1), NORTH(10, 10);
private final int value;
private final int value2;
Direction(int value, int value2){
this.value = value;
this.value2 = value2;
}
public int getValue(){
return value;
}
public int getValue2(){
return value2;
}
}
열거형의 추상메서드
enum Transportation{
BUS(100), TRAIN(150), SHIP(100), AIRPLANE(300);
private final int BASIC_FARE;
private Transportation(int basicFare){
BASIC_FARE = basicFare;
}
int fare(){ // 운송 요금 반환
return BASIC_FARE;
}
}
거리에 따라 요금을 계산하는 방식이 각 운송 수단마다 다를 것이기 때문에 이것만으론 부족하다.
이럴 때, 열거형에 추상 메서드를 선언하면 각 열거형 상수가 이 추상 메서드를 반드시 구현해야 한다
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; }};
abstract int fare(int distance); // 거리에 따른 요금을 계산하는 추상 메서드
protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근 가능
private Transportation(int basicFare){
BASIC_FARE = basicFare;
}
int fare(){ // 운송 요금 반환
return BASIC_FARE;
}
}
위에선 추상 메서드 fare를 똑같이 구현해놨지만, 다르게 구현될 수도 있게 하려고 추상 메서드로 선언한 것이다.
728x90
반응형