ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 열거형(enums)
    Computer Science/JAVA 2021. 8. 20. 22:38

    1️⃣ 열거형이란?

    열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용함.

    자바의 열거형은 C언어의 열거형보다 더 향상된 것으로 열거형이 갖는 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다.

    class Card {
        static final int CLOVER = 0;
        static final int HEART = 1;
        static final int DIAMOND = 2;
        static final int SPADE = 3;
    
        static final int TWO = 0;
        static final int THREE = 1;
        static final int FOUR = 2;
    
        final int kind;
        final int num;
    }
    
    //==============> enum 사용
    
    class Card {
        enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind 정의
         enum Value { TWO, THREE, FOUR } // 열거형 Value 정의
    
        final Kind kind;
        final Value value;
    }

    자바의 열거형은 타입에 안전한 열거형이기 때문에 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생하게 된다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 타입에 안전함

    그리고 만약 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 한다. 하지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 된다.

    2️⃣ 열거형의 정의와 사용

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

    이 열거형에 정의된 상수를 사용하는 방법은 '열거형이름.상수형'이다. 클래스의 static변수를 참조하는 것과 동일함.

    열거형 상수간의 비교에는 ==를 사용가능하다. equals()가 아닌 ==로 비교가 가능하기 때문에 그만큼 빠른 성능을 제공한다. 하지만 <, >같은 비교 연산자는 사용할 수 없고 compareTo()는 사용가능하다.

    enum Direction { EAST, SOUTH, WEST, NORTH }
    
    public class EnumEx1 {
        public static void main(String[] args) {
            Direction d1 = Direction.EAST;
            Direction d2 = Direction.valueOf("WEST");
            Direction d3 = Enum.valueOf(Direction.class, "EAST");
    
            System.out.println(d1);
            System.out.println(d2);
            System.out.println(d3);
    
            System.out.println(d1 == d2);
            System.out.println(d1 == d3);
    
            Direction[] dArr = Direction.values();
    
            for(var d : dArr)
                System.out.println(d.name() + " " + d.ordinal());
        }
    }

    3️⃣ 열거형에 멤버 추가하기

    Enum클래스에 정의된 ordinal()이 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로는 사용하지 않는 것이 좋다. 이 값은 내부적인 용도로만 사용되기 위한 것

    열거형 상수의 값이 불연속적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호와 함께 적어주면 된다.

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

    그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해야 한다.

    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 EnumEx2 {
        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));
        }
    }

    4️⃣ 열거형의 이해

    enum Direction { EAST, SOUTH, WEST, NORTH }

    위의 열거형 상수 하나하나가 Direction 객체이다. 위의 문장을 클래스로 정의한다면

    class Direction {
        static final Direction EAST = new Direction("EAST");
        static final Direction SOUTH = new Direction("SOUTH");
        static final Direction WEST = new Direction("WEST");
        static final Direction NORTH = new Direction("NORTH");
    
        private String name;
    
        private Direction(String name) {
            this.name = name;
        }
    }

    Uploaded by Notion2Tistory v1.1.0

    'Computer Science > JAVA' 카테고리의 다른 글

    쓰레드(1)  (0) 2021.08.20
    애너테이션  (0) 2021.08.20
    Generics  (0) 2021.08.20
    String, StringBuilder, StringBuffer  (0) 2021.08.20
    Object 클래스  (0) 2021.08.20

    댓글

Designed by Tistory.