열거형
- 관련된 상수들을 같이 묶어 놓은것, Java는 타입(값 & 타입을 체크)에 안전한 열거형을 제공
class Card{
enum kind {CLOVER, HEART, DIAMOND, SPADE} //열거형 Kind를 정의 0,1,2,3순서 상수임
enum Value {TWO, THREE, FOUR} //열거형 Value를 정의 0,1,2 상수임
final Kind kind; //타입이 int가 아닌 Kind임
final Value value;
}
if(Card.Kind.CLOVER==Card.Value.TWO) // 둘 다 0이지만 컴파일 에러 타입이 달라서 비교 자체 불가
자바의 열거형은 값과 타입 둘 다 체크
열거형의 정의와 사용
- 열거형을 정의하는 방법
enum 열거형이름 {상수명1, 상수명2, ...}
- 열거형 타입의 변수를 선언하고 사용하는 방법
class Unit{
int x, y; //유닛의 위치
Direction dir; //열거형 인스턴스 변수를 선언
void init(){
dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
}
}
- 열거형 상수의 비교에 ==와 compareTo() 사용 가능
if(dir==Direction.EAST{
x++;
} else if(dir > Direction.WEST){ //에러 열거형 상수에 비교연산자 > 사용불가
...
}else if(dir.compareTo(Direction.WEST)>0){ // compareTo()는 가능
} compareTo 왼쪽이 크면 양수 같으면 0 오른쪽이 크면 음수
열거형의 조상 - java.lang.Enum 클래스
- 모든 열거형은 Enum의 자손이며 아래의 메소드를 상속받는다.
| 메소드 | 설명 |
| Class<E> getDeclaringClass() (잘 사용안함) | 열거형 Class객체를 반환 |
| String name() | 열거형 상수의 이름을 문자열로 반환 |
| int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
| T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
-2가지 메소드가 더 있는데 values(), valueOf()는 컴파일러가 자동으로 추가
static E[] values()
static E valueOf(String name)
Direction[] dArr = Direction.values();
for(Direction d : dArr) // for(Direction d : Direction.values())
System.out.println("%s=%d%n", d.name(), d.ordinal());
enum Direction { EAST, SOUTH, WEST, NORTH } // 0 1 2 3
class Ex12_5 {
public static void main(String[] args) {
Direction d1 = Direction.EAST; //열거형타입.상수이름
Direction d2 = Direction.valueOf("WEST");
Direction d3 = Enum.valueOf(Direction.class, "EAST");
System.out.println("d1="+d1);
System.out.println("d2="+d2);
System.out.println("d3="+d3);
System.out.println("d1==d2 ? "+ (d1==d2)); //false
System.out.println("d1==d3 ? "+ (d1==d3)); //true
System.out.println("d1.equals(d3) ? "+ d1.equals(d3));
// System.out.println("d2 > d3 ? "+ (d1 > d3)); // 에러
System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3)));
System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2)));
switch(d1) {
case EAST: // Direction.EAST라고 쓸 수 없다.
System.out.println("The direction is EAST."); break;
case SOUTH:
System.out.println("The direction is SOUTH."); break;
case WEST:
System.out.println("The direction is WEST."); break;
case NORTH:
System.out.println("The direction is NORTH."); break;
default:
System.out.println("Invalid direction."); break;
}
Direction[] dArr = Direction.values();
for(Direction d : dArr) // for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
}
}
결과값
d1=EAST
d2=WEST
d3=EAST
d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3
'하.. > java' 카테고리의 다른 글
| ch12 어노테이션이란? (0) | 2021.12.25 |
|---|---|
| ch12 열거형에 멤버 추가하기 (0) | 2021.12.25 |
| ch12 제네릭 타입의 형변환 (0) | 2021.12.25 |
| ch13 스레드의 우선순위 스레드 그룹 (0) | 2021.12.24 |
| ch13 싱글 스레드와 멀티 스레드 스레드의 i/o블로킹 (0) | 2021.12.24 |