본문 바로가기

개발

Java - 열거형(enum)

반응형

열거형(enum)
 - 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공

< 상수 사용 클래스 >

package enumtest;

public class Card {
    static final int CLOVER = 0;
    static final int HEART = 1;
    static final int DIMOND = 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으로 재 정의한 클래스 >

package enumtest;

public class CardEnum {
    //          0       1       2       3
    enum Kind{ COLVER, HEART, DIAMOND, SPADE}
    enum Value{ TWO, THREE, FOUR}

    final Kind kind;
    final Value value;

}

 - 간단하게 정리가 가능하다. 
 - 타입을 확인 한다. 

if(Card.knd.CLOVER == Card.Value.TWO){ // 컴파일 에러! 타입이 달라서 비교 불가

 

열거형의 정의와 사용
 - 열거형 정의 방법 

enum 열거형이름{상수명1, 상수명2, ... }

 - 열거형 타입의 변수를 선언하고 사용하는 방법

class Unit{
	int x, y;		// 유닛의 위치
    Direction dir;	// 열거형 인스턴스 변수를 선언
    
    void init(){
    	dir = Direction.EAST;	// 유닛의 방향을 EAST로 초기화
	}
}

 - 열거형 상수의 비교에 ==와 compareTo() 사용가능

if(dir==Direction.EAST) {
	x++;
} else if (dir> Direction.WEST) {// 에러! 열거형 상수에 비교연산자 사용불가!!
	
} else if (dir.compareTo(Direction.WEST > 0 ){ // compareTo() 사용

}

** compareTo()  같으면 0 / 왼쪽이 크면 양수 / 오른쪽이 크면 음수

열거형의 조상 - 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 valuesOf(String name) 
// Direction d = Direction.valuesOf("WEST"); === Direction.WEST

Direction[] dArr = Direction.values();

for(Direction d : dArr){
	System.out.printf("%s=%d%n", d.name(), d.ordinal());
    ...
}


예제

package enumtest;

//                 0    1       2      3
enum Direction { EAST, SOUTH, WEST, NORTH}

public class EnumTest {

    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));   // false
        System.out.println("d1==d3 ? "+(d1==d3));   // true
        System.out.println("d1.equals(d3) ? "+(d1.equals(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("EAST");
            case SOUTH:
                System.out.println("SOUTH");
            case WEST:
                System.out.println("WEST");
            case NORTH:
                System.out.println("NORTH");
        }

        Direction[] dArr = Direction.values();

        for(Direction d : dArr){
            System.out.printf("%s=%d%n", d.name(), d.ordinal());
        }
    }

}

 - 실행 결과

 

열거형에 멤버 추가하기
 - 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.

enum Direction{ EAST(1), SOUTH(5), WEST(-1), NORTH(10)}

  - 괄호를 사용하려면 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.

enum Direction{
    EAST(1), SOUTH(5), WEST(-1), NORTH(10);

    private final int value; // 변수를 저장할 필드
    
    // 생성자 추가 생성자는 항상 Private
    Direction(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}

 - 열거형의 생성자는 묵시적 private 이므로, 외부에서 객체생성 불가

Direction d = new Direction(1)

 

반응형

'개발' 카테고리의 다른 글

JUnit - 테스트 클래스 생성 및 테스트 실행  (0) 2021.07.11
Java - 애너테이션  (0) 2021.06.27
Java - Generics 란  (0) 2021.06.26
Java - Collections의 유용한 static 메서드  (0) 2021.06.06
Java - HashMap과 Hashtable  (0) 2021.06.06