JAVA

ENUM - 열거형

Meluu_ 2025. 2. 10. 16:56



자바 공부가 너무 처참해서 다시 공부하기로 했다.

이번에는 내가 제일 모르는 ENUM에 대해서 많이 찾아보고 직접 쳐보고 배운 것을 정리하겠다.

 

 

 

ENUM이란?

열거, 목록 등으로 상수들의 집합이다.

 

 

보통 상태를 표현할 때 많이 쓰는 것 같다. (대부분 배송 상태, 날짜 등으로 예제를 갖는다.)

 

ENUM이 있기 전에는 private static final 자료형 상수명  이런 식으로 많이 사용했지만 ENUM이 있으니 ENUM을 사용하면 된다.

 

 

왜 사용하는가 ?

  • type-safety(타입 안정성) 보장
  • 단순성, 가독성 up
  • ENUM은 싱글톤 객체
  • 변경 범위 최소화
  • 컴파일 에러 (체크 에러)
  • switch 문 사용 가능

 

사용 방법

enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

대문자로 상수표현

공백 금지 ( 대신 '_' 사용)

 

enum 끼리는 == 으로 비교하고

reference 타입임으로 주소값을 복사 한다. 

 

순번 : 위에서부터 0번~n번으로 순번이 부여된다. 

 

 

내장 메서드

name()                // enum 객체 문자열 리턴
ordinal()             // enum 객체의 순번 리턴
compareTo()           // enum 객체 비교 순번 차이를 리턴
valueOf(String name)  // 문자열을 입력받아서 일치하는 Enum 객체 리턴
valeus()              // enum 배열 반환

 

보통 enum 클래스 내에서 사용하는 듯 하다. 

 

 

특정 값 추가

ENUM에 특정 값을 매핑할 수 있다. 

enum Season {
    SPRING(1, "봄"),
    SUMMER(2, "여름"),
    AUTUMN(3, "가을"),
    WINTER(4, "겨울");
    
    private final int code;
    private final String description;
    
    // 순서 중요!
    Season(int code, String description) {
        this.code = code;
        this.description = description;
    }
    
    public int getCode() {return code;}
    public String getDescription() {return description;}
}

 

이때 ENUM의 생성자를 만들어줘야하며

매개변수의 순서가 중요하다. 

꼭 맞춰서 생성자를 생성해주자.

 

그리고 생성자는 ENUM의 매핑된 값이 매개변수로 들어가는 것이다. 

즉 매핑된 값을 초기화해주는 역할을 한다. 

 

 

 

코드, 이름으로 Season Enum 객체 찾기

public static Season getSeasonFromCode(int code) {
    reuturn Arrays.stream(Season.values())
             .filter(season -> sesason.getCode() == code)
             .findFirst() // Optional 반환
             .orElseThrow(() -> new IllegalArgumentException("잘못된 코드");
}

// SUMMER 이런 식으로 이름으로 찾기
public static Season getSeasonFromName(String name) {
    reuturn Arrays.stream(Season.values())
             .filter(season -> sesason.name().equals(name))
             .findFirst() // Optional 반환
             .orElseThrow(() -> new IllegalArgumentException("잘못된 이름");
}

 

static 사용 이유

ENUM은 인스턴스 생성이 불가능기에 인스턴스가 필요없는 메서드는 static으로 선언해야한다.

enum 클래스 전체에서 사용할 공통적인 기능(getSeasonFromCode() 등)을 제공하기 위해 static을 사용한다.

 

그럼 getCode()는 왜 static이 아닌가?

jvm이 enum 클래스 로딩 시점에 단 한 번 인스턴스화 하고 재사용한다. 

즉, enum의 각 상수(SPRING 등)는 실행될 때 한 번 인스턴스화 되기에

getCode()를 굳이 static으로 선언할 필요가 없다. (생성되었기 때문에 각 상수 객체인 개별 인스턴스에 속하는 getCode()는 필요없음)

 

하지만 enum 상수(SPRING 등)를 찾을려면 Season ENUM 클래스에 접근해서 찾아야한다. 

getSeasonFromCode(int code)는 특정 인스턴스가 아닌 enum 전체에서 특정 상수 값을 검색하는 것이기에 static이 필수이다.

 

 

 

참고

함수형 인터페이스를 매핑하면 

람다식을 사용할 수 있다.

 

 

'JAVA' 카테고리의 다른 글

정규표현식  (0) 2025.03.06
배열의 복사 : clone() 메서드 자바  (0) 2024.09.03
Lambda & Stream  (0) 2024.08.17
Optional<T>  (0) 2024.08.17