JAVA의 정석 | Chapter 12 열거형

Yunny.Log ·2022년 7월 5일
0

JAVA

목록 보기
22/29
post-thumbnail

열거형

관련된 상수들을 같이 묶어놓은 것

  • java는 타입에 안전한 열거형을 제공
    => java는 열거형, 값, 타입을 모두 체크한다

https://www.youtube.com/watch?v=ODHC-n4mpMY&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=142

열거형 정의와 사용

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

enum Direction{EAST, SOUTH, WEST, NORTH}

class Unit {
	int x, y;
    Direction dir;
    
    void init(){
    	dir = Direction.EAST;
    }
    
  • 열거형 상수 비교에 == 와 compareTo() 사용 가능, 그러나 < 또는 > 는 안됨

열거형의 조상 - java.lang.Enum

  • ordinal : 열거형 상수가 정의된 순서 반환 (0부터~)


public class Enumi {
	
	enum Direction { EAST, SOUTH, WEST, NORTH }

	class EnumEx1 {
		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: 
					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()); 
		}
	}
}
  • 결과값
d1=EAST
d2=WEST
d3=EAST
d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3
  • 다양한 메소드를 통해 new 생성 가능
public enum ItemType {

    NONE(0),
    ITEM1(0), 
    ITEM2(1), 
    ITEM3(2), 
    ITEM4(3), 
    ;

    private final Integer label;

    ItemType(Integer label){
        this.label = label;
    }

    public Integer label() {
        return label;
    }
}

  • 위 코드와 같이 옆에 원하는 값을 적기도 가능
  • 괄호를 사용하려면 인스턴스 변수와 생성자도 꼭 추가해줘야 한다!
  • 교재에서 제시된 코드는 아래와 같음

enum 클래스 선언 시 괄호를 추가한다면!?

enum Direction { 
	EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");

	private static final Direction[] DIR_ARR = Direction.values();
    
    // ** 괄호를 사용하므로, 괄호 안에 들어가는 추가적인 인스턴스 변수들을 선언 
	private final int value;
	private final String symbol;

	// 그 인스턴스 변수들의 생성자도 꼭 추가!해야줘야 함 
	Direction(int value, String symbol) { // private Direction(int value)
		this.value  = value;
		this.symbol = symbol;
	}
    
    //getter 선언 

	public int getValue()      { return value;  }
	public String getSymbol()  { return symbol; }

	public static Direction of(int dir) {
        if (dir < 1 || dir > 4) {
            throw new IllegalArgumentException("Invalid value :" + dir);
        }
        return DIR_ARR[dir - 1];		
	}	

	// 방향을 회전시키는 메서드. num의 값만큼 90도씩 시계방향으로 회전한다.
	public Direction rotate(int num) {
		num = num % 4;

		if(num < 0) num +=4; // num이 음수일 때는 시계반대 방향으로 회전 

		return DIR_ARR[(value-1+num) % 4];
	}

	public String toString() {
		return name()+getSymbol();
	}
} // enum Direction
  • 또한 열거형의 생성자는 묵시적으로 private 이라 외부서 객체 새로 생성하는 것은 불가능

  • 변하지 않고 항상 동일한 인스턴스를 반환하는 용도일 때 쓰기 좋음, (외부에서 건드리면 안되고 변할 일이 없는 것)

0개의 댓글