ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 열거 타입(enum)
    Language/Java 2022. 11. 29. 15:24

    열거 타입(enum)

    열거 타입(enum)이란?

    데이터 중에는 몇 가지로 한정된 값만을 갖는 경우가 존재한다.

    예를 들어, 요일에 대한 데이터는 월요일~일요일까지 총 일곱 개의 값만 갖고, 계절에 대한 데이터는 봄~겨울까지 총 네 개의 값을 갖는다.

    이와 같이 한정된 값만을 갖는 데이터 타입을 열거 타입이라고 한다.

     

    열거 타입 및 열거 타입 변수 선언
    public enum Week {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }

    열거 타입은 위 코드와 같이 간단하게 표현할 수 있다. 위 코드의 경우 요일을 예로 들어 열거 타입을 만든 것이다.

     

    맨 앞에 접근 제한자를 적고, 그다음에 class가 아닌 enum을 적은 후 마지막으로 enum의 이름을 작성하면 된다. 그리고 중괄호 내에 원하는 한정된 데이터를 정의한다.

     

    열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야 하는데, "Week today;"와 같이 변수를 선언하면 된다.

    그리고 이 변수에 값을 넣어주려면, "Week today = Week.SUNDAY;" 구문을 작성하면 된다.

    또한, 열거 타입도 참조 타입이기 때문에 당연히 null 값을 할당해 줄 수 있다.

     

    열거 타입의 활용
    public class Main {
        public static void main(String[] args) {
            Week today = null;
    
            Calendar calendar = Calendar.getInstance();
            int week = calendar.get(Calendar.DAY_OF_WEEK);   // 일(1) ~ 토(7)까지의 숫자를 반환
    
            switch(week) {
                case 1:
                    today = Week.SUNDAY;
                    break;
                case 2:
                    today = Week.MONDAY;
                    break;
                case 3:
                    today = Week.TUESDAY;
                    break;
                case 4:
                    today = Week.WEDNESDAY;
                    break;
                case 5:
                    today = Week.THURSDAY;
                    break;
                case 6:
                    today = Week.FRIDAY;
                    break;
                case 7:
                    today = Week.SATURDAY;
                    break;
            }
    
            System.out.println("오늘의 요일 : " + today);
        }
    }

     

    위 코드는 Calendar 클래스를 이용해서 날짜와 시간을 얻은 후, 열거 타입 변수 today에 Calendar 열거 상수를 대입하여 오늘의 요일을 알아보는 코드이다.

     

     

    이 게시글을 작성할 당시 화요일이었기 때문에 "TUESDAY"가 나오는 것을 확인할 수 있다.

     

    열거 객체의 메서드

    열거 객체는 열거 상수를 의미한다.

    MONDAY, TUESDAY, ..., SUNDAY가 모두 열거 상수이고, 이것은 모두 열거 객체로 생성된다.

    이러한 열거 객체의 메서드에는 아래와 같은 종류의 메서드들이 존재한다.

     

    리턴 타입 메서드 설명
    String name() 열거 객체의 문자열을 반환
    int ordinal() 열거 객체의 순번(0부터 시작)을 반환
    int compareTo() 열거 객체를 비교해서 순번 차이를 반환
    열거 타입 valueOf(String name) 주어진 문자열의 열거 객체를 반환
    열거 배열 values() 모든 열거 객체들을 배열로 반환

     

    1. name()

    name() 메서드는 열거 객체가 가지고 있는 문자열을 리턴한다.

    이때, 리턴되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일하다.

     

    Week today = Week.SUNDAY;
    String name = today.name();

    위 코드에서 name 변수는 "SUNDAY"를 할당받게 된다.

     

    2. ordinal()

    ordinal() 메서드는 전체 열거 객체 중 몇 번째 열거 객체인지 알려주는 메서드이다.

    열거 객체의 순번은 열거 타입을 정의할 때 주어진 순번을 말하는데, 0번부터 시작한다.

     

    public enum Week {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    }

    위 열거 타입 Week에서 열거 객체 MONDAY의 순번은 0, TUESDAY는 1이고 아래에 정의된 열거 객체의 순번은 1씩 증가한다.

     

    3. compareTo()

    compareTo() 메서드는 매개 값으로 주어진 열거 객체를 기준으로 전후 몇 번째 위치하는지 비교한다.

     

    Week day01 = Week.MONDAY;
    Week day02 = Week.WEDNESDAY;
    
    System.out.println(day01.compareTo(day02));   // -2 출력
    System.out.println(day02.compareTo(day01));   // 2 출력

    위와 같은 코드가 있을 때, day01.compareTo(day02)를 호출하면 반환되는 값은 -2가 되고, day02.compareTo(day01)를 호출하면 반환되는 값은 2가 된다.

     

    4. valueOf()

    valueOf() 메서드는 매개 값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.

     

    Week day01 = Week.MONDAY;
    Week day02 = Week.valueOf("MONDAY");

    위 코드에서 Week 타입 변수 day01과 day02는 MONDAY라는 동일한 열거 객체의 값을 할당받았다.

     

    5. values()

    values() 메서드는 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴한다. 

     

    public class Main {
        public static void main(String[] args) {
            Week[] days = Week.values();
    
            for (Week day : days) {
                System.out.println(day.name());
            }
        }
    }

    배열 days에 열거 타입 Week의 모든 열거 객체들이 담기게 된다.

     

     

    소스코드의 실행 결과는 위와 같다.

     

    열거 타입 상수를 다른 값과 연결하기

    과일가게에 왔다고 해보겠다. 과일가게에 파는 과일은 사과, 복숭아, 포도, 망고가 있었고, 각각 가격이 1000원, 1500원, 2000원, 3000원이다.

     

    이러한 과일과 가격정보를 열거 타입 상수에 담으려고 한다.

     

    public enum Fruit {
        APPLE(1000),
        PEACH(1500),
        GRAPE(2000),
        MANGO(3000);
    
        private final int price;
    
        private Fruit(int price) {
            this.price = price;
        }
    
        public int getPrice() {
            return price;
        }
    }

    소스코드를 살펴보면, 생성자의 접근 제한자가 private인 것을 제외하면, 기본적인 클래스의 구현 코드와 유사하다.

     

    맨 윗줄의 열거형 상수를 보면, 열거형 상수는 열거 객체로 생성된다고 하였는데, 각각의 멤버 변수인 price를 가지고 있다. 그리고 "Fruit.getPrice();" 구문을 실행함으로써 과일의 가격을 알 수 있게 된다.

     

    public class Main {
        public static void main(String[] args) {
            Arrays.asList(Fruit.values())
                    .stream()
                    .forEach(fruit -> System.out.printf("%s의 가격 : %d\n", fruit.name(), fruit.getPrice()));
        }
    }

    람다와 stream api를 사용하여, 단순히 열거 상수의 데이터를 출력한 것이다.

     

     

    출력 결과는 위와 같다.


    출처

    https://steady-coding.tistory.com/293

    https://steady-coding.tistory.com/294

     

    728x90

    'Language > Java' 카테고리의 다른 글

    Java - 표준 API의 함수적 인터페이스  (0) 2022.11.30
    Java - 람다식의 개념과 사용 방법  (0) 2022.11.29
    Java - Custom Exception  (0) 2022.09.29
    Java - 예외 처리  (0) 2022.09.29
    Java - Exception  (0) 2022.09.29

    댓글

Designed by Tistory.