/ JAVAJUNGSUK

Ch12-21~22. enum 멤버 추가

자바의 정석 기초편

0. 목차



Chapter12. 지네릭스, 열거형, 애너테이션

Ch12 - 21. 열거형에 멤버 추가하기

Ch12 - 22. 열거형에 멤버 추가하기 예제



Ch12 - 21. 열거형에 멤버 추가하기


▶ 열거형 상수에 원하는 값 추가 가능

▷ 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()에 작성
enum Pizza { GOGUMA(1), CHEEZE(3), STAEK(22), POTATO(14) }
▷ 괄호()를 사용하려면 인스턴스 변수와 생성자 새로 추가
enum Pizza {
    GOGUMA(1), CHEEZE(3), STAEK(22), POTATO(14);
    
    private final int value; // 항상 private!, value에 괄호() 안의 정수가 추가 됨
    Pizza(int value) { this.value = value; } // 생성자
    
    public int getValue() { return value; } // getValue() 호출 시, value 반환
}
▷ 열거형의 생성자는 묵시적 private 이므로 외부에서 객체 생성 불가

Pizza p = new Pizza(1); // ERROR! 열거형 생성자는 외부에서 호출 불가



Ch12 - 22. 열거형에 멤버 추가하기 예제


▶ enum 생성

▷ enum의 상수에 값 추가(int value, String symbol)
enum Direction { EAST(1, "동"), SOUTH(2,"남"), WEST(3, "서"), NORTH(4,"북"); }
▷ enum의 상수(int value, String symbol)의 iv, 생성자 작성
enum Direction { 
	EAST(1, "동"), SOUTH(2,"남"), WEST(3, "서"), NORTH(4,"북");
	
	private final int value;
	private final String symbol;
	
	Direction(int value, String symbol) {
		
		this.value = value;
		this.symbol = symbol;
	}
}


▶ 반환

▷ enum의 상수(int value, String symbol)를 호출했을 때 반환값 설정
public int getValue() { return value; }
public String getSymbol() { return symbol; }


▶ 배열

▷ enum의 상수(int value, String symbol)를 private 배열에 담기
private static final Direction[] DIR_ARR = Direction.values();


▶ 배열 사용 메서드

▷ dir을 받으면 DiR_ARR[dir - 1]를 반환하는 메서드 생성
public static Direction of(int dir) {
    if (dir < 1 || dir > 4) 
        throw new IllegalArgumentException("Invalid value :" + dir); // 1 ~ 4 보다 크거나 작은 값 나오면 예외 발생
    
    return DIR_ARR[dir - 1];
}	


▶ rotate()

▷ 시계 방향 : num을 받으면 4로 나누어 그 나머지 수만큼 회전시키는 메서드


▷ 반시계 방향 : num을 받으면 4로 나눈 나머지에 4를 더한 만큼 회전시키는 메서드


public Direction rotate(int num) {
    num = num % 4;
    
    if(num < 0) num +=4;

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


▶ toString()

▷ toString() 오버라이딩
public String toString() {
    return name() + getSymbol();
}
▷ 실행
public static void main(String[] args) {
    for(Direction d : Direction.values()) 
        System.out.printf("%s=%d%n", d.name(), d.getValue()); 

    Direction d1 = Direction.EAST;
    Direction d2 = Direction.of(1);
    
    System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
    System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());
    System.out.println(Direction.EAST.rotate(5));
    System.out.println(Direction.EAST.rotate(2));
    System.out.println(Direction.EAST.rotate(-1));
    System.out.println(Direction.EAST.rotate(-2));
}

// console
EAST=1
SOUTH=2
WEST=3
NORTH=4

d1=EAST, 1
d2=EAST, 1

SOUTH
WEST
NORTH
WEST