반응형
열거형이란?
- 서로 관련된 상수를 편리하게 선언하기 위한 것, 여러 상수를 정의할때 사용하면 유용
- JDK1.5부터 추가 C언어의 열거형보다 더 향상된것 -> 자바의 열거형은 타입도 관리 -> 논리적 오류 줄임
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIAMOND = 2;
static final int SPADE = 3;
static final int TWO = 0;
static final int THREE = 1;
static final int FOUR = 2;
enum Kind { CLOVER, HEART, DIAMOND, SPADE} // 열거형 kind를 정의
enum Value { TWO, THREE, FOUR } // 열거형 Value를 정의
final Kind kind;
final Value value;
- 자바의 열거형은 '타입에 안전한 열거형(typesafe enum)' 이라서 실제 값이 같아도 타입이 다르면 컴파일 에러 발생
- 타입에 안전하다는 이유
💡 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야 하지만, 열거형 상수를 사용하면, 다시 컴파일하지 않아도 된다.if(Card.CLOVER == Card.TWO) // true지만 false이어야 의미상 맞음. if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러. 값은 같지만 타입이 다름
정의와 사용
열거형 정의
enum 열거형이름 { 상수명1, 상수명2, ... }
사용방법
- ‘열거형이름.상수명’
- 클래스의 static변수를 참조하는것과 동일함
상수간의 비교
- == 사용 가능
- equals()가 아닌 ==로 비교가 가능하다는 것 → 빠른성능
- < > 와 같은 비교연산자 사용불가
- 대신 compareTo() 사용가능(같으면0, 왼쪽이 크면 양수, 오른쪽이 크면 음수반환
- switch문의 조건식에도 사용 가능
- 주의사항 → case 문에 열거형의 이름 x 상수의 이름만 적어야함
enum Direction { EAST, SOUTH, WEST, NORTH }
public class EnumEx1 {
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);
System.out.println(d1==d3);
System.out.println(d1.equals(d3));
// System.out.println(d1 > d3);
System.out.println(d1.compareTo(d3));
System.out.println(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());
}
}
멤버 추가
ordinal() → 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다.(이 값은 내부적인 용도로만 사용되기 위한 것)
열거형 상수의 값이 불연속적인 경우에는 이름 옆에 원하는 값을 괄호와 함께 적어주면됨.
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; }
}
- 열거형 Direction에 새로운 생성자가 추가 되었지만 열거형의 생성자는 제어자가 묵시적으로 private이기 때문에 아래와 같이 생성 불가
Direction d = new Direction(1); // 에러 . 열거형의 생성자는 외부에서 호출 불가
반응형