반응형

열거형 (enum)

  • 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공

열거형은, 관련된 상수들을 같이 묶어 놓은 것이다.

예를 들어서 Card클래스 안에 상수가 있는데,
위에 있는 상수들은 카드 무늬, 아래 있는 카드들은 카드 숫자들이라고 했을 때,
이렇게 일일이 하나씩 상수를 정의하다보면, 너무 많을 수도 있다.

그래서 조금 간단히 할 수 있도록 열거형을 제공한다.
무늬는 무늬끼리, 숫자는 숫자끼리 간단하게 정의할 수 있게 한다.
이렇게 하면, 상수이면서 자동으로 값이 0부터 부여된다.

그런데,위 코드에서는 Card클래스의 CLOVER 값이 0이고, Card클래스의 TWO는 값이 0이다.
그러면 Card.CLOVER==Card.TWO)의 값은 0으로 같아서 true이다.
그런데, 사실은 Card.CLOVER는 무늬이고, Card.TWO는 숫자이므로 같다고 볼수 없다.
값이 같지만 의미가 다르다. 그래서 true가 나오면 안된다.

자바에서는 타입에 안전한 열거형을 제공한다.

이게 무슨 말이냐면, 자바에서는 값&타입을 둘다 체크한다.
값만 체크하는 것이아니라 타입도 체크한다.

Card.Kind.CLOVER==CARD.Value.TWO는 둘다 값이 0이지만,
타입이 다르기 때문에 이것을 비교하려고 하면 타입이 달라서 비교가 불가능하므로 컴파일 에러가 발생한다.

이처럼 Java의 열거형은 값&타입을 모두 체크한다.

 


 

열거형의 정의와 사용

  • 열거형을 정의하는 방법

열거형을 정의하는 방법은,
앞에 키워드 enum 이라고 쓰고, 열거형이름 { 상수명1, 상수명2, ...} 이렇게 사용하면 된다.

예를 들어서 Direction이라는 열거형을 선언할 때는,
enum Direction {EAST, SOUTH, WEST, NORTH} 이렇게 선언하면 된다.
이렇게 선언하면, 자동으로 0부터 값이 부여된다.

값을 다르게 줄 수 있는데 그 방법은 다음 시간에 공부해볼 것이다.
일단은 기본적으로 0부터 시작하는 정수값이 하나씩 부여가 된다.

 

  • 열거형 타입의 변수를 선언하고 사용하는 방법

열거형 타입의 변수 dir을 선언하면,
dir에는 Direction 열거형으로 정의된 {EAST, SOUTH, WEST, NORTH}중에 하나가 들어올 수 있다.
이 4개의 값 이외에는 들어올 수 없다. 그 이외의 값이 들어오면 에러가 발생한다.
dir = Direction.EAST로 초기화를 할 수 있다.

 

  • 열거형 상수의 비교에 == 와 compareTo() 사용가능

열거형 상수끼리 비교할 때에는 등가비교 연산자(==)와 compareTo() 사용가능하다.

dir == Direction.EAST 는 dir이 EAST인지 확인하는 것이다.

dir > Direction.WEST처럼 열거형 상수에 비교연산자를 사용할 수 없다. 사용하면 에러가 발생한다.

compareTo() 는 양쪽이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다.
dir.compareTo(Direction.WEST)

 


 

열거형의 조상 - java.lang.Enum

  • 모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.

모든 열거형은, java.lang.Enum클래스가 가지고 있는 멤버들을 상속받는다.
어떤 것들이 있냐면,

getDeclaringClass() 는 열거형의 Class객체(설계도)를 반환한다.

String name() 은 열거형 상수의 이름을 문자열로 반환한다.

int ordinal()은 열거형 상수가 정의된 순서를 반환(0부터 시작)

T valueOf(Class<T> enumType, String name)은 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

 

이외에 두가지 메서드가 더 있다.

  • values(), valueOf()는 컴파일러가 자동으로 추가

values()와 valueOf()는 컴파일러가 자동으로 추가해준다.
조상이 주는 멤버도 아닌데, 컴파일러가 자동으로 추가해준다.

그래서 values()와 valueOf()를 열거형 상수에서 사용할 수 있다.

values()를 사용하면,
Direction[] dArr = Direction.values(); 처럼 열거형 상수가 가지고 있는 모든 상수를 배열로 반환한다.

그래서 for문을 찍으면, 각 열거형 상수의 이름과 순서를 출력할 수 있다.

그리고, valueOf() 사용법은,
Direction d = Direction.valueOf("WEST"); 처럼
valueOf에다가 열거형 상수 이름을 넣어주면, 해당 열거형 상수를 반환한다.
Direction.valueOf("WEST")는 Direction.WEST와 똑같다.

 

[Ex12_5]

반응형