Ch12-17~20. enum
0. 목차
Chapter12. 지네릭스, 열거형, 애너테이션
Ch12 - 17. 열거형(enum)
Ch12 - 18. 열거형의 정의와 사용
Ch11 - 19. 열거형의 조상 : java.lang.Enum
Ch11 - 20. 열거형 예제
Ch12 - 17. 열거형(enum)
▶ 열거형(enum)이란?
▷ 관련된 상수들을 같이 묶어 놓은 것
▷ Java는 타입에 안전한 열거형을 제공
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;
}
// ↓↓↓↓ enum 적용 후 ↓↓↓↓
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind 정의
enum Value { TWO, THREE, FOUR } // 열거형 Value 정의
final kind kind; // 타입 int아님 주의, 타입 Kind!
final Value Value;
}
- 무늬와 번호 일치 = 카드
if (Card.CLOVER == Card.TWO) // 값만 체크
0 == 0
: 값 비교는true
, 의미상으로는false
(애초에 무늬와 숫자가 같을 수 없음)
if (Card.Kind.CLOVER == Card.Value.TWO) // 값, 타입 체크
컴파일 에러, 타입이 달라서 비교 불가
java는 값과 타입까지 비교해 줌
Ch12 - 18. 열거형의 정의와 사용
▶ 열거형의 정의
▷ 열거형을 정의하는 방법
enum 열거형 이름 { 상수명1, 상수명2, ... }
▶ 열거형의 사용
▷ 열거형 타입의 변수를 선언하고 사용하는 방법
enum Direction { EAST, SOUTH, WEST, NORTH }
class Unit {
int x, y; // 유닛의 위치
Direction dir; // 열거형 인스턴스 변수를 선언
void init() {
dir = Direction.EAST; // 유닛의 방향 Direction 중 EAST로 초기화
}
}
▷ 열거형 상수 비교 : ==, compareTo()
if (dir == Direction.EAST) x++;
else if (dir > Direction.WEST) { // ERROR!, dir = Direction.EAST, 열거형 상수에 비교연산자 사용 불가 compareTo()사용!
...
} else if (dir.compareTo(Direction.WEST) > 0) { // compareTo()는 비교연산자 가능
...
}
- compareTo
=
: 0>
: 양수<
: 음수
Ch12 - 19. 열거형의 조상 : java.lang.Enum
▶ java.lang.Enum : 모든 열거형의 조상 클래스
▷ 모든 열거형은 Enum의 자손이며
▷ 아래의 메서드를 상속 받음
▶ Enum의 메서드
▷ Class<E> getDeclaringClass()
- 열거형의 Class 객체를 반환
▷ String name()
- 열거형 상수의 이름을 문자열로 반환
▷ int ordinal()
- 열거형 상수가 정의 된 순서를 반환(0부터 시작)
▷ T valueOF(Class<T> enumType, String name)
- 지정 된 열거형에서 name과 일치하는 열거형 상수를 반환
▶ Enum의 메서드 중 컴파일러가 자동 추가 해 주는 메서드
▷ static E[] values()
Direction[] dArr = Direction.values();
for (Direction d : dArr) // for (Direction d : Direction.values())
System.out.printf("%s = %d%n", d.name(), d.ordinal());
▷ static E[] valueOf(String name)
Direction d = Direction.valueOf("WEST"); // 열거형 상수 이름을 주면, 열거형 상수를 반환
Direction.WEST // 사실상 이것과 같음, 문자열로 이걸 구할 수 있다는 게 차이
Ch12 - 20. 열거형 예제
▶ enum 생성
▷ Pizza
enum Pizza { GOGUMA, CHEEZE, STAEK, POTATO }
▶ enum의 상수들을 p1, p2, p3에 담기
▷ valueOf(), valueOf(pizza.class, “”)
enum Pizza { GOGUMA, CHEEZE, STAEK, POTATO}
Pizza p1 = Pizza.GOGUMA;
Pizza p2 = Pizza.valueOf("CHEEZE");
Pizza p3 = Pizza.valueOf(Pizza.class, "GOGUMA");
System.out.println("p1 : " + p1);
System.out.println("p2 : " + p2);
System.out.println("p3 : " + p3);
// console
p1 : GOGUMA
p2 : CHEEZE
p3 : GOGUMA
▶ enum의 상수들을 등가 비교 해 보기
▷ ==, equals()
System.out.println("p1 == p2 : " + (p1 == p2));
System.out.println("p1 == p3 : " + (p1 == p3));
System.out.println("p1.equals(p2) : " + p1.equals(p2));
System.out.println("p1.equals(p3) : " + p1.equals(p3));
// console
p1 == p2 : false
p1 == p3 : true
p1.equals(p2) : false
p1.equals(p3) : true
▶ enum의 상수들을 비교 해 보기
▷ compareTo()
System.out.println("p1.compareTo(p2) : " + p1.compareTo(p2));
System.out.println("p1.compareTo(p3) : " + p1.compareTo(p3));
// console
p1.compareTo(p2) : -1
p1.compareTo(p3) : 0
▶ enum의 상수를 매개 변수로 받아 swhich-case 문으로 출력 해 보기
▷ swhich-case
switch(p3) {
case GOGUMA:
System.out.println("Order : GOGUMA"); break;
case CHEEZE:
System.out.println("Order : CHEEZE"); break;
case STAEK:
System.out.println("Order : STAEK"); break;
case POTATO:
System.out.println("Order : POTATO"); break;
default:
System.out.println("---"); break;
}
// console
Order : GOGUMA
- 주의
case :
아니고 그냥Pizza.GOGUMA
GOGUMA
▶ enum의 상수를 배열로 출력
▷ values()
Pizza[] pArr = Pizza.values();
for(Pizza p : pArr) { // for(Pizza p : Pizza.values())
System.out.printf("pArr[%d] = %s%n", p.ordinal(), p.name());
}
// console
pArr[0] = GOGUMA
pArr[1] = CHEEZE
pArr[2] = STAEK
pArr[3] = POTATO