열거(Enum)

최명진·2024년 7월 14일

Enum이란?

  1. 상수 목록을 담을 수 있는 데이터 타입
  2. 특정한 변수가 가질 수 있는 값을 제한하므로 타입-세이프티를 보장할 수 있음
  3. 싱글톤 패턴을 구현할때 사용 => 클래스 로딩 시 한번만 인스턴스화 됨
  4. 질문 1) 특정 enum 타입이 가질 수 있는 모든 값을 순회하며 출력하라
public enum OrderStatus {
    PREPARING, SHIPPED, DELIVERING, DELIVERED
}
--- 
public static void main(String[] args) {
        Arrays.stream(OrderStatus.values()).forEach(System.out::println);
    }

Java에서 enum 타입의 values 메서드는 열거형(enum)의 모든 상수들을 배열 형태로 반환한다. 이는 열거형 상수들을 반복(iterate)하거나 집합적으로 처리하는 데 유용하며, 컴파일러에 의해 자동 생성되므로 별도의 구현 없이 사용할 수 있다.

  1. 질문 2) enum은 자바의 클래스처럼 생성자, 메소드, 필드를 가질 수 있는가?
public enum OrderStatus {
    PREPARING(1),
    SHIPPED(2),
    DELIVERING(3),
    DELIVERED(4),
    ;

    private int code;

    OrderStatus(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

enum은 클래스처럼 생성자, 메소드, 필드를 가질 수 있다.
단순한 상수 상태 => 더 복잡한 데이터 구조로 사용할 수 있게 한다.

  1. 질문 3)enum의 값은 == 연산자로 동일성을 비교할 수 있는가?

enum 상수는 싱글톤 패턴으로 같은 타입의 동일한 열거 상수는 같은 객체를 참조하기 때문에, == 연산자를 통해 비교를 할 수 있다.


equals 연산자를 사용 시 NPE를 유발하기 때문에 enum은 == 연산자를 사용해야한다.

  1. 질문 4)enum을 key로 사용하는 Map을 정의하세요. 또는 enum을 담고 있는 set을 만들어보세요.

    enumMap은 매우 빠른 접근 시간 O(1)을 갖는다.
    enum 상수의 ordinal 값을 사용해 배열의 인덱스를 계산해 메모리 사용이 효율적이다.
    enum 상수의 정의 순서를 유지하여 순서를 유지하는 컬렉션이 필요한 경우 별도 정렬 비용이 들지 않는다.

    EnumSet은 내부적으로 비트 벡터를 사용해 enum 상수의 포함여부를 관리하여
    추가,삭제 포함 여부 확인 연산이 매우 빠르다 (복잡도 O(1))
    비트벡터를 사용하여 저장 공간이 매우 효율적이다.
    enumSet 또한 별도의 정렬 비용이 들지 않는다.
profile
주니어 백엔드 개발자 Choi입니다.

0개의 댓글