본문 바로가기

하../java

ch12 열거형(enum) 열거형의 조상

열거형

- 관련된 상수들을 같이 묶어 놓은것, 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