Post

Java Enum

제한된 상수의 타입 안정성

Java Enum

📌개요

Java의 enum(열거형)은 타입 안전성(Type-Safety)과 코드 가독성을 제공하는 고정된 상수 집합 관리 도구다.

기존의 public static final 상수보다 발전된 형태로, 제한된 선택지를 표현할 때 주로 사용된다.

핵심 특징

  • Java 5부터 공식 지원 (J2SE 5.0)
  • 클래스의 확장 기능 제공 (필드, 메서드 추가 가능)
  • ComparableSerializable 자동 구현

📌내용

enum은 왜 만들어졌는가?

기존 방식의 한계

1
2
3
4
5
public class Status {
	public static final int ORDERED = 1;
	public static final int PAID = 2;
	public static final int DELIVERED = 3;
}

문제점:

  • 타입 안정성 부족: int status = 100; 처럼 유효하지 않은 값 할당 가능
  • 가독성 낮음: if (status == 1) vs if(status == Status.ORDERED)
  • 확장성 부족: 상수에 메서드나 속성을 추가할 수 없음

enum의 해결 방안

1
2
3
public enum Status {
	ORDERED, PAID, DELIVERED
}
  • 컴파일 타입 검증 Status status = Status.ORDERED만 허용 (잘못된 값 컴파일 오류)
  • 명시적 표현으로 코드 가독성 향상
  • 객체처럼 메서드/속성 추가 가능

내부 동작 원리

enum은 컴파일러에 의해 클래스로 변환된다.

  • java.lang.Enum 상속 compareTo(), name(), ordinal() 기본 제공
  • 생성자 private 외부 인스턴스화 불가
  • values(), valueOf() 자동생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public final class Status extends java.lang.Enum<Status> {
    // Enum 상수 = static final 인스턴스
    public static final Status ORDERED = new Status("ORDERED", 0);
    public static final Status PAID = new Status("PAID", 1);
    // ...

    private static final Status[] $VALUES = { ORDERED, PAID };

    private Status(String name, int ordinal) {  // 생성자는 private
        super(name, ordinal);
    }

    public static Status[] values() { return $VALUES.clone(); }
    public static Status valueOf(String name) { /*...*/ }
}

언제부터 본격적으로 사용됐을까?

  • Java 5부터 본격 도입 - J2SE 5.0 (Tiger)에서 공식적으로 추가됐다고 한다.
  • 2000년대 중반부터 도메인 모델링에서 enum이 적극 활용되기 시작됐다고 한다.
  • Spring, JPA와 같은 프레임워크에서 enum을 권장한다. (예: @Enumerated(EnumType.STRING))

어떤 것을 대체할 수 있었나

  • public static final 상수
  • interface에 상수 정의(interface Status { int ORDERED = 1; })
  • Map이나 List로 관리하던 것들

enum을 사용하게 된 결정적 이유?

비교 대상문제점enum의 장점
public static final타입 안전성 X, 가독성 낮음타입 체크 O, 명시적 이름
interface 상수구현 클래스가 강제됨독립적인 타입
Map/List 관리런타임 오류 가능성컴파일 타임 검증

🎯결론

  • enum은 기본 타입이 아니라 Java 컴파일러에 의해 특별히 처리되는 클래스다.
  • public static final 상수의 문제점인 타입 안정성과 가독성을 해결
  • 제한된 선택지를 안전하게 관리하기 위한 특수한 클래스

⚙️EndNote

성능 최적화

== vs equals()

1
2
3
Status status = Status.PAID;
if (status == Status.PAID) {} // 권장 (빠름)
if (status.equals(Status.PAID)) {} // 동작하지만 불필요

더 알아보기

  • JPA 연동: @Enumerated(EnumType.String)
  • Enum 단점: 새로운 상수 추가 시 모든 switch 검토 필요
  • Enum 과 싱글톤 관계

참고 자료

This post is licensed under CC BY 4.0 by the author.