12장 열거형

slee2·2021년 9월 23일
0

Java의 정석

목록 보기
23/28
post-thumbnail
post-custom-banner

열거형(enum)

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


자동으로 값이 매겨진다 0, 1, 2, 3

열거형의 정의와 사용

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

enum Direction {EAST, SOUTH, WEST, NORTH}

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

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

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

copareTo는 뺄셈. 왼쪽이 크면 양수 같으면 0 오른쪽이 크면 음수.

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

열거형의 조상 - 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 valueOf(String name)
Direction[] dArr = Direction.values();

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


Direction d = Direction.valueOf("WEST");

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

열거형에 멤버 추가하기

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

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

enum Direction {
	EAST(1), SOUTH(5), WEST(-1), NORTH(10);	// 끝에 ';'를 추가해야 한다.
    
   	private final int value;	// 정수를 저장할 필드를 추가
   	Direction(int value) {this.value = value;}	// 생성자를 추가
    
   	public int getValue() {return value;}

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

Direction d = new Direction(1);	// 에러. 열거형의 생성자는 외부에서 호출불가

2개도 가능

enum Direction {
	EAST(1, ">"), SOUTH(5, "V"), WEST(-1, "<"), NORTH(10, "^");
    
   	private final int value;	// 정수를 저장할 필드를 추가
   	private final String symbol;	// 2개니까 이것도 2개
   	Direction(int value, String symbol) {
   		this.value = value;
  		this.symbol = symbol;
   	}	// 생성자를 추가
post-custom-banner

0개의 댓글