반응형
열거형(enum)
- 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
< 상수 사용 클래스 >
package enumtest;
public class Card {
static final int CLOVER = 0;
static final int HEART = 1;
static final int DIMOND = 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;
}
< Enum으로 재 정의한 클래스 >
package enumtest;
public class CardEnum {
// 0 1 2 3
enum Kind{ COLVER, HEART, DIAMOND, SPADE}
enum Value{ TWO, THREE, FOUR}
final Kind kind;
final Value value;
}
- 간단하게 정리가 가능하다.
- 타입을 확인 한다.
if(Card.knd.CLOVER == Card.Value.TWO){ // 컴파일 에러! 타입이 달라서 비교 불가
열거형의 정의와 사용
- 열거형 정의 방법
enum 열거형이름{상수명1, 상수명2, ... }
- 열거형 타입의 변수를 선언하고 사용하는 방법
class Unit{
int x, y; // 유닛의 위치
Direction dir; // 열거형 인스턴스 변수를 선언
void init(){
dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
}
}
- 열거형 상수의 비교에 ==와 compareTo() 사용가능
if(dir==Direction.EAST) {
x++;
} else if (dir> Direction.WEST) {// 에러! 열거형 상수에 비교연산자 사용불가!!
} else if (dir.compareTo(Direction.WEST > 0 ){ // compareTo() 사용
}
** compareTo() 같으면 0 / 왼쪽이 크면 양수 / 오른쪽이 크면 음수
열거형의 조상 - 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 valuesOf(String name)
// Direction d = Direction.valuesOf("WEST"); === Direction.WEST
Direction[] dArr = Direction.values();
for(Direction d : dArr){
System.out.printf("%s=%d%n", d.name(), d.ordinal());
...
}
예제
package enumtest;
// 0 1 2 3
enum Direction { EAST, SOUTH, WEST, NORTH}
public class EnumTest {
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)); // false
System.out.println("d1==d3 ? "+(d1==d3)); // true
System.out.println("d1.equals(d3) ? "+(d1.equals(d3)));
System.out.println("d1.compareTo(d3) ? "+(d1.compareTo(d3)));
System.out.println("d1.compareTo(d2) ? "+(d1.compareTo(d2)));
switch (d1){
case EAST: // Direction.EAST 라고 쓸 수 없다.
System.out.println("EAST");
case SOUTH:
System.out.println("SOUTH");
case WEST:
System.out.println("WEST");
case NORTH:
System.out.println("NORTH");
}
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; // 변수를 저장할 필드
// 생성자 추가 생성자는 항상 Private
Direction(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
- 열거형의 생성자는 묵시적 private 이므로, 외부에서 객체생성 불가
Direction d = new Direction(1)
반응형
'개발' 카테고리의 다른 글
JUnit - 테스트 클래스 생성 및 테스트 실행 (0) | 2021.07.11 |
---|---|
Java - 애너테이션 (0) | 2021.06.27 |
Java - Generics 란 (0) | 2021.06.26 |
Java - Collections의 유용한 static 메서드 (0) | 2021.06.06 |
Java - HashMap과 Hashtable (0) | 2021.06.06 |