본문 바로가기

# 02/Java

[윤성우 열혈자바] 25-1. 열거형

반응형

인터페이스 기반 상수의 정의 : 자바 5 이전의 방식


interface Scale {


int DO = 0; int RE = 1; int MI = 2; int FA = 3;

int SO = 4; int RA = 5; int TI = 6;


}



인터페이스 내에 선언된 변수는 public, static, final이 선언된 것으로 간주









이전 방식의 문제점


interface Animal {

int DOG = 1;

int CAT = 2;

}


interface Person {

int MAN = 1;

int WOMAN = 2;

}


class NonSafeConst {

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;

}

}

}








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


enum Scale {                                        // 열거 자료형 Scale의 정의


DO, RE, MI, FA, SO, RA, TI


}        열거형 값(Enumerated Values)



case문에서는 표현의 간결함을 위해 Do와 같이 '열거형 값'의 이름만 명시하기로 약속되어 있다.



public static void main(String[] args) {

Scale sc = Scale.DO;

System.out.println(sc);


switch(sc) {

case DO :

System.out.println("도~ ");

break;

case RE :

System.out.println("레~ ");

break;

case MI :

System.out.println("미~ ");

break;

case FA :

System.out.println("파~ ");

break;

default :

System.out.println("솔~ 라~ 시~");

break;

}

}








열거형 기반으로 수정한 결과와 개선된 부분


enum Animal {

DOG, CAT

}


enum Person {

MAN, WOMAN

}


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("여성 손님입니다.");

break;

}

}

}








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


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

get = Gender.FEMALE;

}

. . .

}


클래스 내에 열거형이 정의되면 해당 클래스 내에서만 사용 가능한 열거형이 된다.








열거형 값의 정체 : 이런 문장 삽입 가능합니다.


class Person {

public static final Person MAN = new Person();

public static final Person WOMAN = new Person();


@Override

public String toString() {

return "I am a dog person";            // "나는 개를 사랑하는 사람입니다."

}

}


class InClassInst {

public static void main(String[] args) {

System.out.println(Person.MAN);

System.out.println(Person.WOMAN);

}

}



Person 클래스 안에 Person 참조변수 선언 가능!!

Person 클래스 안에 Person 인스턴스 생성 가능? static 일때만 가능!!

(static 없으면 재귀가 되서 계속 인스턴스 생성되는 것이므로 불가능,

 static 있으면 클래스 안에 자리만 빌려준 것이므로 생성 가능!!)








열거형 값의 정체 : 열거형 값이 인스턴스라는 증거 1


enum Person{

MAN, WOMAN;


@Override

public String toString() { return " I am a dog person"; } 

}


class EnumConst {

public static void main(String[] args) {

System.out.println(Person.MAN);            // toString 메소드의 반환 값 출력

System.out.println(Person.WOMAN);        // toString 메소드의 반환 값 출력

}

}




모든 열거형은 java.lang.Enum<E> 클래스를 상속한다.

그리고 Enum<E>는 Object 클래스를 상속한다. 이런 측면에서 볼 때 열거형은 클래스이다.









열거형 값의 정체 : 열거형 값이 인스턴스라는 증거 2


enum Person {

MAN, WOMAN;


private Person() {

System.out.println("Person constructor called");

}


@Override

public String toString() { return "I am a dog person"; }

}


class EnumConstructor {

public static void main(String[] args) {

System.out.println(Person.MAN);

System.out.println(Person.WOMAN);

}

}



열거형의 정의에도 생성자가 없으면 디폴트 생성자가 삽입된다.

다만 이 생성자는 private으로 선언이 되어 직접 인스턴스를 생성하는 것이 불가능하다.










열거형 값의 정체 : 결론


enum Person{

MAN, WOMAN;

. . . .

}


public static final Person MAN = new Person();

public static final Person WOMAN new Person();



열거형 값의 실체를 설명하는 문장 실제로 이렇게 컴파일이 되지는 않음








열거형 생성자에 인자 전달하기


enum Person {

MAN(29), WOMAN(25);


int age

private Person(int age) {

this.age = age;

}


@Override

public String toString() {

return "I am " + age + " years old";

}

}


class EnumParamConstructor {

public static void main(String[] args) {

System.out.println(Person.MAN);

System.out.println(Person.WOMAN);

}

}





반응형