본문 바로가기

Development/JAVA

(Java) Chapter14. enum

1. enum이전의 상수 사용

  1) 사용 배경

  - 상수는 변하지 않는 값으로 변수의 반대편에 있음.

  - Java5.0부터 생긴 기능

  - 이전에 사용했던 패턴들을 유지하는 경우도 있으니 전 버전은 알고 가자

  - int x(=변수) = 1(=상수)

 

  2) 이전 버전 사용 예시

package chapter_12;

//public class _03_Enum {
//    public static void main(String[] args) {
//        /*
//        1. 사과
//        2. 복숭아
//        3. 바나나
//         */
//        int type = 1;                   // 상수에 대한 주석을 지운다면 무엇을 위한 코드인지 알 수 없음
//        switch (type) {
//            case 1:
//                System.out.println(57);
//                break;
//            case 2:
//                System.out.println(34);
//                break;
//            case 3:
//                System.out.println(93);
//                break;
//        }
//    }
//}

public class _03_Enum {
    private final static int APPLE = 1;    // 변수 자체를 이름을 지정해두면 상수에 대한 정보 바로 알 수 있음
    private final static int PEACH = 2;
    private final static int BANANA = 3;

    public static void main(String[] args) {
        int type = APPLE;
        switch (type) {
            case APPLE:
                System.out.println(57 + " kcal");
                break;
            case PEACH:
                System.out.println(34 + " kcal");
                break;
            case BANANA:
                System.out.println(93 + " kcal");
                break;
        }
    }
}

  3) enum 사용 예시

package chapter_12;
// enum(열거형, enumerated type): 서로 연관된 상수들의 집합
/*
class Fruit {
    public static final Fruit APPLE = new Fruit();
    public static final Fruit PEACH = new Fruit();
    public static final Fruit BANANA = new Fruit();
}
 */
enum Fruit {        // 여기서의 Fruit 는 class와 같음, 위의 클래스와 같은 의미
    APPLE, PEACH, BANANA
}
/*
class Company {
    public static final Company GOOGLE = new Company();
    public static final Company APPLE = new Company();
    public static final Company ORACLE = new Company();
}
 */
enum Company {      // 위의 클래스와 같은 의미
    GOOGLE, APPLE, ORACLE
}
public class _05_Enum3 {
    public static void main(String[] args) {
        Fruit type = Fruit.APPLE;
        switch (type) {
            case APPLE:
                System.out.println(57 + " kcal");
                break;
            case PEACH:
                System.out.println(34 + " kcal");
                break;
            case BANANA:
                System.out.println(93 + " kcal");
                break;
        }
    }
}

  4) enum 사용의 효과

  - 코드가 단순해진다.

  - 인스턴스 생성과 상속을 방지한다.

  - 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.

  - 즉, 열거이기 때문에 위치값도 부여받으면서도 상수가 제한사항 이외의 데이터타입이어도 상관 없음

 

  5) enum과 생성자

  - enum은 사실상 class와 같은 위계이기 때문에 생성자를 가질 수 있음

package chapter_12;
// enum(열거형, enumerated type): 서로 연관된 상수들의 집합
/*
class Fruit {
    public static final Fruit APPLE = new Fruit();
    public static final Fruit PEACH = new Fruit();
    public static final Fruit BANANA = new Fruit();
}
 */
enum Fruit {        // 여기서의 Fruit 는 class 와 같음, 위의 클래스와 같은 의미
    APPLE("red"), PEACH("pink"), BANANA("yellow"); // 괄호 안 색깔은 생성자가 호출 할 색 정보 명시
    private String color;                   // 필드값도 가질 수 있음, 여기서는 private 으로 사용자가 직접 변수를 수정하는 것을 막음
    public String getColor() {              // enum 은 클래스이기 때문에 메소드도 가질 수 있음
        return this.color;
    }
    Fruit(String color) {                   // enum 은 클래스이기 때문에 생성자를 가질 수 있음
        System.out.println("Call Constructor " + this);
        this.color = color;                 // 좌항은 필드값(전역변수), 우항은 매개변수(지역변수) 생성자 괄호 안(String color)를 지칭
    }
}
/*
class Company {
    public static final Company GOOGLE = new Company();
    public static final Company APPLE = new Company();
    public static final Company ORACLE = new Company();
}
 */
enum Company {      // 위의 클래스와 같은 의
    GOOGLE, APPLE, ORACLE
}
public class _05_Enum3 {
    public static void main(String[] args) {
        Fruit type = Fruit.APPLE;
        switch (type) {
            case APPLE:         // 57 kcal, color red
                System.out.println(57 + " kcal, color " + Fruit.APPLE.getColor());
                break;
            case PEACH:         // 34 kcal, color pink
                System.out.println(34 + " kcal, color" + Fruit.PEACH.getColor());
                break;
            case BANANA:        // 93 kcal, color yellow
                System.out.println(93 + " kcal, color" + Fruit.BANANA.getColor());
                break;
        }
    }
}

  6) 열거형 활용

public class _05_Enum3 {
    public static void main(String[] args) {
        for (Fruit f : Fruit.values()) {
            System.out.println(f);
        }
    }
}

  - 열거형은 연관된 값들을 저장한다.

  - 값들이 변경되지 않도록 보장한다.

  - 자체가 클래스이기 때문에 내부에 생성자, 필ㄷ, 메소드를 가질 수 있어 단순 상수가 아니라 더 많은 역할을 할 수 있다.

'Development > JAVA' 카테고리의 다른 글

(Java) Chapter16. Generic  (0) 2023.02.04
(Java) Chapter15. Reference  (0) 2023.01.29
(Java) Chapter13. Object  (0) 2023.01.23
(Java) Chapter12. 예외  (0) 2023.01.23
(Java) Chapter11. 접근 제어자  (0) 2023.01.17