1. 열거형, enums
열거형은 JKD1.5 부터 추가된 타입으로 열거형이 갖는 값뿐만 아니라 타입까지 관리하여 논리적인 오류를 줄일 수 있다.
C언어의 열거형은 타입을 관리하지 않기 때문에 타입이 달라도 값이 같은 경우에 조건식 결과가 true 로 반환한다. 하지만 자바는 타입에 안전한 열거형, typesafe enum 이기 때문에 값이 같아도 타입이 다른 경우 false 를 반환한다.
2. 열거형의 정의와 사용
열거형을 정의하는 방법은 중괄호 {} 안에 상수의 이름을 나열하기만 하면 된다. 열거형에 정의된 상수를 사용하는 방법은 (열거형이름).(상수명)으로 사용할 수 있다.
enum EnumName {CONSTANT1, CONSTANT2, ... }
System.out.println(EnumName.CONSTANT1);
System.out.println(EnumName.CONSTANT2);
열거형 상수 간의 비교에는 '==' 을 사용할 수 있다. 그러가 '<', '>' 와 같은 비교 연산자는 사용할 수 없고, compareTo() 는 사용가능하다.
또한 switch 문의 조건식에도 열거형을 사용할 수 있다. 이때 case 문에 열거형 이름은 적지 않고 상수의 이름만 적어야 한다는 제약이 있다.
- java.lang.Enum
모든 열거형의 조상은 java.lang.Enum 이다. Enum 클래스에는 다음과 같은 메서드가 정의되어 있다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class 객체를 반환한다. |
String name() | 열거형 상수의 이름을 문자열로 반환한다. |
int ordinal() | 열거형 상수가 정의된 순서를 반환한다. (0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name 과 일치하는 열거형 상수를 반환한다. |
이외에도 컴파일러가 자동으로 추가해주는 메서드가 values() 와 valueOf() 가 있다.
static E values()
static E valueOf(String name)
3. 열거형에 멤버 추가
Enum 의 열거형 상수의 값을 정의할 때 다음과 같이 열거형 상수의 이름 옆에 원하는값을 괄호와 함께 적어서 표현할 수 있다.
enum Direction {EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
그리고 위와 같이 값을 저장한 형식에 맞춰 인스턴스 변수와 생성자를 새로 추가해주어야 한다. 먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야한다.
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;) // 열거형 상수에 저장된 값을 출력하는 getter
}
열거형 생성자 Direction(int value) 가 선언되었지만 이를 사용할 수는 없다. 그 이유는 열거형의 생성자는 제어자가 묵시적으로 private 으로 내부에서 사용되는 용도이기 때문이다.
열거형 상수에 하나의 값이 아닌 여러개를 저장할 수도 있다. 물론 그렇게 되는 경우 해당 상황에 맞게 생성자를 추가해주어야 한다.
enum Direction {
A(0, "A"), B(1, "B"), C(2, "C");
private int value;
private String str;
Direction(int value, String str) {
this.value = value;
this.str = str;
}
}
- 열거형에 추상 메서드 추가
필요에 따라 열거형에 추상 메서드를 선언할 수 있다. 만약 추상 메서드가 추가되는 경우에는 각 열거형 상수에서 이 추상 메서드를 구현해야 한다.
EAST(1, {
// 추상 메서드 구현
int getValue() {
return value;
}
}
abstract int getValue(); // 추상 메서드 선언
4. 열거형의 이해
열거형의 내부에 열거형 상수들이 정의되어 있다. 이때 각 상수들이 곧 열거형 클래스의 객체이다. 각각의 상수들의 값은 객체의 주소이다. 모든 열거형은 추상 클래스 Enum 의 자손이다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 프로세스와 쓰레드 (1) | 2022.03.08 |
---|---|
[JAVA] Annotation (0) | 2022.02.23 |
[JAVA] Generics (0) | 2022.02.16 |
[JAVA] Collections (0) | 2022.02.04 |
[JAVA] Properties (0) | 2022.02.04 |