자바/열거형(enums)

열겨형의 전반적인 개념(1)

백_곰 2022. 5. 17. 10:14

1. 열거형이란?

- 열겨형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면

유용하다.

 

- 아래의 코드를 통해 원래의 코드와 enum을 적용한 코드의 비교를 통해 이해하자.

 

< 적용 전 >

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 }
    enum Value { TWO, THREE, FOUR }
    
    final Kind kind;
    // 타입이 int가 아닌 Kind이다.
    
    final Value value;
    // 타입이 int가 아닌 Value이다.
}

 

 

( 자바의 열거형은 타입에 안전한 열거형이라서 c언어와 달리 아무리 값이 같더라도 아래의 코드처럼 타입이

다르다면 false를 출력한다. )

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

if(Card.KIND.CLOVER == CARD.Value.TWO)
// 컴파일 에러. 값은 같지만 타입은 다름.

 

( 만약 상수의 값을 바꾼다면, 기존의 코드를 전부 컴파일하지만, 열거형 상수를 쓴다면 기존의 코드를 컴파일하지

않아도 된다. )

 

 

 

 

2. 열거형의 정의와 사용

- 열거형의 정의하는 방법은 위에서도 보았듯이 아래의 코드처럼 수행하면 된다.

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

 

enum Direction { EAST, SOUTH, WEST, NORTH };

 

 

- 또한 정의된 상수를 호출하는 방법은 '열거형이름.상수명'으로 호출하면 된다.

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

 

 

- 열거형 상수간의 비교도 가능한데, equals()가 아닌 '=='을 사용한다는 점에서 빠른 성능을 제공한다.

 

- 그러나, '<', '>' 연산은 사용할 수 없고, compareTo()는 사용가능하다.

if(dir = Direction.EAST){
   x++;
} else if (dir > Direction.WEST) { // 에러 발생
   ...
} else if (dir.compareTo(Direction.WEST) > 0) { // 비교 가능
   ...
}

( compareTo()는 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수이다. )

 

 

- 비교뿐만 아니라 switch 문의 조건식에도 사용이 가능하다.

void move(){
    switch(dir){
        case EAST:   x++;   // Direction.East라고 쓰면 안됨.
             break;
        case WEST:   x--; 
             break;
        case SOUTH:  y++;  
             break;
        case NORTH:  y--;   
             break;
    }
}

 

 

 

- 열거형 Direction에 정의된 모든 상수를 출력할려면 아래의 코드처럼 values()를 사용하면 된다.

Direction[] dArr = Direction.values();

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

( ordinal()은 열거형 상수가 정의된 순서(0부터)를 반환하는 메서드이다. )

 

 

 

 

2-1. 열거형의 정의와 사용을 이해하기 위한 예제(1)

 

enum Direction { EAST, SOUTH, WEST, NORTH }

public class Exercise001 {	
	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));
		System.out.println("d1==d3 ? "+ (d1==d3));
		System.out.println("d1.equals(d3) ? "+ d1.equals(d3));
//		System.out.println("d2 > d3 ? "+ (d1 > 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("The direction is EAST."); 
				break;
			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%n", d.name(), d.ordinal()); 
	}
}

 

 

 

 

다음장

열겨형의 전반적인 개념(2) (tistory.com)

 

열겨형의 전반적인 개념(2)

 

kind-coding.tistory.com