ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 열거형(Enum)
    Java 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
    반응형
Designed by Tistory.