열거형

gustjtmd·2022년 1월 12일
0

Java

목록 보기
27/40
열형은 자바 5에서 추가된 자료형으로 '의미가 부여된 이름'을 갖는 '상수' 선언에 그 목적이 있다.

인터페이스 기반의 상수

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

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

public class InterfaceBaseConst {
    public static void main(String[] args) {
        who(Person.MAN);    //정상적인 메소드 호출
        who(Animal.DOG);    //비정상적인 메소드 호출
    }
    public static void who(int man){
        switch (man){
            case Person.MAN:
                System.out.println("남성 손님입니다.");
                break;
            case Person.WOMAN:
                System.out.println("여성 손님입니다.");
                break;
        }
    }
}
-------------------------------------------------------------------
남성 손님입니다.
남성 손님입니다.
Person.Man의 값도 1이고 Animal.DOG값도 1이기 때문에 위와 같은 실수를 범해도 
컴파일 오류는 물론 실행 오류도 발생하지 않는다.
이는 후에 치명저인 오류로 다가올수 있다.

자료형의 부여를 돕는 열거형

앞서 보인 문제점의 해결을 위해서 자바 5에서 열거형이 소개되었다. 열거형의 정의는 다음과 같다
enum Scale{	//열거 자료형 Scale의 정의
DO, RE, MI, FA, SO, RA, TI 
}
---------------------------------------------------------------
이는 열거형 Scale에 정의이다. 그리고 그 안에 이름들을 가리켜 '열거형 값' 이라 한다.
열거형은 클래스와 성격이 유사하다 따라서 다음과 같이 참조변수 선언도 가능
Scale sc = Scale.DO;
enum Animal{DOG, CAT}
enum Person{MAN, WOMAN}
Animal ni = Person.MAN;
-> 타입 불일치로 인한 컴파일 오류가 발생함으로 문제점 해결이 가능하다
----------------------------------------------------------------------
enum Animal{
    DOG, CAT
}
enum Person{
    MAN,WOMAN
}
public class SafeEnum {
    public static void main(String[] args) {
        who(Person.MAN);
//      who(Animal.DOG); 타입 불일치로 컴파일 오류
    }
    public static void who(Person man){
        switch (man){
            case MAN:
                System.out.println("남성 손님입니다.");
                break;
            case WOMAN:
                System.out.println("여성 손님입니다.");
        }
    }
}
--------------------------------------------------------------------
남성 손닙입니다.

클래스 내에 정의가 가능한 열거형의 정의

특정 클래스 내에서만 사용하고자 하는 열거형 값이 있다면, 아래와 같이 해당 클래스내에 열거형을 정의하면 된다.
class shape{
	enum Type{
    	Rectangle, Circle, Triangle
    }
    .......
    Type t = Type.Circle;
}
예제를 통해서 확인해보자
----------------------------------------------------------------------
class Customer{
    enum Gender{    //클래스 내에 정의된 열거형 Gender
        MALE, FEMALE
    }
    private String name;
    private Gender gen;

    Customer(String n, String g){
        name = n;

        if(g.equals("man"))
            gen = Gender.MALE;
        else
            gen = Gender.MALE;
    }
    @Override
    public String toString(){
        if(gen == Gender.MALE)
            return "Thank you, Mr " + name;
        else
            return "Thank you Mrs " + name;
    }
}

public class InnerEnum {
    public static void main(String[] args) {
        Customer cus1 = new Customer("Brown","man");
        Customer cus2 = new Customer("Susan Hill", "woman");

        System.out.println(cus1);
        System.out.println(cus2);
    }
}
---------------------------------------------------------------------
Thank you, Mr Brown
Thank you, Mr Susan Hill

열거형 값의 정체

알아보기 전에 클래스 안에 클래스 참조변수 선언, 인스턴스 생성이 가능하다는걸 확인하자
class Person{
    public static final Person MAN = new Person();
    public static final Person WOMAN = new Person();

    @Override
    public String toString(){
        return "I love dog Person";
    }
}
public class InClassInst {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}
--------------------------------------------------------------------
I love dog Person
I love dog Person

Person 클래스 안에 Person 인스턴스 생성이 가능한 이유는 static 선언이 붙어있기 때문
다시 본론으로 돌아와서 다음 코드를 통해서 열거형 값은 정체는 인스턴스라는 사실을 확인해보자
enum Person{
    MAN, WOMAN;
    private Person20(){
        System.out.println("Person constructor called");
    }
    @Override
    public String toString(){return "I love dog Person";}
}
public class EnumConstructor {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}
---------------------------------------------------------------------
Person constructor called
Person constructor called
I love dog Person
I love dog Person
---------------------------------------------------------------------

모든 열거형은 Enum 클래스를 상속한다 그리고 EnumObject클래스를 상속한다.
그리고 두 열거형 값은 Person 인스턴스를 참조하는 참조변수이다.
그 증거로 toString 메소드가 호출 되었기 떄문이다.
열거형 정의에 생성자가 없으면 디폴트 생성자가 삽입되는데 열거형 생성자의 경우에는
private으로 선언이 되어 직접 인스턴스 생성은 불가하다.


따라서 '열거형 값'의 정체는 다음과 같이 표현할수 있다.
public static final Person MAN = new Person();
public static final Person WOMAN = new Person();
-> 열거형 값의 실체를 설명하는 문장 생성자가 private라 실제 컴파일은 안된다.
인자를 전달받는 열거형의 생성자 정의 바업ㅂ과 이를 호출하는 방법
-------------------------------------------------------------------

enum Person{
    MAN(29), //Person Man = new Person(30)
    WOMAN(25); //Person WOMAN = new Person(25)

    int age;
    private Person(int age){
        this.age = age;
    }
    @Override
    public String toString(){return "I am " + age + " years old";
    }
}
public class EnumParamConstructor {
    public static void main(String[] args) {
        System.out.println(Person.MAN);
        System.out.println(Person.WOMAN);
    }
}
-----------------------------------------------------------------------
I am 29 years old
I am 25 years old
profile
반갑습니다

0개의 댓글