티스토리 뷰
1. enum 정의하는 방법
- 값 뿐만 아니라 타입 까지 관리한다
- 열거형 상수간의 비교에는 '==' 사용 가능
- '<', '>' 비교연산자는 사용할 수 없고, compareTo() 는 사용 가능
enum 열거형이름 { 상수명1, 상수명1, ...}
class Card {
enum Kind {CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO, THREE, FOUR}
final Kind kind;
final Value value;
}
if(Card.Kind.CLOVER == Card.Value.TWO) // false 같은 값이지만 타입이 다름
- 열거형 상수의 이름 옆에 원하는 값을 적어주면 됨
- 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야 함, 상수들 마지막에 ';'
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; }
}
- 열거형 상수에 여러 값을 지정할 수도 있음
enum Direction {
EAST(1,">"), SOUTH(2,"V"), WEST(3,"<"), NORTH(4,"^");
private fianl int value;
private final String symbol;
Direction(int value, String symbol) {
this.value = value;
this.symbol = symbol;
}
public int getValue() { return value; }
public String getSymbol() { return symbol; }
}
- 열거형에 추상 메서드를 추가 할 수 있음
enum Transportation {
BUS(100) { int fare(int distance) { return distance*BASIC_FARE;}},
TRAIN(150) { int fare(int distance) { return distance*BASIC_FARE;}},
SHIP(100) { int fare(int distance) { return distance*BASIC_FARE;}},
AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};
protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
Transportation(int basicFare) { // private Transportation(int basicFare) {
BASIC_FARE = basicFare;
}
public int getBasicFare() { return BASIC_FARE; }
abstract int fare(int distance); // 거리에 따른 요금 계산
}
2. enum이 제공하는 메소드 (values()와 valueOf())
- static E values() : 열거형의 모든 상수를 배열에 담아 반환
- int ordinal() : 열거형 상수가 정의된 순서를 정수로 반환, 0부터 시작
- String name() : 열거형 상수의 이름을 문자열로 반환
- T valueOf() : 지정된 열거형에서 name과 일치하는 열거형 상수를 반환
enum Direction {EAST, SOUTH, WEST, NORTH}
Direction[] dArr = Direction.values();
for (Direction d : dArr)
System.out.printf("%s=%d%n", d.name(), d.ordinal());
System.out.println(Direction.valueOf("WEST"));
3. java.lang.Enum
- 모든 열거형의 조상
- 미리 정의해둔 메서드를 활용할 수 있게함
- Class<E> getDeclaringClass() : 열거형의 Class 객체를 반환
- name(), ordinal(), valueOf() 도 Enum 에 정의되어 있음
4. EnumSet
- 열거형 타입과 함께 사용하기 위한 Set 구현체
- 모든 요소는 단일 열거형 타입이어야 함
- null은 허용되지 않음
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) | 비어있는 enum set을 생성 |
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) | 매개변수로 받은 타입의 모든 요소(열거형 상수들)를 포함하는 enum set 생성 |
public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) | 매개변수로 받은 EnumSet과 동일한 타입을 사용하여 동일한 요소를 포함하는 enum set 생성 |
public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) | 매개변수로 받은 Collection으로 초기화 된 enum set 생성 |
public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) | 매개 변수의 EnumSet<E> s 에 포함되어 있지 않은 요소들을 포함하는(차집합) enum set 생성 |
public static <E extends Enum<E>> EnumSet<E> of(E e1) | 매개변수로 받은 요소를 포함하는 열거형 집합을 만듦 |
public static <E extneds Enum<E>> EnumSet<E> range(E from, E to) | 매개변수 from과 to의 범위의 모든 요소를 포함하는 enum set 생성, from, to 포함 |
출처 :
자바의 정석, 남궁 성 지음
'개발 > Java Study' 카테고리의 다른 글
13주차 : I/O (0) | 2021.03.03 |
---|---|
12주차 : 애노테이션 (0) | 2021.02.24 |
10주차 : 멀티쓰레드 프로그래밍 (0) | 2021.02.20 |
9주차 : 예외 처리 (0) | 2021.02.15 |
8주차 : 인터페이스 (0) | 2021.02.15 |