java 열거형

조항주·2022년 6월 21일

study

목록 보기
16/20
post-thumbnail

열거형이란?

서로 관련된 상수를 편리하게 선언하기 위한 것
Java의 열거형은 C언어의 열거형과 다르게 열거형이 갖는 값 뿐만 아니라 타입까지 관리한다.
기존의 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야한다. 하지만 열거형 상수를 사용하면 기존의 소스를 다시 컴파일하지 않아도 된다.

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;
}

//-------------------------------------------------->
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)	//true지만 false이어야 의미상 맞다.
if (Card.Kind.CLOVER == Card.Value.TWO)	//false. 같은 값이지만 타입이 다르다.

열거형의 정의와 사용

열거형 정의 -> 괄호{} 안에 상수의 이름을 나열한다.

enum 열거형이름 { 상수명1, 상수명2, ... }
//동서남북 정의
enum Driection { EAST, SOUTH, WEST, NORTH}

열거형 사용 -> 열거형이름.상수명으로 하고 클래스의 static 변수를 참조하는 것과 동일하다.

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

열거형 상수간의 비교 -> ==
<, >와 같은 비교 연산자는 사용할 수 없고, compareTo() 사용.

//compareTo()는 두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다.
if (dir == Direction.EAST) {
	x++;
} else if (dir > Direction.WEST) {	//에러. 열거형 상수에 비교연산자 사용 불가
} else if (dir.compareTo(Direction.WEST) > 0) {}	//OK. compareTo()는 사용 가능

//switch문의 조건식에 사용
void move() {
	switch(dir) {
    	case EAST : x++;	//Direction.EAST라고 쓰면 안된다.
        	break;
        case WEST : x--;
        	break;
        case SOUTH : y++;
        	break;
        case NORTH : y--;
        	break;
    }
}

case문에 열거형의 이름은 적지 않고 상수의 이름만 적어야 한다는 제약이 있다.

모든 열거형의 조상 Enum

열거형 Direction에 정의된 모든 상수를 출력

Direction[] dArr = Direction.values();

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

values() : 열거형의 모든 상수를 배열에 담아 반환해준다. 이 메서드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해 준다.

메서드설명
Class getDeclaringClass()열거형의 Class객체를 반환한다.
String name()열거형 상수의 이름을 문자열로 반환한다.
int ordinal()열거형 상수가 정의된 순서를 반환한다. (0부터 시작)
T valueOf(Class enumType, String name)지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

valueOf 메서드는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.

static E values()
static E valueOf(String name)

//이 메서드는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.
Direction d = Direction.valueOf("WEST");

System.out.println(d);	//WEST
System.out.println(Direction.WEST == Direction.valueOf("WEST"));	//true

0개의 댓글