개발/Java&Kotlin

[Java] 열거형(enums)

devhooney 2022. 9. 13. 10:29
728x90

자바의 정석 챕터 13을 읽고 정리

 

1. 열거형이란?

- 열거형은 서로 관련된 상수를 편리하게 선언하기 위해 사용

- 자바의 열거형은 타입에 안전한 열거형

- 실제 값이 같아도 타입이 다르면 컴파일 에러 발생

 

class Card {
	static final int HELLO = 0;
    static final int WORLD = 1;
    
    static final int HL = 0;
    static final int WR = 1;
    
    final int kind;
    final int num;
}

// 열거형으로 표현
class Card {
	enum Kind { 
    	HELLO, WORLD
    }
    
    enum Value {
    	HL, WR
    }
    
    final Kind kind;
    final Value value;
}

 

- 비교를 하면

 

if (Card.Kind.HELLO == Card.Value.HL) // 컴파일 에러. 값은 같지만 타입이 다르다.

 

 

2. 열거형의 정의와 사용

- 열거형은 위에서 선언한 것 처럼 열거형이름과 상수의 이름을 나열한다.

 

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

 

- 사용할 땐 '열거형이름.상수'로 사용

- 클래스의 static 변수 사용과 동일하다.

- 열거형 상수간의 비교는 '=='를 사용하기 때문에 equals()보다 성능이 좋다.

- '<', '>'는 사용할 수 없음 (대신 comapreTo() 사용 - 같을 경우 0 리턴, 왼쪽이 클 경우 양수 리턴, 오른쪽이 클 경우 음수 리턴)

 

enum Direction { EAST, WEST, SOUTH, NORTH }

class Unit {
	int x, y;
    Direction dir; // 열거형을 인스턴수 변수로 선언
    
    void init() {
    	dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
    }
    
    if (dir == Direction.EAST) {
    	x++;
    } else if (dir > Direction.WEST) {
    	// 에러. 비교연산자 사용 불가
    } else if (dir.compareTo(Direction.WEST) > 0) {
    	...
    }
   
}

 

- 열거형 Direction 모든 상수 출력 시

 

Direction[] dArr = Direction.values();

for (Direction d: dArr) System.out.println(d.name() + ", " + d.ordinal());

- name()은 값을 출력, ordinal()은 index 출력

 

 

 

728x90

 

 

3. 열거형에 멤버 추가하기

- 열거형의 상수를 직접 주고 싶으면 ()안에 넣어주면 된다.

 

enum Direction { 
	EAST(1), WEST(3), SOUTH(5), NORTH(8);
	
    private final int value;
    Direction (int value) {
    	this.value = value;
    }
    
    public int getValue() {
    	return value;
    }
}

 

열거형에 추상 메소드 추가하기

- 거리에 따라 요금이 달라지므로, 추상 메소드를 추가했음.

enum Transportation {
	
    BUS(100) {
    	int fare (int distance) {
        	return distance * BASIC_FARE;
        }
    },
    TRAIN(150) {
    	int fare (int distance) {
        	return distance * BASIC_FARE;
        }
    }
    
    abstract int fare (int distance);
    
    protected final int BASIC_FARE;
    
    Transportation (int basicFare) {
    	BASIC_FARE = basicFare;
    }
    
    public int getBasicFare() {
    	return BASIC_FARE;
    }
}

 

 

4. 열거형의 이해

- 열거형에서 상수 각각은 객체이다.

 

enum Direction { EAST, WEST }

// 클래스로 정의 시
class Direction {
    static final Direction EAST = new Direction("EAST");
    static final Direction WEST = new Direction("WEST");
    
    private String name;
    
    private Direction (String name) {
   		this.name = name;
    }
   
}

 

- static 상수이기 때문에 '=='로 비교 가능하다.

 

728x90