Java/객체지향

[객체지향][열거형] - 열거형에 멤버 추가하기

얄루몬 2022. 2. 22. 18:48

https://youtu.be/R0WrMaKoLTE?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[열거형에 멤버 추가하기]

  • 불연속적인 열거형 상수의 경우, 원하는 값을 괄호 안에 적는다.
    • 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); //에러 열거형의 생성자는 외부에서 호출 불가!

 

 

[실습]

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) {
        this.value = value;
        this.symbol = symbol;
    }

    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];
    }

    public Direction rotate(int num) { // 90도씩 회전, 음수면 시계 반대방향
        num = num % 4;
        if(num < 0)
            num += 4;
        return DIR_ARR[(value - 1 + num) % 4];
    }

    public String toString() {
        return name() + getSymbol();
    }
}

public class Java12_6 {
    public static void main(String[] args) {
        for(var d : Direction.values())
            System.out.println(d.name() +  " " + d.getValue());

                // Direction d1 = new Direction(1, ">") -> 열거형의 생성자는 외부에서 호출 불가
        Direction d1 = Direction.EAST;
        Direction d2 = Direction.of(1);

        System.out.println(d1.name() + " " + d1.getValue());
        System.out.println(d2.name() + " " + d2.getValue());

        System.out.println(d1.rotate(1));
        System.out.println(d1.rotate(2));
        System.out.println(d1.rotate(-1));
        System.out.println(d1.rotate(-2));
    }
}