JAVA/Java

[Java] 열거형(Enumeration Type)

민트맛녹차 2022. 9. 12. 22:16

열거형(Enum)은 Java 5 에서 추가된 자료형으로 의미가 부여된 이름을 갖는 상수의 선언에 목적이 있다.

 

Java 5 이전의 상수 선언과 문제점

interface Animal {
    int DOG = 1;
    int CAT = 2;
}

인터페이스 내에 선언된 변수는 public, static, final이 선언된 것으로 간주된다. 이러한 상수의 선언은 큰 문제를 하나 가지고 있다. 

interface Person {
    int MAN = 1;
    int WOMAN = 2;
}

public static void who(int man) {
    swtich(man) { ... }
}

Who(Person.MAN);	// 정상적인 호출
who(Animal.DOG);	// 비정상적인 호출 => 오류 발생 안함

잘못된 상수를 집어 넣었지만 값이 같기 때문에, 컴파일 오류와 실행 오류 모두 발생하지 않는다.

 

 

열거형(Enumeration Type)

enum Animal {
    DOG, CAT;
}

이러한 문제점의 해결을 위해 Java 5에서 열거형(Enumberation Type)이 추가되었다. 열거형 안에 위치한 값들은 열거형 값(Enumerated Values)이라고 한다. 모든 열거형은 java.lang.Enum<E> 클래스를 상속한다.

Animal a = Animal.DOG;

클래스와 성격이 유사해 참조변수의 선언이 가능하며, 선언된 참조변수는 열거형 내에 선언된 열거형 값만 대입 가능하다.

enum Person {
    MAN, WOMAN;
}

Animal a = Person.MAN;

열거행을 사용한다면 잘못된 값을 대입한다면 자료형 불일치로 컴파일 오류가 발생한다. 앞서 언급한 문제점이 해결된 것을 볼 수 있다.

class Person {
    public static final Person MAN = new Person();
    public static final Person WOMAN = new Person();
}

enum Person {
    MAN, WOMAN;
}

열거형은 사실 클래스 내부에서 선언된 public static final 인스턴스 값과 동일하다.  

열거형의 정의에 생성자가 없으면 디폴트 생성자가 삽입되는데 이 생성자는 private로 생성되어 직접 인스턴스 생성이 불가능하다. 

 

enum Person {
    MAN(29), WOMAN(25);
    
    int age;
    private Person(int age) {
        this.age = age;
    }
}

인자를 전달받는 열거형을 정의 가능하다. 열거형의 생성자는 반드시 private로 선언해야 하며, 위의 코드처럼 열거형 값의 선언에서 소괄호를 통해 인자를 전달할 수 있다.

열거형도 Object 클래스를 상속하는 일종의 클래스로 생서자, 인스턴스 변수, 메서드 모두 가질수 있다. 다만 모든 생성자는 private로 선언해야만 한다.

 

 

 

 

참조
윤성우의 열혈 JAVA  프로그래밍
https://www.nextree.co.kr/p11686/