자바/열거형(enums)

열겨형의 전반적인 개념(2)

백_곰 2022. 5. 17. 10:14

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

- ordinal()은 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다.

그 이유는 그 값들은 내부적인 용도로만 사용하기 때문이다.

 

 

- 만약 상수의 값들이 불연속적이라면, 그냥 상수 멤버 옆에 '()'을 사용하여 값을 넣어주며 된다.

enum Direction{ EAST(5), SOUTH(1), WEST(-1), NORTH(0) };

 

 

- 또한 지정된 값을 저장할 수 있는 인스턴스 변수생성자를 새로 추가해 주어야 한다.

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이어야 한다는 제약은 없지만, 열거형 상수의 값을 저장하기 때문에 final로 지정했다. )

 

( 만약 Direction d = new Direction(1); 로 객체생성을 한다면, 에러가 발생하게 된다. )

( 그 이유는 Direction() 생성자는 묵시적으로 private이기 때문이다. )

 

 

- 또한 필요하다면, 아래와 같이 열거형 상수에 여러 값을 지정할 수도 있다.

enum Direction{
    EAST(1, ">"), SOUTH(5, "v"), WEST(-1, "<"), NORTH(10,"^"); // 끝에 ; 
    
    private final int value;
    private final String symbol; 
    
    Direction(int value, String symbol){ //private이 생략됨.
         this.value = value;
         this.symbol = symbol;
    }
    
    public int getValue()     { return value; }
    public String getSymbol() { return symbol; }
}

 

 

 

 

3-1. 열거형에 멤버 추가하기를 이해하기 위한 예제(1)

 

enum Direction2 { 
	EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");

	private static final Direction2[] DIR_ARR = Direction2.values();
	private final int value;
	private final String symbol;

	Direction2(int value, String symbol) { // private Direction2(int value)
		this.value  = value;
		this.symbol = symbol;
	}

	public int getValue()      { return value;  }
	public String getSymbol()  { return symbol; }

	public static Direction2 of(int dir) {
        if (dir < 1 || dir > 4) {
            throw new IllegalArgumentException("Invalid value :" + dir);
        }
        return DIR_ARR[dir - 1];		
	}	

	// 방향을 회전시키는 메서드. num의 값만큼 90도씩 시계방향으로 회전한다.
	public Direction2 rotate(int num) {
		num = num % 4;

		if(num < 0) num +=4; // num이 음수일 때는 시계반대 방향으로 회전 

		return DIR_ARR[(value-1+num) % 4];
	}

	public String toString() {
		return name()+getSymbol();
	}
} // enum Direction2

public class Exercise002 {
	public static void main(String[] args){
		for(Direction2 d : Direction2.values()) 
			System.out.printf("%s=%d%n", d.name(), d.getValue()); 

		Direction2 d1 = Direction2.EAST;
		Direction2 d2 = Direction2.of(1);

		System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
		System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());

		System.out.println(Direction2.EAST.rotate(1));
		System.out.println(Direction2.EAST.rotate(2));
		System.out.println(Direction2.EAST.rotate(-1));
		System.out.println(Direction2.EAST.rotate(-2));
	}
}

 

 

 

 

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

- 예를 들어, 아래의 코드처럼 각 운송 수단에 요금이 정의되어있다고 가정해보자.

enum Transportation { 
    BUS(100), TRAIN(150), SHIP(100), AIRPLANE(300);
    
    private final int BASIC_FARE;
	
    Transportation(int basicFare) {
		BASIC_FARE = basicFare;
    }

    int fare(){ // 운송 요금을 반환
        return BASIC_FARE;
    }
}

 

( 이렇게 작성한다면, 거리에 따라 요금을 계산하는 방식이 없으므로, 이것만으로는 부족하다. )

 

( 이럴 경우, 열거형에 추상 메서드 'fare(int distance)' 를 선언하면 각 열거형 상수가 이 추상 메서드를

아래의 코드와 같이 반드시 구현해야 한다. )

enum Transportation { 
	BUS(100)      { int fare(int distance) { return distance*BASIC_FARE;}},
	TRAIN(150)    { int fare(int distance) { return distance*BASIC_FARE;}},
	SHIP(100)     { int fare(int distance) { return distance*BASIC_FARE;}},
	AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};

	protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
	
	Transportation(int basicFare) { // private Transportation(int basicFare) {
		BASIC_FARE = basicFare;
	}

	public int getBasicFare() { return BASIC_FARE; }

	abstract int fare(int distance); // 거리에 따른 요금 계산
}

 

 

 

 

4-1. 열거형에 추상 메서드 추가하기를 이해하기 위한 예제(1)

 

enum Transportation { 
	BUS(100)      { int fare(int distance) { return distance*BASIC_FARE;}},
	TRAIN(150)    { int fare(int distance) { return distance*BASIC_FARE;}},
	SHIP(100)     { int fare(int distance) { return distance*BASIC_FARE;}},
	AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};

	protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
	
	Transportation(int basicFare) { // private Transportation(int basicFare) {
		BASIC_FARE = basicFare;
	}

	public int getBasicFare() { return BASIC_FARE; }

	abstract int fare(int distance); // 거리에 따른 요금 계산
}

public class Exercise003 {
	public static void main(String[] args){
		System.out.println("bus fare="     +Transportation.BUS.fare(100));
		System.out.println("train fare="   +Transportation.TRAIN.fare(100));
		System.out.println("ship fare="    +Transportation.SHIP.fare(100));
	        System.out.println("airplane fare="+Transportation.AIRPLANE.fare(100));
	}
}

 

 

 

 

다음장

열겨형의 전반적인 개념(3) (tistory.com)

 

열겨형의 전반적인 개념(3)

 

kind-coding.tistory.com