1. 열거형이란?
- 열겨형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면
유용하다.
- 아래의 코드를 통해 원래의 코드와 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;
}
< 적용 후 >
class CARD{
enum Kind { CLOVER, HEART, DIAMOND, SPADE }
enum Value { TWO, THREE, FOUR }
final Kind kind;
// 타입이 int가 아닌 Kind이다.
final Value value;
// 타입이 int가 아닌 Value이다.
}
( 자바의 열거형은 타입에 안전한 열거형이라서 c언어와 달리 아무리 값이 같더라도 아래의 코드처럼 타입이
다르다면 false를 출력한다. )
if(Card.CLOVER == CARD.TWO)
// true지만 false이어야 의미상 맞음.
if(Card.KIND.CLOVER == CARD.Value.TWO)
// 컴파일 에러. 값은 같지만 타입은 다름.
( 만약 상수의 값을 바꾼다면, 기존의 코드를 전부 컴파일하지만, 열거형 상수를 쓴다면 기존의 코드를 컴파일하지
않아도 된다. )
2. 열거형의 정의와 사용
- 열거형의 정의하는 방법은 위에서도 보았듯이 아래의 코드처럼 수행하면 된다.
enum 열거형이름 { 상수명1, 상수명2, ... };
enum Direction { EAST, SOUTH, WEST, NORTH };
- 또한 정의된 상수를 호출하는 방법은 '열거형이름.상수명'으로 호출하면 된다.
class Unit{
int x, y;
// 유닛의 위치
Direction dir;
// 열거형을 인스턴스 변수로 선언
void init(){
dir = Direction.EAST;
// 유닛의 방향을 EAST로 초기화
}
}
- 열거형 상수간의 비교도 가능한데, equals()가 아닌 '=='을 사용한다는 점에서 빠른 성능을 제공한다.
- 그러나, '<', '>' 연산은 사용할 수 없고, compareTo()는 사용가능하다.
if(dir = Direction.EAST){
x++;
} else if (dir > Direction.WEST) { // 에러 발생
...
} else if (dir.compareTo(Direction.WEST) > 0) { // 비교 가능
...
}
( compareTo()는 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수이다. )
- 비교뿐만 아니라 switch 문의 조건식에도 사용이 가능하다.
void move(){
switch(dir){
case EAST: x++; // Direction.East라고 쓰면 안됨.
break;
case WEST: x--;
break;
case SOUTH: y++;
break;
case NORTH: y--;
break;
}
}
- 열거형 Direction에 정의된 모든 상수를 출력할려면 아래의 코드처럼 values()를 사용하면 된다.
Direction[] dArr = Direction.values();
for(Direction d : dArr)
System.out.printf("%s = %d\n", d.name(), d.ordinal());
( ordinal()은 열거형 상수가 정의된 순서(0부터)를 반환하는 메서드이다. )
2-1. 열거형의 정의와 사용을 이해하기 위한 예제(1)
enum Direction { EAST, SOUTH, WEST, NORTH }
public class Exercise001 {
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 ? "+ (d1 > 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("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) // for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
}
}
다음장
열겨형의 전반적인 개념(2)
kind-coding.tistory.com
'자바 > 열거형(enums)' 카테고리의 다른 글
열겨형의 전반적인 개념(3) (0) | 2022.05.17 |
---|---|
열겨형의 전반적인 개념(2) (0) | 2022.05.17 |