개발 공부/Java & Spring

17. 열거형(enums)

빵다희 2023. 2. 12. 22:44
열거형
 : 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.
  JDK1.5부터 새로 추가되었고, 자바의 열거형은 값뿐만 아니라 타입도 관리하기 때문에 논리적인 오류를 줄일 수 있다. 
  또한 기존에는 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일 해야했지만 열거형 상수를 사용하면, 다시 컴파일 하지 않아도 된다.

* 열거형의 정의

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

* 열거형의 사용방법

enum Direction {EAST, SOUTH, WEST, NORTH}
public class Unit {
    int x, y;
    Direction dir;
    void init(){
        dir = Direction.EAST;
    }
    void move(){
        switch (dir){
            case EAST  : x++; // case문에서는 상수의 이름만 적는다.
                break;
            case WEST  : x--;
                break;
            case SOUTH : y++;
                break;
            case NORTH : y--;
                break;
        }
    }
}

* 열거형 사용 시 주의할 점

-열거형 상수간의 비교에는 '==' 를 사용할 수 있다.
- 그러나 '<' , '>'와 같은 비교연산자는 사용 할 수 없기때문에 비교가 필요할때에는 compareTo()함수를 사용해야한다.

* Enum 클래스의 메소드

https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Enum.html#method-summary

 

Enum (Java SE 19 & JDK 19)

Type Parameters: E - The type of the enum subclass All Implemented Interfaces: Serializable, Comparable , Constable This is the common base class of all Java language enumeration classes. More information about enums, including descriptions of the implicit

docs.oracle.com

- javadoc에는 안나와있지만

열거형의 모든 상수를 배열에 담아 반환하는 values() 메소드도 있다. 

모든 열거형이 가지고 있으며 컴파일러가 자동으로 추가해준다.

 

* 열거형에 멤버 추가하기

- 열거형 상수의 값이 불연속적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.

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

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

열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야한다. 

enum Direction {
	EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ';'를 추가해야한다.
    
    // 다음과 같이 하나의 열거형 상수에 여러값을 지정할 수도 있다. 그에 맞게 변수, 생성자도 추가 필요.
    // EAST(1,">"), SOUTH(5,"V"), WEST(-1,"<"), NORTH(10,"^");
    
    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;}},
 SHIP(100) {int fare(int distance){return distance*BASIC_FARE;}},
 AIRPLANE(300) {int fare(int distance){return distance*BASIC_FARE;}};
 
 abstract int fare(int distance); // 거리에 따른 요금을 계산하는 추상 메서드
 protected final int BASIC_FARE;  // protected로 해야 각 상수에서 접근 가능.
 Transportation(int basicFare){
 	BASIC_FARE = basicFare;
 }
 public int getBasicFare(){return BASIC_FARE;}
}

위 예시에는 추상메서드인 fare()를 똑같은 내용으로 구현했지만, 상수별로 다른 내용을 구현할 수도 있다.

728x90
반응형

'개발 공부 > Java & Spring' 카테고리의 다른 글

19. 쓰레드의 동기화  (0) 2023.03.09
18. 애너테이션(annotation)  (0) 2023.02.15
16. 해싱과 HashMap  (0) 2023.01.18
15. 이진 검색 트리와 TreeSet  (0) 2023.01.17
14.HashSet  (0) 2023.01.16