📌개요
Java의 enum
(열거형)은 타입 안전성(Type-Safety)과 코드 가독성을 제공하는 고정된 상수 집합 관리 도구다.
기존의 public static final
상수보다 발전된 형태로, 제한된 선택지를 표현할 때 주로 사용된다.
Info
핵심 특징
- Java 5부터 공식 지원 (J2SE 5.0)
- 클래스의 확장 기능 제공 (필드, 메서드 추가 가능)
Comparable
,Serializable
자동 구현
📌내용
enum은 왜 만들어졌는가?
기존 방식의 한계
|
|
문제점:
- 타입 안정성 부족:
int status = 100;
처럼 유효하지 않은 값 할당 가능 - 가독성 낮음:
if (status == 1)
vsif(status == Status.ORDERED)
- 확장성 부족: 상수에 메서드나 속성을 추가할 수 없음
enum의 해결 방안
|
|
- 컴파일 타입 검증
Status status = Status.ORDERED
만 허용 (잘못된 값 컴파일 오류) - 명시적 표현으로 코드 가독성 향상
- 객체처럼 메서드/속성 추가 가능
내부 동작 원리
enum은 컴파일러에 의해 클래스로 변환된다.
java.lang.Enum
상속compareTo()
,name()
,ordinal()
기본 제공- 생성자
private
외부 인스턴스화 불가 values()
,valueOf()
자동생성
|
|
언제부터 본격적으로 사용됐을까?
- 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()
|
|
더 알아보기
- JPA 연동:
@Enumerated(EnumType.String)
- Enum 단점: 새로운 상수 추가 시 모든
switch
검토 필요 - Enum 과 싱글톤 관계
참고 자료
- Oracle Docs - Enum Types
- Effective Java Item 34: “Use enums instead of int constants”