본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석9-3 열거형(enum)

by 이쟝 2022. 1. 12.

열거형(enum)

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

 

열거형 되기 전에 코드

 

열거형 되고 난 후의 코드

 

if(Card.CLOVER==Card.TWO) // true지만 false이어야 의미상 맞음

-> 둘 다 인덱스는 0이지만, CLOVER kind(무늬)이고, TWOvalue(숫자)이기 때문

 

- Java는 값과 타입 둘 다 체크한다.(타입에 안전한 열거형 제공)

-> if(Card.Kind.CLOVER==Card.Value.TWO)  // 컴파일 에러. 값은 같지만 타입이 달라서 비교 불가

 


열거형의 정의와 사용

- 열거형을 정의하는 방법

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

ex) enum Diraction { EAST, SOUTH, WEST, NORTH }

-> 자동으로 처음부터 0부터 시작하는 정수값이 부여된다. EAST = 0, SOUTH = 1, WEST = 2, NORTH = 3

 

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

 

Direction dir에는 EAST, SOUTH, WEST, NORTH만 들어갈 수 있다.

 

- 열거형 상수의 비교에 ==(등가비교연산자)compareTo( ) 사용가능

 

비교할 때 compareTo!!!! 같으면 0 오른쪽이 크면 -1 왼쪽이 크면 +1


열거형의 조상 – java.lang.Enum 클래스

- 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.

 

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

 

더보기

 

static E[ ] values( )
static E valueOf(String name)
  • values( ), valueOf( )는 열거형의 모든 상수를 배열에 담아 반환한다. 이 메서드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해준다.

 

 

Direction d = Direction.valueOf(“WEST”); // Direction.WEST와 동일함
-> “WEST”는 열거형 상수이름

Direction[ ] dArr = Direction.values( );
for(Direction d : dArr) // for(Direction d : Direction.values( ))
    System.out.printf(“%s=%d%n”, d.name( ), d.ordinal( ));  // 이름과 순서

 

예제)

 

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

	public static void main(String[] args) {
		Direction d1 = Direction.EAST;  // 열거형타입.상수이름
		Direction d2 = Direction.valueOf("WEST");  // valueOf( )사용
		Direction d3 = Enum.valueOf(Direction.class, "EAST"); // 최고조상인 Enum의 valueOf 메서드 사용
		
		System.out.println("d1 = " + d1);  // d1 = EAST
		System.out.println("d2 = " + d2);  // d2 = WEST
		System.out.println("d3 = " + d3);  // d3 = EAST
		
		System.out.println("d1 == d2 ? " + (d1==d2));  // d1 == d2 ? false
		System.out.println("d1 == d3 ? " + (d1==d3));  // d1 == d3 ? true
		System.out.println("d1.equals.(d3) ? " + d1.equals(d3));  // d1.equals.(d3) ? true
//		System.out.println("d2 > d3 ? " + (d2 > d3));  // 에러
		System.out.println("d1.compareTo(d3) ? " + d1.compareTo(d3)); // d1.compareTo(d3) ? 0
		System.out.println("d1.compareTo(d2) ? " + d1.compareTo(d2)); // d1.compareTo(d2) ? -2
		System.out.println("d2.compareTo(d3) ? " + d2.compareTo(d3)); // d2.compareTo(d3) ? 2
	
		switch(d1) {
			case EAST: // Direction.EAST라고 쓸 수 없다. 
				System.out.println("The direction is EAST."); break;  // The direction is EAST.
			case SOUTH:
				System.out.println("The direction is SOUTH"); break;
			case WEST:
				System.out.println("The direction is WEST"); break;
			case NORTH:
				System.out.println("The direction is NORTH"); break;
			default: 
				System.out.println("Invalid direction."); break;
		}		
		
		Direction[] dArr = Direction.values(); // 열거형의 모든 상수를 배열로 반환
		for(Direction d : dArr) // for(Direction d : Direction.values( ))
			System.out.printf("%s=%d\t", d.name(), d.ordinal());  // ordinal은 순서, EAST=0	SOUTH=1	WEST=2	NORTH=3	
	} 
}

 


열거형에 멤버 추가하기

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

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

-> 원하는 값을 괄호 안에 추가!, 여러 개 가능 EAST(1, “<”)

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

 

 

-> 생성자에서 private 생략됨. private Direction(int value) { this.value = value; }

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

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


예제) 

 

enum Direction2 {
	EAST(1, ">"), SOUTH(2, "V"), WEST(3,"<"), NORTH(4,"^");
	
	// 열거형에 있는 모든 값들을 DIR_ARR 배열에 담아놓음
	private static final Direction2[] DIR_ARR = Direction2.values();
	private final int value;     // 첫 번쨰 숫자가 들어갈 변수
	private final String symbol; // 두 번째 기호가 들어갈 변수
	
	Direction2(int value, String symbol) { // 접근제어자 private 생략
		this.value = value;
		this.symbol = symbol;
	}
	
	public int getValue() { return value; }
	public String getSymbol() { return symbol; }
}

public class Ex12_6 {
	
	public static void main(String[] args) {
		for(Direction2 d : Direction2.values()) 
			System.out.printf("%s=%d\t", d.name(), d.getValue()); // EAST=1	SOUTH=2	WEST=3	NORTH=4	

		Direction2 d1 = Direction2.EAST; 
		Direction2 d2 = Direction2.valueOf("WEST");
		
		System.out.printf("%nd1=%s, %d%n", d1.name(), d1.getValue()); //d1=EAST, 1
		System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());   //d2=WEST, 3
	}
}