[자바의 정석] Ch.12 지네릭스, 열거형, 애너테이션
2. 열거형(enums)
2.1 열거형이란?
class Card{
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;
final int kind;
final int num;
}
class Card{
enum Kind { CLOVER, HEART, DIAMOND, SPADE }
enum Value { TWO, THREE, FOUR }
final Kind kind;
final Value value;
}
- 위와 같이 상수를 일일이 static final int로 선언할 필요 없이 서로 관련된 상수를 편리하게 선언. 상수를 정의할 때 사용하면 편리함.
- JDK1.5부터 추가됨.
if(Card.CLOVER == Card.TWO) // True
if(Card.Kind.CLOVER == Card.Value.TWO) //컴파일 에러
- C언어에도 열거형이 있으나 열거형의 값만 확인. 위 예제에서 Card.CLOVER와 Card.Two는 타입이 달라 False를 반환해야 하지만 True를 반환
- Java의 열거형은 '타입에 안전한 열거형(typesafe enum)'이라 Kind와 Value로 타입이 다른 두 값을 비교할 수 없음
- 상수의 값이 바뀌면 모든 소스를 다시 컴파일해야 하지만, 열거형 상수는 그러지 않아도 됨.
2.2 열거형의 정의와 사용
// enum 열거형이름 { 상수형1, 상수형2, ... }
enum iPhone { "iphone12", "iphone12Pro", "iPhone12mini", "iphone12ProMax" }
- 열거형에 정의된 상수를 사용하는 방법: 열거형이름.상수명
- 열거형 상수끼리 비교할 때 '=='는 사용할 수 있지만 '<', '>'는 사용할 수 없음. 대신 compareTo()를 이용해야 함
모든 열거형의 조상 - java.lang.Enum
메서드 | 설명 |
Collection<V> values() | 열거형의 모든 상수를 배열에 담아 반환(java.util.EnumMap) |
Class<E> getDeclaringClass() | 열거형의 Class 객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf(Calss<T> enum Type, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
- 컴파일러가 자동으로 추가하는 메서드: static E values(), static E valueOf(String name)
2.3 열거형에 멤버 추가하기
- Enum.ordinal()은 열거형 상수가 정의된 순서를 반환하긴 하지만 열거형 상수의 값으로 사용하지 않는 것이 좋음
- 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적으면 그 값을 사용할 수 있음.
- 값을 추가할 때는 열거형 상수를 모두 정의한 다음 다른 멤버를 추가하고 생성자 추가
- 이 때 열거형의 생성자는 묵시적으로 private이기 때문에 열거형의 객체를 생성할 수 없음.
- 외부에서 이 값을 사용하기 위해서 getValue()를 추가
- 열거형 상수에 여러 값을 지정할 땐 그에 맞는 변수와 생성자를 추가해야 함
열거형에 추상 메서드 추가하기
- 열거형에 추상메서드를 선언하면 각 열겨형 상수가 이 추상메서드를 구현해야 함
2.4 열거형의 이해
// 열거형 상수는 하나하나가 Direction 객체
enum Direction { EAST, SOUTH, WEST, NORTH }
// 위 정의를 클래스로 정의하면 아래와 같음
class Direction {
static final Direction EAST = new Direction("EAST");
static final Direction SOUTH = new Direction("SOUTH");
static final Direction WEST = new Direction("WEST");
static final Direction NORTH = new Direction("NORTH");
private String name;
private Direction(String name){
this.name = name;
}
}
- 일종의 객체이므로 그 값은 객체의 주소이기 때문에 '=='로 비교할 수 있음