열거형(enum)
- 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
if(Card.CLOVER==Card.TWO) // true지만 false이어야 의미상 맞음
-> 둘 다 인덱스는 0이지만, CLOVER는 kind(무늬)이고, TWO는 value(숫자)이기 때문
- Java는 값과 타입 둘 다 체크한다.(타입에 안전한 열거형 제공)
-> if(Card.Kind.CLOVER==Card.Value.TWO) // 컴파일 에러. 값은 같지만 타입이 달라서 비교 불가
열거형의 정의와 사용
- 열거형을 정의하는 방법
enum 열거형이름 { 싱수명1, 상수명2, … }
ex) enum Diraction { EAST, SOUTH, WEST, NORTH }
-> 자동으로 처음부터 0부터 시작하는 정수값이 부여된다. EAST = 0, SOUTH = 1, WEST = 2, NORTH = 3
- 열거형 타입의 변수를 선언하고 사용하는 방법
- 열거형 상수의 비교에 ==(등가비교연산자)와 compareTo( ) 사용가능
열거형의 조상 – java.lang.Enum 클래스
- 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
메서드 | 설명 |
class<E> getDeclaringClass( ) | 열거형의 Class객체를 반환 |
String name( ) | 열거형 상수의 이름을 문자열로 반환 |
int ordinal( ) | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf (Class<T> eumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환(이름을 주면 이름과 일치하는 상수 반환) |
static E[ ] values( ) static E valueOf(String name) |
- values( ), valueOf( )는 열거형의 모든 상수를 배열에 담아 반환한다. 이 메서드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해준다.
Direction d = Direction.valueOf(“WEST”); // Direction.WEST와 동일함
-> “WEST”는 열거형 상수이름
Direction[ ] 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 }
public class EX12_5 {
public static void main(String[] args) {
Direction d1 = Direction.EAST; // 열거형타입.상수이름
Direction d2 = Direction.valueOf("WEST"); // valueOf( )사용
Direction d3 = Enum.valueOf(Direction.class, "EAST"); // 최고조상인 Enum의 valueOf 메서드 사용
System.out.println("d1 = " + d1); // d1 = EAST
System.out.println("d2 = " + d2); // d2 = WEST
System.out.println("d3 = " + d3); // d3 = EAST
System.out.println("d1 == d2 ? " + (d1==d2)); // d1 == d2 ? false
System.out.println("d1 == d3 ? " + (d1==d3)); // d1 == d3 ? true
System.out.println("d1.equals.(d3) ? " + d1.equals(d3)); // d1.equals.(d3) ? true
// System.out.println("d2 > d3 ? " + (d2 > d3)); // 에러
System.out.println("d1.compareTo(d3) ? " + d1.compareTo(d3)); // d1.compareTo(d3) ? 0
System.out.println("d1.compareTo(d2) ? " + d1.compareTo(d2)); // d1.compareTo(d2) ? -2
System.out.println("d2.compareTo(d3) ? " + d2.compareTo(d3)); // d2.compareTo(d3) ? 2
switch(d1) {
case EAST: // Direction.EAST라고 쓸 수 없다.
System.out.println("The direction is EAST."); break; // The direction is EAST.
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\t", d.name(), d.ordinal()); // ordinal은 순서, EAST=0 SOUTH=1 WEST=2 NORTH=3
}
}
열거형에 멤버 추가하기
- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호( )안에 적는다.
enum Direction { EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
-> 원하는 값을 괄호 안에 추가!, 여러 개 가능 EAST(1, “<”)
-> 괄호( )를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
-> 생성자에서 private 생략됨. private Direction(int value) { this.value = value; }
-> 열거형의 생성자는 암묵적으로 private이므로, 외부에서 객체생성 불가
Direction d = new Direction(1); // 에러 열거형의 생성자는 외부에서 호출불가
예제)
enum Direction2 {
EAST(1, ">"), SOUTH(2, "V"), WEST(3,"<"), NORTH(4,"^");
// 열거형에 있는 모든 값들을 DIR_ARR 배열에 담아놓음
private static final Direction2[] DIR_ARR = Direction2.values();
private final int value; // 첫 번쨰 숫자가 들어갈 변수
private final String symbol; // 두 번째 기호가 들어갈 변수
Direction2(int value, String symbol) { // 접근제어자 private 생략
this.value = value;
this.symbol = symbol;
}
public int getValue() { return value; }
public String getSymbol() { return symbol; }
}
public class Ex12_6 {
public static void main(String[] args) {
for(Direction2 d : Direction2.values())
System.out.printf("%s=%d\t", d.name(), d.getValue()); // EAST=1 SOUTH=2 WEST=3 NORTH=4
Direction2 d1 = Direction2.EAST;
Direction2 d2 = Direction2.valueOf("WEST");
System.out.printf("%nd1=%s, %d%n", d1.name(), d1.getValue()); //d1=EAST, 1
System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue()); //d2=WEST, 3
}
}
'멀티캠퍼스 풀스택 과정 > Java의 정석' 카테고리의 다른 글
자바의 정석10-1 프로세스와 쓰레드 (0) | 2022.01.12 |
---|---|
자바의 정석9-4 애너테이션(annotation) (0) | 2022.01.12 |
자바의 정석9-2 와일드 카드, 지네릭 메서드 (1) | 2022.01.12 |
자바의 정석9-1 지네릭스 (0) | 2022.01.12 |
자바의 정석8-6 HashMap, Hashtable, Collections 요약 (0) | 2022.01.10 |