Java

Java 열거형(Enum)

코드깎는머슴 2024. 2. 26. 16:41
728x90
반응형

열거형

서로 관련된 상수를 편하게 선언하기 위한 것, 상수를 정의 할 때 사용
C는 타입이 달라도 값이 같으면 조건식이 참이지만, 자바는 컴파일 에러다

열거형 정의와 사용   

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

 

동서남북 4방향

enum Direction{EAST, SOUTH, WEST, NORTH}

 

사용법은 '열거형이름'.'상수명'

class Unit{
    int x, y;
    Direction dir;

    void init(){
        dir = Direction.EAST;
    }
}

 

열거형 상수간 비교

        '==' 사용 가능
        equals()가 아닌 ==로 가능하다는 것은 그만큼 빠르다는 의미다.
        
        하지만 <, >같은 비교연산자는 사용할 수 없고, compareTo()는 사용 가능하다.
        비교 대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환

enum{
    EAST(1), SOUTH(5), WEST(-1), NORTH(10);

    private final int value;

    Direction(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}


열거형의 인스턴스 변수는 반드시 final이어야 한다는 제약은 없지만, value는 열거형 상수의 값을 지정하기 위한 것이므로 붙였다

   

Direction d = new Direction(1);   //에러


생성자를 만들어놧지만 열거형의 생성자는 묵시적으로 private라서 에러다

다음과 같이 하나의 열거형 상수에 여러값을 지정할 수도 있다.
다만 그에 맞게 인스턴스 변수와 생성자도 추가해야 한다

enum{
    EAST(1, 1), SOUTH(5, 5), WEST(-1, -1), NORTH(10, 10);

    private final int value;
    private final int value2;

    Direction(int value, int value2){
        this.value = value;
        this.value2 = value2;
    }

    public int getValue(){
        return value;
    }

    public int getValue2(){
        return value2;
    }
}

 

 

열거형의 추상메서드

enum Transportation{
    BUS(100), TRAIN(150), SHIP(100), AIRPLANE(300);

    private final int BASIC_FARE;

    private Transportation(int basicFare){
        BASIC_FARE = basicFare;
    }

    int fare(){                     // 운송 요금 반환
        return BASIC_FARE;
    }
}


거리에 따라 요금을 계산하는 방식이 각 운송 수단마다 다를 것이기 때문에 이것만으론 부족하다.
이럴 때, 열거형에 추상 메서드를 선언하면 각 열거형 상수가 이 추상 메서드를 반드시 구현해야 한다

enum Transportation{
    BUS(100)    {int fare(int distance) { return distance * BASIC_FARE; }},
    TRAIN(150)  {int fare(int distance) { return distance * BASIC_FARE; }},
    SHIP(100)   {int fare(int distance) { return distance * BASIC_FARE; }},
    AIRPLANE(300) {int fare(int distance) { return distance * BASIC_FARE; }};

    abstract int fare(int distance);                    // 거리에 따른 요금을 계산하는 추상 메서드

    protected final int BASIC_FARE;                     // protected로 해야 각 상수에서 접근 가능

    private Transportation(int basicFare){
        BASIC_FARE = basicFare;
    }

    int fare(){                     // 운송 요금 반환
        return BASIC_FARE;
    }
}


위에선 추상 메서드 fare를 똑같이 구현해놨지만, 다르게 구현될 수도 있게 하려고 추상 메서드로 선언한 것이다.

728x90
반응형