열거형(enum)

배지원·2022년 10월 18일
0

JAVA

목록 보기
28/32
post-custom-banner

1. 열거형

  • 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공
  • 값과 타입 모두 체크함
  • 예를 들면 값에 별명을 붙여주는 개념으로 가위/바위/보 게임을 만드는데 0을 바위, 1을 보, 2를 가위라 할때 매번 코드에서는 if(choice == 1)같은 형태로 사용하게 되면 다른 개발자가 봤을때 1이 무엇은지 모르게 된다. 따라서 열거형을 통해 값에대한 별명을 붙여준다고 생각하면 될거 같다.
enum 열거형이름 {Scissors = 1;...}

예제

enum Direction {EAST,SOUTH,WEST,NORTH}      // 객체 형식으로 저장
public class test {
    public static void main(String[] args) {
        Direction d1 = Direction.EAST;  // 열거형 타입.상수이름 (가장 많이 사용)
        Direction d2 = Direction.valueOf("WEST");   // 열거형의 값중 WEST가져옴
        Direction d3 = Enum.valueOf(Direction.class,"EAST");  // 최고조상인 Enum 클래스를 통해 값 가져오기

        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("d1.compareTo(d3) ?"+(d1.compareTo(d3)));    //  같은값이라 0
        System.out.println("d1.compareTo(d2) ?"+(d1.compareTo(d2)));    // 0 - 2 = -2


        Direction[] arr = Direction.values();

        for(Direction d : arr){
            System.out.printf("%s=%d\n",d.name(),d.ordinal());  // name()이름 호출, ordinal()순서 출력
        }
    }
}
  • 값을 가져오는 방식
    Direction.EAST , Direction.valueOf("WEST"), Enum.valueOf(Direction.class,"EAST")

  • 값 비교하는 방식
    equals : enum은 객체로 저장하기 때문에 주소를 비교함
    compareTo : 값을 비교하고 싶다면 compareTo 사용해야함

  • values( ) : enum의 모든 값을 가져옴
  • name( ) : enum의 해당 값 이름을 호출
  • ordinal( ) : enum의 해당 값 순서를 호출

2. 열거형에 상수 추가하기

  • 불연속적인 열거형 상수의 경우, 원하는 값을 괄호( ) 안에 적는다.
enum Direction{EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
  • 괄호( )를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
enum Direction{
	EAST(1), SOUTH(5), WEST(-1), NORTH(10);
    
    private final int value;	// 항상 private 사용
    Direction(int value){ this.value = value;}		// 생성자 추가
    
    public int getValue() { return value;}
}
  • 열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체생성 불가

예제

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

    private static final Direction[] DIR_ARR = Direction.values(); // enum 모든 상수값들 불러와 배열에 저장
    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){	// 예외처리 enum안의 값이 1~4이므로 이 외의 값 입력시 오류
        if(dir < 1 || dir >4)
            throw new IllegalArgumentException("Invalid value :" +dir);
        return DIR_ARR[dir -1];			// 정상이라면 배열에서 값 출력
    }
}

class test{
    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;          // EAST 값 저장
        Direction d2 = Direction.of(1);     // Direction 배열에서 값 가져옴

        System.out.printf("d1=%s, %d\n",d1.name(),d1.getValue());   // 상수값 출력
        System.out.printf("d2=%s, %d\n",d2.name(),d2.getValue());
    }
}
profile
Web Developer
post-custom-banner

0개의 댓글