열거형
: 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.
JDK1.5부터 새로 추가되었고, 자바의 열거형은 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다.
또한 기존에는 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야했지만 열거형 상수를 사용하면, 다시 컴파일 하지 않아도 된다.
* 열거형의 정의
enum 열거형이름 { 상수명1, 상수명2, ...}
* 열거형의 사용방법
enum Direction {EAST, SOUTH, WEST, NORTH}
public class Unit {
int x, y;
Direction dir;
void init(){
dir = Direction.EAST;
}
void move(){
switch (dir){
case EAST : x++; // case문에서는 상수의 이름만 적는다.
break;
case WEST : x--;
break;
case SOUTH : y++;
break;
case NORTH : y--;
break;
}
}
}
* 열거형 사용 시 주의할 점
-열거형 상수간의 비교에는 '==' 를 사용할 수 있다.
- 그러나 '<' , '>'와 같은 비교연산자는 사용 할 수 없기때문에 비교가 필요할때에는 compareTo()함수를 사용해야한다.
* Enum 클래스의 메소드
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Enum.html#method-summary
Enum (Java SE 19 & JDK 19)
Type Parameters: E - The type of the enum subclass All Implemented Interfaces: Serializable, Comparable , Constable This is the common base class of all Java language enumeration classes. More information about enums, including descriptions of the implicit
docs.oracle.com
- javadoc에는 안나와있지만
열거형의 모든 상수를 배열에 담아 반환하는 values() 메소드도 있다.
모든 열거형이 가지고 있으며 컴파일러가 자동으로 추가해준다.
* 열거형에 멤버 추가하기
- 열거형 상수의 값이 불연속적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야한다.
열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야한다.
enum Direction {
EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ';'를 추가해야한다.
// 다음과 같이 하나의 열거형 상수에 여러값을 지정할 수도 있다. 그에 맞게 변수, 생성자도 추가 필요.
// EAST(1,">"), SOUTH(5,"V"), WEST(-1,"<"), NORTH(10,"^");
private final int value; // 정수를 저장할 필드(인스턴스 변수)를 추가
Direction(int value) { this.value = value; } // 생성자를 추가
public int getValue(){ return value; }
}
* 열거형에 추상 메서드 추가하기
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로 해야 각 상수에서 접근 가능.
Transportation(int basicFare){
BASIC_FARE = basicFare;
}
public int getBasicFare(){return BASIC_FARE;}
}
위 예시에는 추상메서드인 fare()를 똑같은 내용으로 구현했지만, 상수별로 다른 내용을 구현할 수도 있다.
'개발 공부 > Java & Spring' 카테고리의 다른 글
19. 쓰레드의 동기화 (0) | 2023.03.09 |
---|---|
18. 애너테이션(annotation) (0) | 2023.02.15 |
16. 해싱과 HashMap (0) | 2023.01.18 |
15. 이진 검색 트리와 TreeSet (0) | 2023.01.17 |
14.HashSet (0) | 2023.01.16 |