열거형(enums)
열거형이란
- 값 뿐만 아니라 타입까지 관리 -> 논리적 오류는 더 줄일 수 있음
- 상수를 사용했을 경우, 상수의 값이 바뀌면 해당 상수를 사용하는 모든 소스를 다시 컴파일 해야하지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 됨
열거형의 정의와 사용
enum 열거형 이름 { 상수명1, 상수명2, ... }
- "==" 연산 사용 가능("<", ">" 사용 불가)
- compareTo() 사용 가능
- switch문 사용 가능
- case문에 열거형의 이름은 적지 않고 상수의 이름만 적어야함
void move() {
switch(dir) {
case EAST: x++;
break;
case WEST: x--;
break;
case SOUTH: y++;
break;
case NORTH: y--;
break;
}
모든 열거형의 조상 - java.lang.Enum
- Class <E> getDeclaringClass()
- String name()
- int ordinal()
- 열거형 상수가 정의된 순서를 반환.(0부터 시작)
- T valueOf(Class<T> enumType, String name)
- 지정된 열거형에서 name과 일치하는 열거형 상수를 반환
- values()
열거형에 멤버 추가하기
- 열거형 옆에 ()를 쓰고 그 안에 원하는 값을 넣어주면 됨
- 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해주어야함
enum CardType{
CHECK(0), CREDIT(1)
private final int value;
CardType(int value) { this.value = value; }
int getValue() {return vlaue;}
}
- 열거형의 생성자는 제어자가 묵시적으로 private이라서 직접 생성자 호출 안됨
열거형 상수의 이해
- 열거형 상수 하나하나가 클래스 객체들임
- 열거형 상수들은 static class들의 주소값을 가지고 있음. 따라서 "==" 비교가 가능한 것
class CardType {
staic final CardType CHECK = new CardType("CHECK");
staic final CardType CREDIT = new CardType("CREDIT");
private String name;
private CardType(String name) {
this.name = name;
}
}
- 주의할 점은 enum을 사용할 때 static 클래스 단 1개만 만들어짐. 때문에 중간에 enum 객체의 멤버를 변화시킬 경우 코드 전체 enum 멤버 쓰는 곳이 영향을 받을 수 있음 -> 따라서 enum의 멤버를 set하는 경우는 없어야함!!
출처