반응형
enum(열거형)
관련된 상수들을 같이 묶어 놓은것
Java는 타입에 안전한 열거형을 제공한다.
▷ 아래의 코드는 상수가 많아 불편함이 발생한다.
public 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;
}
▷ 위와 같은 상황에 열거형을 이용하여 간단히 상수를 선언할 수 있다.
public class Card{
// 0 1 2 3
enum Kind {CLOVER, HEART, DIAMOND, SPADE};
enum Value {TWO, THREE, FOUR};
final Kind kind;
final Value value;
if(Card.CLOVER == Card.TWO) // true지만 false가 의미상 맞다.
if(Card.kind.CLOVER == Card.Value.TWO) // 컴파일에러. 타입이 달라서 비교 불가.
}
▶ 열거형의 정의와 사용
▷ 열겨형의 정의
enum 열거형이름 { 상수명1, 상수명2, ... }
▷ 열거형의 사용
- 열거형 상수간에 비교에는 '=='를 사용할 수 있다.
- '>', '<'와 같은 비교 연산자는 사용할 수 없다.
- compareTo()가 사용 가능하다.
▶ 열거형의 조상 - Java.lang.Enum
모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
▷ values(), valueOf()는 컴파일러가 자동으로 추가한다.
static E[] values()
static E valueOf(String name)
Direction[] dArr = Direction.values();
for(Direction d : DArr){
System.out.println("%s=%d%n", d.name(), d.ordinal());
}
values()는 열거형 Driection에 정의된 모든 상수를 출력하는데 사용한다.
valueOf(String name)는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을수 있게 한다.
▷예제
enum Direction { EAST, SOUTH, WEST, NORTH}
public class ex {
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==d2);
System.out.println(d1.equals(d3));
System.out.println(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(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 d = new Direction(1);
▷ 예제
enum Direction2{
EAST(10, ">"), SOUTH(20, "V"), WEST(3, "<"), NORTH(4, "^");
private static final Direction2[] DIR_ARR = Direction2.values();
private final int value;
private final String symbol;
Direction2(int value, String symbol) {
this.value = value;
this.symbol = symbol;
}
public int getValue() {
return value;
}
public String getSymbol() {
return symbol;
}
public static Direction2 of(int dir){
if (dir < 1 || dir > 4){
throw new IllegalArgumentException("Invalid value : " + dir);
}
return DIR_ARR[dir - 1];
}
}
반응형
'JAVA' 카테고리의 다른 글
[Java] Coding Test (Lotto) (0) | 2022.08.04 |
---|---|
[Java] Annotation (0) | 2022.08.04 |
[Java] Generic Programming (0) | 2022.08.01 |
[Java] WildCard (0) | 2022.08.01 |
[Java] Collections Framework 예제 (0) | 2022.07.28 |