티스토리 뷰

728x90

JDK 1.5버전부터 추가된 자바의 열거형은 값 뿐만 아니라 타입까지 관리하기 때문에 논리적인 오류를 줄일 수 있다.

public class Card {

    static final int CLOVER = 0;
    static final int HEART = 1;
    static final int DIAMOND = 2;
    static final int SPADE = 3;

    static final int TWO = 0;
    static final int THREE = 1;
    static final int FOUR = 2;

}

기존의 코드를 열거형클래스인 enum으로 바꿀 수 있다.

public class CardEnum {

    //열거형 Kind를 정의
    enum Kind {CLOVER, HEART, DIAMON, SPADE}
    //열거형 Value를 정의
    enum Value {TWO, THREE, FOUR}
}

 

자바의 Enum은 타입에 안전한 열거형(typesafe enum) 이다.

실제 값이 같아도 타입이 다르면 조건식의 결과가 false가 된다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 안전하다고 하는 것이다.

public static void main(String[] args) {

    if(Card.CLOVER == Card.TWO) //true 이지만 false이어야 의미상 맞는다.
    
    if(Card.Kind.CLOVER == Card.Value.TWO)  //false. 값은 같지만 타입이 다르므로 컴파일 오류
}

Enum을 사용했을 때 이점은 인터페이스에 정의한 상수 또는 클래스안에 상수의 값이 바뀌면 상수를 참조하는 모든 소스를 다시 컴파일 해야하지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 된다.

 

열거형을 정의하고 사용하는 방법

enum 열거형이름 { 상수명1, 상수명2, ...}

기본적으로 상수를 정의할 때 처럼 상수명은 대문자로 만들어준다. 만약 열거 상수가 여러 단어로 구성될 경우 언더바(_)로 연결한다.

enum Phone { IPHONE, SAMSUNG, LG, GOOGLE}
enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

열거형을 사용하는 방법은 열거형이름.열거상수 이다.

열거타입 변수 = 열거타입.열거상수

Week today = Week.SUNDAY

열거 타입 변수는 null 값을 저장할 수도 있다. (열거타입도 참조변수이기 때문)

Week today = null

열거 상수는 객체로 생성된다. 위의 Week의 경우 7개의 객체가 생성되는 것이다.

이것이 자바다 - Enum

열거 타입 변수 today는 스택 영역에 생성되고 today에 저장된 값은 Week.SUNDAY 열거 상수가 참조하는 객체의 주소이다.

그래서 Week.SUNDAY와 today 변수는 서로 같은 영역을 참조하고 있는 것이다.

그렇기 때문에 today 변수와 Week.SUNDAY 상수의 == 결과는 true 이다.

이것이 자바다 - Enum

today == Week.SUNDAY //true

열거형은 switch 조건식에서도 사용할 수 있다.

public class week11Main {
    public static void main(String[] args) {

        Week week = Week.SATURADAY;

        switch (week) {
            case MONDAY:
            case TUESDAY:
            case WEDNESDAY:
            case THURSDAY:
            case FRIDAY:
                System.out.println("일하자~");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("쉬자~");
                break;
        }
    }
}

이때 주의할 점은 case문에 열거형의 이름은 적지않고 상수의 이름만 적어야 한다.

열거형 상수에 값을 부여하는 방법

열거형 상수에 값을 부여하는 방법은 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.

단, 값을 동적으로 할당하는 것은 불가능하다.

public enum Week {
    MONDAY(0),
    TUESDAY(1),
    WEDNESDAY(2),
    THURSDAY(3),
    FRIDAY(4),
    SATURDAY(5),
    SUNDAY(6);

    private final int WeekValue;

    Week(int weekValue) {
        WeekValue = weekValue;
    }

    public int getWeekValue() {
        return WeekValue;
    }
}

 

상수 아래에는 WeekValue 라는 변수가 final로 선언되어 있다. 이 변수는 생성자에서 매개 변수로 넘겨 받은 값을 할당할 때 사용된다.

enum 클래스도 생성자를 사용할 수는 있지만, 생성자의 선언부를 보면 public 이 아니다. enum 클래스 생성자는 package-private와 private 생성자로만 사용할 수 있다. 앞에서 사용한 Week enum 클래스는 생성자도 없는데 어떻게 작동이 되었냐면 enum 클래스는 일반 클래스와 마찬가지로 컴파일할 때 생성자를 자동으로 만들어 준다.

 

열거형 상수에 부여한 값을 사용하려면 getter 메서드인 getWeekValue() 메서드를 사용하면 된다.

Week[] values = Week.values();
Arrays.stream(values).forEach(i -> {
    System.out.println(i.getWeekValue());
});

0
1
2
3
4
5
6

enum이 제공하는 메서드

모든 열거형의 조상은 java.lang.Enum 클래스이다. 모든 열거형 클래스는 Enum 클래스를 상속받는다. 

public final String name()
public final int ordinal()
public String toString()
public final boolean equals(Object obj)
public final int hashCode()
public int compareTo(E obj)
public static <T extends Enum> T valueOf(Class enumType,String name)
public final Class <E> getDeclaringClass() // enum 객체의 타입 반환
public final Object clone() throws CloneNotSupportedException
protected final void finalize()

name() 메소드

name() 메소드는 열거 객체가 가지고 있는 문자열을 리턴한다.

Week today = Week.SATURADAY
String name = today.name()

ordinal() 메소드

ordinal() 메소드는 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다. 열거 객체의 순번은 열거 타입을 정의할 때 주어진 순서대로 시작한다. 시작 순번은 0번부터 시작한다.

Week today = Week.SATURADAY;
int ordinal = today.ordinal();

//월화수목금토일  0,1,2,3,4,5,6  5값을 반환

compareTo() 메소드

compareTo() 메소드는 매개값으로 주어진 열거 객체를 기준으로 전후로 몇 번째 위치하는지 비교한다. 열개 객체가 매개값보다 순번이 빠르면 음수값을, 순번이 늦으면 양수를 반환한다.

Week day1 = Week.MONDAY;
Week day2 = Week.WEDNESDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);

System.out.println("result1 = " + result1);  //-2
System.out.println("result2 = " + result2);  //2

valueOf() 메소드

valueOf() 메소드는 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다. 이 메소드는 외부로부터 문자열을 입력받아 열거 객체로 변환할 때 유용하게 사용 가능하다.

Week weekDay = Week.valueOf("SATURDAY");
System.out.println("weekDay = " + weekDay.name()); //SATURDAY

values() 메소드

values() 메소드는 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴한다.

Week[] values = Week.values();
Arrays.stream(values).forEach(i -> {
    System.out.println(i.name());
});

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

참조

자바의 정석 - www.yes24.com/Product/Goods/24259565?OzSrank=2

이것이 자바다  - www.yes24.com/Product/Goods/15651484

자바의 신 - www.yes24.com/Product/Goods/42643850

오라클 Docs -  docs.oracle.com/javase/tutorial/java/index.html

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함