충분히 쌓여가는
열거형(enum) 본문
열거형(enum)
관련된 상수들을 같이 묶어 놓은 것, JAVA는 타입에 안전한 열거형을 제공
위의 코드를
class Card {
static final int CLOVER = 0;
static final int HEAET = 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 { // 0, 1, 2, 3
enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind를 정의, 자동으로 순서 0, 1, 2, 3 매겨짐
enum Value { TWO, THREE, FOUR } // 열거형 Value를 정의
final Kind kind; // 타입이 int가 아닌 Kind임에 유의
final Value value;
}
열거형의 정의와 사용
열거형을 정의하는 방법
enum 열거형이름 { 상수명1, 상수명2, ... }
열거형 타입의 변수를 선언하고 사용하는 방법
enum Direction { EAST, SOUTH, WEST, NORTH }
class Unit {
int x, y; // Unit의 위치
Direction dir; // 열거형 인스턴스 변수를 선언, EAST, SOUTH, WEST, NORTH 값만 dir에 들어갈 수 있다
void init() {
dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
}
}
열거형 상수의 비교에 ==와 compareTo() 사용가능
if(dir == Direction.EAST) { // true
x++;
} else if(dir > Direction.WEST) { // 에러, 열거형 상수에 비교연산자 사용불가
...
} else if(dir.compareTo(Direction.WEST) > 0) { // 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)
Directing[] dArr = Direction.values();
for(Direction d : dArr) // for(Direction d : Direction.values())
System.out.printf("%s=%d%n", d.name(), d.ordinal());
코드
// 0, 1, 2, 3
enum Direction { EAST, SOUTH, WEST, NORTH }
class enumTest {
public static void main(String[] args) {
Direction d1 = Direction.EAST; // 열거형타입.상수
Direction d2 = Direction.valueOf("WEST"); // 문자열 이용하여 열거형 상수 얻기
Direction d3 = Enum.valueOf(Direction.class, "EAST"); // Enum 클래스(모든 열거형 최고 조상) 이용, valueOf 사용
System.out.println("d1="+d1);
System.out.println("d2="+d2);
System.out.println("d3="+d3);
System.out.println();
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();
System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3)));
System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2)));
System.out.println();
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());
}
}
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
'Java > JAVA3' 카테고리의 다른 글
Annotation(애너테이션) @ (0) | 2023.07.31 |
---|---|
열거형에 멤버 추가하기 (0) | 2023.07.31 |
지네릭 형변환 (0) | 2023.07.29 |
지네릭 메서드 (0) | 2023.07.28 |
와일드 카드 <?>, 지네릭 메서드 (0) | 2023.07.28 |