열거형이란?
-JDK1.5부터 추가
-타입에 안전한 열거형: 실제 값과 타입이 일치해야 같다고 인식.(서로 다른 개념이나 동일 이름을 가진 값의 충돌을 막을 수 있음)
<정의방법>
enum 열거형이름 {상수명1, 상수명2 ...}
enum Direction {EAST, SOUTH, WEST, NORTH}
class Unit{
int x, y;
Direction dir;
void init(){
dir = Direction.EAST;
}
}
if (dir == Direction.EAST){
x++;
}else if(dir.compareTo(Direction.WEST) > 0) {
...
//첫줄에 열거할 상수의 이름을 선언
//이름은 대문자로 선언하는 것이 관례
//각 상수는 콤마로 구분(제일 마지막 상수의 끝에는 세미콜론을 붙여야 하나,
//간단히 상수의 이름만 선언할 때는 세미콜론을 붙이지 않아도 됨)
-열거형의 상수간의 비교에는 ==와 compareTo 사용 가능.(단, <,>비교 연산자 사용 불가능)
자바 enum의 특징
→ enum 생성자의 접근제어자는 private이기 때문에 외부에서 상수 추가 불가능.
→ 상수 하나당 각각의 인스턴스가 만들어지며 모두 public static final 임.
enum Currency {
PENNY(1), NICKLE(5), DIME(10), QUARTER(25);
private int value;
Currency(int value) {
this.value = value;
}
public int value() {
return value;
}
}
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Currency.DIME.value()); // 10
}
}
-values() : 열거형의 모든 상수를 배열에 담아 반환. (모든 열거형이 가지고 있는 메서드로 컴파일러가 자동으로 추가해 줌)
Direction []dArr = Direction.values();
for(DIrection d: dArr)
System.out.printf("%s =%d%n", d.name, d.ordinal());
enum Transport {
BUS, TAXI, SUBWAY;
}
public class EnumDemo {
public static void main(String[] args) {
for (var e : Transport.values()) {
System.out.println(e.name()); // BUS, TAXI, SUBWAY반환
}
Transport taxi = Enum.valueOf(Transport.class, "Taxi");
Transport bus = Transport.valueOf("BUS");
}
}
-valueOf(enumType, String name) : 지정된 열거형에서 name과 일치하는 열거형을 반환.
-모든 열거형의 조상
→모든 열거형은 Enum 클래스를 상속받기 때문에 enum type은 별도의 상속을 받을 수 없음.
<Enum 클래스에 정의된 메서드>
메서드 | 설명 |
---|---|
ClassgetDeclaringClass() | 열거형의 class 객체 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 상수가 정의된 순서를 반환(0부터시작) |
T valueOf(ClassenumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
출처: https://www.geeksforgeeks.org/enumset-class-java/
-EnumSet은 AbstractSet 클래스를 상속하고 Set 인터페이스를 구현함.
-오직 열거형 상수만을 값으로 가질 수 있고 모든 값은 같은 enum type이어야 함.
-null value를 추가하는 것을 허용하지 않음. NullPointerException을 던지는 것도 허용하지 않음.
-ordinal 값의 순서대로 요소가 저장됨.
-tread-safe하지 않음. 동기식으로 사용하려면 Collections.synchronizedMap을 사용하거나, 외부에서 동기화를 구현해야함.
-모든 메서드는 arithmetic bitwise operation을 사용하기 때문에 모든 기본 연산의 시간 복잡도가 O(1)임.