ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바] 열거형 ( enum )
    자바 2022. 7. 23. 00:03
    728x90

    열거형

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

    값 뿐만 아니라,  타입까지 체크하기 때문에 타입에 안전하다 ( 값 들이 변경되지 않는다 (final) 의 성향이 있음 )

     

    열거형 사용하는 방법

    enum 열거형이름 { 상수명1, 상수명2, ... }
    
    enum Direction { EAST, SOUTH, WEST, NORTH }
    사용하는 방법 ' 열거형이름.상수명 '

     

    열거형 상수간의 비교는  ' == ' 사용할 수 있다.

    '>' '<' 같은 비교 연산자는 사용할 수 없고 compareTo( ) 사용가능하다.

     

    switch문의 조건식에도 열거형을 사용할 수 있다.

    대신에, case문에 열거형의 이름은 적지않고, 상수의 이름만 적어야 한다.

     

    모든 열거형의 조상 - java.lang.Enum

    values()는 열거형의 모든 상수를 배열에 담아 반환한다 ( 컴파일러가 자동적으로 추가해주는 메서드가 있다. )
    메서드 설명
    Class<E> getDeclaringClass() 열거형의 class객체를 반환한다
    String name() 열거형 상수의 이름을 문자열로 반환한다
    int ordinal( ) 열거형 상수가 정의된 순서를 반환한다( 0부터 시작 )
    T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환하다

     

    valueOf()는 컴파일러가 자동적으로 추가해주는 메소드 이며, 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있다.

     

    열거형에 멤버 추가

    열거형 상수의 값이 불연속적인 경우에는 열거형 상수의 이름옆에 원하는 값을 ( ) 과 함께 적으면 된다

    enum Direction { EAST(1), NORTH(2), WEST(3), SOUTH(4) }

     

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

    먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가한다. ( 마지막에 ; 해주기 )

    enum Direction { 
        EAST(1), NORTH(2), WEST(3), SOUTH(4); // ; 붙이기
        
        private final int value; // 정수를 저장할 필드( 인스턴스 변수 )를 추가
        // 열거형의 인스턴스 변수는 반드시 final 이어야 한다.
        
        Direction(int value) { this.value = value; } // 생성자를 추가
        
        public int getValue() { return value; }
        // 외부에서 이 값을 얻을 수 있게한다.
    }

     

    열거형의 생성자는 외부에서 호출불가

    Direction d = new Direction();
    // 열거형의 생성자는 제어자가 묵시적으로 private이다.

     

    열거형에 이해

    static 상수 값은 객체의 주소이고, 이 값은 바뀌지 않으므로 ' == '로 비교가 가능하다

     

     

    이전 코드와 enum 사용 코드

    Fruit.APPLE
    Company.GOOGLE
    
    이런식으로 접근하면 된다

     

    열거형 변형

     enum Fruit {
        APPLE("red"), PEACH("pink"), BANANA("yellow")
        Fruit() { // 생성자를 가질 수 있다 -> field값도 가질 수 있다 ( 변수 메소드 )
            System.out.println("Call " + this); //3번 enum의 개수만큼 반복됨, this는 enum값을 보임
        }
        
        private String color;
        public String getColor() {
            return this.color;
        }
        
        Fruit(String color) { 
            System.out.println("Call " + this); 
            this.color = color; // 이렇게 해서 색을 넣을 수 있다.
        }
    }
    
    public class ConstantDemo {
        public static void main(String[] args) {
            Fruit type = Fruit.APPLE;
            switch(type) {
                case APPLE:
                    System.out.println(Fruit.APPLE.getColor());
                    break;
                case PEACH:
                    System.out.println(Fruit.PEACH.getColor());
                    break;
                case BANANA:
                    System.out.println(Fruit.BANANA.getColor());
                    break;
            }
        }
    }
    
    public class ConstantDemo {
        public static void main(String[] args) {
            for(Fruit f : Fruit.values()) {
                System.out.println(f); // 각각의 이름(상수)들을 출력한다
            }
        }
    }

    '자바' 카테고리의 다른 글

    [자바] 쓰레드  (0) 2022.07.23
    [자바] 애너테이션  (0) 2022.07.23
    [자바] 제네릭스  (0) 2022.07.22
    [자바] 컬렉션 프레임웍  (0) 2022.07.21
    [자바] 날짜와 시간 & 형식화  (0) 2022.07.21
Designed by Tistory.