- 열거형(enum)
: 열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있는 방법이다.
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;
}
→ 일반적으로 상수를 선언할 때 static final을 붙여 사용하는데, 이처럼 상수가 많을 때는 코드가 불필요하게 길어진다.
이럴 때, 열거형을 이용하면 간단히 상수를 선언할 수 있다.
class Card {
enum Kind {CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO, THREE, FOUR}
final Kind kind;
final Value value;
}
→ 따로 값을 정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당된다.
(CLOVER의 값은 0 HEART는 1 DIAMOND는 2 SPADE 3으로 할당됨.)
if(Card.Kind.CLOVER==Card.Value.TWO) //컴파일 에러 발생. 타입이 달라서 불가
→ 열거형을 이용해서 상수를 정의한 경우는 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생한다.
- 열거형의 정의와 사용
enum 열거형이름 {상수명1, 상수명2, ...}
→ 열거형을 정의하는 방법은 다음과 같이 괄호 {}안에 상수의 이름을 나열하기만 하면 된다.
enum Direction { EAST, SOUTH, WEST, NORTH }
class Unit {
int x, y;
Direction dir;
void init() {
dir=Direction.EAST;
}
}
→ 열거형에 정의된 상수를 사용하는 방법은 '열거형이름.상수명'이다.
if(dir==Direction.EAST) {
x++;
} else if(dir>Direction.WEST) { //에러. 열거형 상수에 비교연산자 사용불가
...
} else if(dir.compareTo(Direction.WEST)>0) { //compareTo()는 가능
...
}
→ 열거형 상수간에 비교에는 '=='과 'equals()'를 사용할 수 있다. 그러나 '<', '>'와 같은 비교연산자는 사용할 수 없고 compareTo()는 사용가능하다.
- 열거형의 조상 - java.lang.Enum
: 모든 열거형의 조상은 java.lang.Enum이다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class객체를 반환한다. |
String name() | 열거형 상수의 이름을 문자열로 반환한다. |
int ordinal() | 열거형 상수가 정의된 순서를 반환한다. (0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다. |
이외에도 values()처럼 컴파일러가 모든 열거형에 자동적으로 추가해주는 메서드가 두 개 더 있다.
static E[] values()
static E valueOf(String name)
→ values()는 열거형에 정의된 모든 상수를 출력하는데 사용된다.
- 열거형 예제
enum Direction { EAST, SOUTH, WEST, NORTH }
class JavaJungsuk_enum {
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(d3) ? "+(d1.compareTo(d3)));
System.out.println("d1.compareTo(d2) ? "+(d1.compareTo(d2)));
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());
}
}
결과
d1=EAST
d2=WEST
d3=EAST
d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3
→ switch문에서 case Direction.EAST라고 쓸 수 없다.
→ .values()는 열거형의 모든 상수를 반환한다.
- 열거형에 멤버 추가하기
: 열거형 상수의 값이 불규칙적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
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;
}
}
→ 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해주어야 한다.
이때 주의할 점은 먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야 한다는 것이다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_쓰레드(Thread) (0) | 2023.01.31 |
---|---|
Java_애너테이션·어노테이션(annotation) (0) | 2023.01.25 |
Java_제네릭스·지네릭스(2)_제네릭스의 제약, 와일드 카드, 제네릭 메서드, 제네릭 타입의 형변환 (0) | 2023.01.19 |
Java_제네릭스·지네릭스(1)_타입 변수, 제네릭스 용어, 제네릭의 타입과 다형성, Iterator<E>, HashMap<K,V>, 제한된 제네릭 클래스 (0) | 2023.01.15 |
Java_컬렉션프레임웍(7)_Collections의 메서드(동기화, 변경불가, 싱글톤, 단일 컬렉션), 컬렉션 클래스 정리 (0) | 2023.01.11 |