<TIL> 32. 열거형(enum)

YUJIN LEE·2023년 2월 27일
0

개발log

목록 보기
28/149

열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있다.

class Card{
	enum Kind { clover, heart, diamond, spade}
    enum Value { two, three, four}
    
    final Kind kind;
    final Value value;

이런게 열거형의 방식인데, 따로 값을 지정해주지 않아도, 자동적으로 0부터 시작하는 정수값이 할당된다.
ex) clover = 1 , heart = 2, diamond = 3 ....

if(Card.CLOVER == Card.TWO) // true지만, false여야 의미상 맞다.
왜냐면 카드의 무늬와 숫자는 비교 대상이 아니라서..

열거형을 이용해 상수를 정의한 경우, 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생.

if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러 타입이 달라서 비교 불가

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

열거형에 정의된 상수를 사용한느 방법
열거형이름.상수형

열거형 상수간의 비교에는 '==' 사용가능
그러나, < > 이러한 비교 연산자는 사용불가.
compareTo()는 사용가능.

compareTo()?
두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환

열거형 상수의 값이 불규칙적인 경우
enum Direction{ EAST(1), SOUTH(5), WEST(-1), NORTH(10) }
이런식으로, 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해줘야 함.
*주의할점 - 열거형 상수를 먼저 모두 정의 후 다른 멤버를 추가해야함

enum Direction { 
	EAST(1), SOUTH(5), WEST(-1), NORTH(10); 
    
    private final int value;  // 정수를 저장할 필드(인스턴스 변수) 추가
    Direction(int value) { this.value = value; } // 생성자 추가
    
    public int getValue() {return value;}
    

열거형의 인스턴스 변수는 반드시 final이어야 한다는 제약은 없지만, value는 열거형 상수의 값을 저장하기 위한 것이므로 final을 붙임.
그리고 외부에서 이 값을 얻을 수 있게 getValue()도 추가

열거형 Direction d = new Direction(1); // 에러. 열거형의 생성자는 외부에서 호출x
열거형 Direction에 새로운 생성자가 추가되었지만, 위와 같이 열거형의 객체를 생성할 수 없다. 왜냐면 열거형의 생성자는 제어자가 묵시적으로 private이기 때문.

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글