1. Enums
C에 열거형이 있었지만 Java에서도 jdk1.5부터 추가되었습니다.
더욱 향상되었는데 그 이유는 값이 같을 뿐만 아니라 타입까지 같아야 true를 반환해주는 성질이 있습니다.
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind 정의
enum Value { TWO, THREE, FOUR } // 열거형 Value 정의
final Kind kind; // 타입이 int가 아닌 Kind임에 유의
final Value value;
}
if (Card.Kind.CLOVER == Card.Value.TWO)
즉 타입이 다르게되면 바로 false를 반환합니다.
열거형의 사용법은 아래와 같습니다.
// 열거형의 정의 방법
enum EnumName { constantName1, constantName2, constantName3, }
상수의 이름만 나열하면 됩니다.
이를 사용하기 위해서는 열거형 인스턴스 변수로 선언하고 초기화 시키는 방향으로 진행됩니다.
class Unit {
int x, y; // Unit의 위치
Direction dir; // 열거형을 인스턴스 변수로 선언
void int() {
dir = Direction.WEST; // Unit의 방향을 WEST로 초기화
}
}
2. 열거형 특징
==로 비교하기 때문에 속도가 훨씬 빠릅니다.
비교부호는 사용할 수 없고 compareTo() 메서드를 사용할 수 있습니다.
a.compareTo(b)에서 a가 b보다 크면 양수 a보다 b가 크면 음수 a와 b가 같다면 0을 반환합니다.
주의사항으로 switch 문에서 정의한 상수 이름만 적어줘야 오류가 생기지 않습니다.
if (dir == Direction.WEST) {
x++;
} else if (dir > Direction.WEST) { // 에러, 열거형 상수에 비교연산자 사용불가
// ...
} else if (dir.compareTo(Direction.WEST) > 0) { // OK, compareTO는 사용가능
// ...
}
void move() {
switch (dir) {
case EAST: x++; // Direction.EAST 라고 쓰지 않음
break;
case WEST: x--;
break;
case SOUTH: y++;
break;
case NORTH: y--;
break;
}
}
3. 열거형 요소 모두 뽑기
values() 메서드로 상수를 배열에 담아서 반환 합니다.
그 후 for( : )을 돌려서 배열을 enum에 넣으면서 그것의 변수에 name()과 ordinal()로 상수 이름을 문자열로 반환하고 순서를 반환할 수 있습니다.
Direction[] dArr = Direction.values();
for (Direction d : dArr)
System.out.printf("%s=%d%n", d.name(), d.ordinal());
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 ? " + (d1 == d2));
System.out.println("d1 == d3 ? " + (d1 == d3));
System.out.println("d1.equals(d3) ? " + d1.equals(d3));
// System.out.println("(d2 > d3) ? " + (d2 > d3)); // 에러
System.out.println("d1.compareTo(d2) ? " + d1.compareTo(d2));
System.out.println("d1.compareTo(d3) ? " + d1.compareTo(d3));
switch (d1) {
case 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)
System.out.printf("%s=%d%n", d.name(), d.ordinal());
}
}
enum Direction {
EAST, SOUTH, WEST, NORTH
}
d1 = EAST
d2 = WEST
d3 = EAST
d1 == d2 ? false
d1 == d3 ? true
d1.equals(d3) ? true
d1.compareTo(d2) ? -2
d1.compareTo(d3) ? 0
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3
4. 열거형 멤버 추가
enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
ordinar()로 따로 순서 반환해서값을 지정할 수 있찌만 비효율적이기 때문에 위에 처럼 직접 값을 지정해줍니다.
마찬가지로 생성자와 getter를 생성해주고 정수를 저장할 필드를 추가해줍니다.
enum Direction {
EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 상수 마지막에는 항상 세미콜론을 꼭 붙여야한다.
private final int value; // 정수를 저장할 필드를 추가, 열거형 상수를 저장하기 위해 final을 붙임
// 생성자 추가
Direction(int value) {
this.value = value;
}
// 외부에서 value 값을 얻을 수 있도록 메서드 추가
public int getValue() {
return value;
}
}
// 열거형 상수에 숫자와 방향을 나타내는 기호 두가지를 지정
EAST(1, ">"), SOUTH(5, "V"), WEST(-1, "<"), NORTH(10, "^");
private final int value; // 정수를 저장할 필드
private finla String symbol; // 기호를 저장할 필드
Direction(int value, String symbol) {
this.value = value;
this.symbol = symbol;
}
public int getValue() {
return value;
}
public String getSymbol() {
return symbol;
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
자바 공부(취업 준비) (0) | 2019.07.29 |
---|---|
Java - 람다 (0) | 2019.07.28 |
Java - 제네릭 (0) | 2019.07.25 |
Java- 컬렉션 프레임워크(Collections) (0) | 2019.07.24 |
Java- 컬렉션 프레임워크(Properties) (0) | 2019.07.23 |