/ JAVAJUNGSUK

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