java - 열거형 (enums)

원종서·2021년 12월 26일
0

java

목록 보기
3/9

열거형

1.1 열거형이란

JDK1.5~

자바의 열거형은 C언어의 열거형보다 향상된 것이다.
열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 논리적인 오류를 줄일 수 있다.

class Card{
	enum kind { CLOVER, HEART, DIAMOND, SPADE }
    enum Value { TWO, THREE, FOUR }
    
    final Kind kind;
    final Value value;
}

C언어와 같은 언어들은 타입이 달라도 값이 같으면 참이였으나, 자바의 열거형에서는 실제 값이 같아도 타입이 다르면 거짓이 된다.

상수 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야 하는데, 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 된다.

1.2 열거형의 정의와 사용

enum 열겨형이름 { 상수명1, 상수명2..}
enum Direction { EAST , SOUTH, WEST, NORTH }
class Unit {
	int x , y;
    Direction dir;
    
    void init(){
    	dir = Direction.EAST;
    }
}

열거형 상수간의 비교에는 '==' 사용할 수 있다. (빠른 성능을 제공한다는 얘기)
하지만 < , > 와 같은 비교연산자는 사용할 수 없도 compareTo()를 사용한다.

열거형은 switch 문에서도 사용 가능한데 case문에 열거형의 이름을 적지 않고 상수의 이름만 적어야 한다.

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

열거형에 정의된 모든 상수를 출력하기 위해서는

Direction[] dArr = Direction.values();

for(Direction d : dArr)
	System.out.println(d.name() + d.orinal());

values()는 열거형의 모든 상수를 배열어 담아 반환.

1.3 열거형에 멤버 추가하기

열거형 상수 값이 불연속적인 경우에는 다음과 같이 열거형 상수의 이름 옆에 원하는 값을 괄호에 함께 적어준다.

enum Direction { 
	EAST(1) , SOUTH(5), WEST(-1), NORTH(10);
    
    private final int value; 
    
    Direction(int value) {this.value = value; } // 묵시적으로 private 이다.
    
    public int getValue() {return value;}

}

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

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

1.4 열거형의 이해

enum Direction { EAST, SOUTH , WEST, NORTH }

열거형 상수 하나하나가 Direction 객체이다
클래스로 정의하면

class Direction {
	static final Direction EAST  = new Direction("EAST");
    	static final Direction SOUTH  = new Direction("SOUTH");
        static final Direction WEST  = new Direction("WEST");
       	static final Direction NORHT  = new Direction("NORHT");
        
        private String name;
        
        private Direction ( String name ) {
        	this.name = name;
       }
}

Direction클래스의 static 상수의 값은 객체의 주소이다. 그래서 == 로 비교가 가능했던 것이다.

0개의 댓글