[Java] Enum 클래스

프리코스 3주차 미션 진행을 위해 enum 클래스 공부를 심화해서 해보았다.

참고 사이트_Opentutorials_Java 언어

Enum 이란?

  • enum은 열거형(enumerated type)이라고 부른다.
  • 열거형은 서로 연관된 상수들의 집합이라고 할 수 있다.

Enum 고찰하기

1. private 접근제한자가 기본으로 constructor에 설정되어 있다

enum Fruit{
    APPLE,
    PEACH,
    BANANA;
}

// 위 enum 클래스와 사실상 동일한 클래스
class Fruit {
    public static final Fruit APPLE = new Fruit():
    public static final Fruit PEACH  = new Fruit();
    public static final Fruit BANANA = new Fruit();
    // 클래스 Fruit를 인스턴스로 만들 수 없다 -> 다른 용도 사용 금지
    private Fruit(){}
}

2. 하나의 클래스로 필드, 메소드를 가질 수 있다

enum Fruit{
    // 아래 코드는 Fruit의 상수를 선언하면서, 동시에 생성자를 호출
    APPLE("red"),
    PEACH("pink"),
    BANANA("yellow");

    public String color;

    // enum은 사실 클래스. 그렇기 때문에 생성자를 가질 수 있다.
    // But, public Fruit() -> 컴파일 에러. enum의 생성자가 접근 제어자 private만을 허용
    Fruit(String color) {
        System.out.println("Call Constructor " + this);
        this.color = color;
    }

    // 열거형은 메소드를 가질수도 있다
    String getColor() {
        return this.color;
    }
}

3. 상수 그룹 수 만큼 생성자를 호출한다

enum Fruit{
    APPLE, PEACH, BANANA;

    // public Fruit() -> (컴파일 에러)
    Fruit(){
        System.out.println("Call Constructor "+this);
    }
}

Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal

// Call Constructor가 출력된 것은 생성자 Fruit가 호출되었음을 의미한다.
// 이것이 3번 호출되었다는 것은 필드의 숫자만큼 호출되었다는 뜻이다.
// 단, 생성자가 접근 제어자 private만을 허용한다.

4. 서로 다른 상수 그룹에 대한 비교를 컴파일 시점에서 차단할 수 있다

enum Fruit{
    APPLE, PEACH, BANANA;
}
enum Company{
    GOOGLE, APPLE, ORACLE;
}

public class Example {
    public static void main(String[] args) {
        /*
        (컴파일 에러)
        if(Fruit.APPLE == Company.APPLE){
            System.out.println("과일 애플과 회사 애플이 같다.");
        }
        */
    }
}

5. 맴버 전체를 열거 할 수 있는 기능도 제공한다

enum Fruit{
    APPLE("red"),
    PEACH("pink"),
    BANANA("yellow");
    
    private String color;
    
    Fruit(String color){
        this.color = color;
    }
    
    String getColor(){
        return this.color;
    }
}

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

        // enum은 맴버 전체를 열거 할 수 있는 기능도 제공
        for (Fruit f : Fruit.values()) {
            System.out.println(f + ", " + f.getColor());
        }
    }
}

Enum 특징 정리

  1. 연관된 값들을 저장 : 서로 다른 상수그룹 비교를 컴파일 시점에서 차단

  2. 값들이 변하지 않도록 보장 : static final 필드와 사실상 동일

  3. 열거형 내부에 생성자, 필드, 메소드 가질 수 있음 : 열거형 자체가 클래스


TODO. 공부하면서 추가로 알게 된 내용들 문서에 추가하기

살아있는 문서 만들기!