Enum 열거형

김국민·2025년 2월 28일

JAVA

목록 보기
13/21

열거형이란??

열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것
-> 여러 상수를 정의 할 때 사용하면 좋다

class Card{
	static final int CLOVER = 0;
    static final int HEART = 1;
    static final int DIAMOND = 2;
    ....
}
    
class Card{
	enum Kind;
    enum Value;
    
    final Kind kind;
    final Value value;
}

열거형 정의 & 사용법

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

enum Direction {EAST, SOUTH, WEST, NORTH}

정의된 상수를 사용하는 방법은 열거형 이름.상수명 이다

Direction.EAST;

Enum 클래스에 정의된 메서드

메서드설명
Class<T> getDeclaringClass()열거형의 Class 객체를 반환
String name()열거형 상수의 이름을 문자열로 반환
int ordinal()열거형 상수가 정의된 순서를 반환
T valueOf(Class<T> enumType, String name)열거형 상수가 정의된 순서를 반환

-> 이외에도 values()처럼 컴파일러가 자동으로 추가해주는 메서드가 있다

  • static E values()
  • static E valuesOf(String name)
  • 열거형 상수간의 비교는 ==를 사용할 수 있다. -> 빠른성능 제공
  • 비교연산자는 사용 불가 BUT compareTo() 사용 가능

사용법

Direction d = Direction.valueOf("WEST");
System.out.println(d); //WEST
System.out.println(Direction.WEST==Direction.valueOf("WEST")); //true

열거형에 멤버 추가하기

열거형 상수형의 값이 불연속적인 경우 상수의 이름 옆에 괄호와 함게 원하는 값을 적는다.
enum Direction {EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
-> 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 추가해야함
-> 상수 값에 여러 값을 넣을수도 있다.

package chapter3.enumm;

public enum Direction {
    EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^");
    private static final Direction2[] dArr = Direction.values();
    private final int value; //인스턴스 변수
    private final String symbol;

    Direction(int value, String symbol) {
        this.value = value;   //생성자
        this.symbol = symbol;
    }

    public int getValue() {
        return value;
    }

    public String getSymbol() {
        return symbol;
    }
}

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

enum TransPortation 구현하면서 알아보기

  • 운송 수단의 종류별로 상수를 정의하고 있다
  • 각 운송 수단에는 기본요금이 있다
  • 운송요금을 반환하는 메서드
package chapter3.enumm;

public enum Transportation {
    BUS(10),
    TRAIN(150),
    SHIP(100),
    AIRPLANE(300);

    protected final int BASIC_FARE;

    Transportation(int basicFare) {
        BASIC_FARE = basicFare;
    }

}

이렇게 해도 되지만 이동거리에 따른 요금도 계산해야 한다.
-> 거리에 따라 요금을 계산하는 방식이 다르기 때문에
-> 추상메서드를 선언하여 요금계산 메소드를 구현하자

package chapter3.enumm;

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

    protected final int BASIC_FARE;

    Transportation(int basicFare) {
        BASIC_FARE = basicFare;
    }

    public int getBASIC_FARE() {
        return BASIC_FARE;
    }

    abstract int fare(int distance);
}

열거형을 더 깊게

내부적으로 열거형이 어떻게 구현되었을까..

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 NORTH = new Direction("NORTH");
    private String name;
    
    private Direction(String name){
        this.name = name;
    }
}
  • 또 열거형 상수끼리 == 비교가 가능한 것은 객체의 주소값이 바뀌지 않기 때문에

  • 객체가 생성될 때마다 번호를 붙여서 인스턴스 변수에 저장한다.
    Comparable인터페이스를 구현해서 ordinal값으로 비교 할 수 있다.

profile
개발지망생

0개의 댓글