[Java] Enum

고병갑·2025년 3월 20일

java study

목록 보기
6/10

Enum이란?

🤔enum이란

여러 상수를 묶어 하나의 타입으로 정의한 것
즉, 상수들의 열거(enumeration)
요일, 상태 등 고정된 값들로 구성된 데이터 타입을 만들 때 사용됨

기존 인터페이스나 클래스 내에서 상수를 선언하여 상수를 관리했는데
클래스 내 선언하는 부분은 네이밍이 겹칠 가능성이 있으며 불필요하게 상수가 많아질 수 있음
인터페이스로 관리하는 경우엔 이러한 단점이 줄어들지만
IDE의 지원을 적극적으로 받을 수 없으며 타입 안정성이 떨어지는 단점이 존재
👉 이를 보완하기 위해 나온것이 Enum

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

⭐ 특징

  1. 클래스 처럼 동작
    • Enum은 단순 상수 그룹이 아니라 필드, 생성자, 메소드를 포함할 수 있는 클래스처럼 동작
    • 각 상수는 Enum 클래스의 인스턴스이며 생성자와 함께 초기화 가능
    • 생성자가 존재하지만 default 생성자는 private로 되어있으며 public으로 변경할 경우 컴파일 에러 발생
    • 다른 클래스나 인터페이스에서의 상수 선언이 클래스 로드 시점에 생성되는 것처럼 Enum 또한 생성자가 존재하지만 클래스가 로드되는 시점에서 생성되기 때문에 임의로 생성하여 사용 불가능
    • 기본적으로 Enum에 열거된 상수들은 추가적인 객체 생성 없이 외부에서 사용 가능
    • 불변이기에 상수들 앞에 아무것도 안붙지만 public static final
    • 기본적으로 final인 상수이기에 모두 대문자를 적는 것이 원칙
  1. 하나의 인스턴스가 생성되어 사용됨
    • Enum 클래스에서 선언한 상수들은 class가 로드될 때 JVM 내에서 하나의 인스턴스로 생성되어 싱글톤 형태로 어플리케이션 전체에 사용됨
    • 이는 Enum이 본질적으로 싱글톤임을 보장하며 메모리 낭비를 방지
  1. 상속 불가능

    • 모든 Enum은 내부적으로 java.lang.Enum 클래스에 의해 상속됨
    • java는 다중 상속을 지원하지 않기 때문에 Enum은 다른 클래스를 상속받을 수 없음
    • 기존에 상속받고 있는 클래스가 존재하기 때문에 다중 상속은 지원하지 않지만 다양한 인터페이스들은 구현 가능
  2. 내장 메소드 제공

    • name() : 해당 상수의 이름을 반환
    • ordinal() : Enum 내부에 있는 상수들의 index를 반환 (배열처럼 0부터 시작)
    • values() : Enum에 정의된 모든 상수를 배열의 형태로 반환. 단순 String 형태가 아닌 Enum이 가지고 있는 모든 인스턴스를 배열에 담아 반환
    • valueOf(String name) : String을 파라미터로 받아 인자로 들어온 String과 일치하는 상수 인스턴스가 존재하면 그 인스턴스를 반환
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY
}

public class EnumMethodsTest {
    public static void main(String[] args) {
        for (Day day : Day.values()) {
            System.out.println("Name: " + day.name());
            System.out.println("Ordinal: " + day.ordinal());
        }

        Day specificDay = Day.valueOf("MONDAY");
        System.out.println("Specific Day: " + specificDay);
    }
}

// 반환결과
Name: MONDAY
Ordinal: 0
Name: TUESDAY
Ordinal: 1
Name: WEDNESDAY
Ordinal: 2
Specific Day: MONDAY
​

🚨 주의점

  1. ordinal() :
    ordinal()는 상수의 순서가 변경될 시 값이 달라질 수 있어 코드의 동작이 변경될 위험이 있음

  2. 상수 이름 :
    Enum 상수의 이름을 변경하면 참조하는 모든 코드가 영향을 받음

  3. 불필요한 상수 추가x :
    Enum에 상수를 지나치게 많이 추가한다면 가독성과 유지보수가 떨어짐
    데이터가 많을 경우엔 DB나 설정 파일로 관리하는 것을 추천

  4. 비교 :
    Enum의 상수는 싱글톤이므로 값을 비교할 때 == 를 사용하는 것을 추천
    name()이나 toString() 값으로 비교시 버그가 생길 우려가 있음

  5. 메모리 :
    Enum 상수는 JVM에 의해 캐싱되므로 너무 많은 상수를 정의하거나 메모리 집약적인 필드를 추가하면 메모리 사용량이 증가할 수 있음

profile
노력 naver 배신🔥

0개의 댓글