Enum이란?
프로그래밍을 할 때 상수를 정의해야 하는 경우 보통 final static int/String 과 같은 방식으로 정의한다.
그리고 Enum은 위와 같이 상수로 정의한 데이터들중 연광성이 있는 데이터들을 한데 모아 관리할 수 있도록 하는 역할을 하는 Java API 이다.
Enum은 열거형이라고 불리며, 기존에 상수로 정의하던 기본 자료형의 데이터를 효과적으로 다룰 수 있게 해준다.
Enum의 장점
Enum을 사용함으로써 얻을 수 있는 이점은 아래와 같다.
1. Type Safety
Enum은 컴파일 시점에 타입 안정성을 보장한다. 지정해놓은 특정 값만 사용 가능하므로 컴파일 에러나 런타임 에러를 줄여준다.
public enum Role {
ADMIN("관리자"),
USER("사용자");
private final String roleName;
Role(String roleName) {
this.roleName = roleName;
}
}
public class Service {
public static void main(String[] args) {
Role role = Role.MANAGER; // 컴파일 에러
}
}
위 코드처럼 Role Enum 클래스의 값을 가져올 때 지정된 값이 아니면 컴파일 시점에서 에러를 확인할 수 있다.
2. Readability
Enum은 가독성이 높다. Enum 클래스 내의 값들이 명시적으로 정의되어 있기 때문에 코드를 읽을 때 쉽게 이해할 수 있다.
public enum LottoRankInfo {
FIRST(6, 2_000_000_000),
SECOND(5, 30_000_000),
THIRD(5, 1_500_000),
FOURTH(4, 50_000),
FIFTH(3, 5_000),
NO_WIN(0, 0);
private final int matchingCount;
private final int prizeMoney;
LottoRankInfo(int matchingCount, int prizeMoney) {
this.matchingCount = matchingCount;
this.prizeMoney = prizeMoney;
}
}
위 코드처럼 명시된 값에 따른 상수 데이터들을 넣어 가독성을 높여줄 수 있다.
3. Maintainability
Enum은 관리가 용이하다. 값이 추가되거나 변경되는 경우, 한 곳에서만 변경하면 되기 때문에 코드의 유지 보수성이 높아진다.
4. Performance
Enum은 컴파일 시점에 정적인 값으로 변환되기 때문에 실행 시간에서 상수의 오버헤드를 줄여준다.
5. Singleton Guarantee
인스턴스가 JVM 내에 하나만 존재한다는 것이 100% 보장되므로, Java에서 Singleton을 만드는 가장 좋은 방법으로 권장된다. 그리고 JVM내 하나의 인스턴스로 Singleton이 보장되기 때문에 값 비교는 equlas()가 아닌 ==로 하면 된다.
Enum이 Sigleton이 보장되는 이유는 크게 3가지가 있다.
1. clone 미지원
Enum의 clone()이라는 메서드를 보면 위와 같다.
clone() 메서드를 사용하려고 하면 'CloneNotSupportedException'이라는 예외가 발생하게 된다.
보통 clone() 메서드를 사용할 때, 값만 같고 서로 다른 객체가 반환되기를 기대하고 사용한다.
하지만 Enum은 각 인스턴스의 값이 하나씩만 존재해야 하므로 clone()을 지원하지 않는다.
2. 역직렬화로 인한 중복 인스턴스 생성 방지
Enum은 기본적으로 직렬화(serializable)가 가능하므로 Serializable 인터페이스를 구현할 필요가 없다.
즉, 역직렬화 시 새로운 객체가 생성될 걱정을 하지 않아도 된다.
3. Reflection을 이용한 enum의 인스턴스화를 금지
Enum의 생성자는 유일한 생성자이다.
컴파일러에서 사용하고 사용자가 직접 호출할 수는 없다.
따라서 Enum -> getConstructor -> newInstance로 사용하는 객체 생성 흐름이 적용되지 않는다.
Enum 사용법
enum Role {
ADMIN, USER, MANAGER;
}
Enum은 기본적으로 위와 같이 정의하고 Role.ADMIN 과 같이 사용한다.
그리고 앞에서 본 것처럼 각 상수에 특정값을 저장해서 사용할 수 있다.
public enum LottoRankInfo {
FIRST(6, 2_000_000_000),
SECOND(5, 30_000_000),
THIRD(5, 1_500_000),
FOURTH(4, 50_000),
FIFTH(3, 5_000),
NO_WIN(0, 0);
private final int matchingCount;
private final int prizeMoney;
LottoRankInfo(int matchingCount, int prizeMoney) {
this.matchingCount = matchingCount;
this.prizeMoney = prizeMoney;
}
}
Enum 주요 메서드
메서드 | 설명 |
static E values() | 해당 Enum 클래스의 모든 상수를 저장한 배열을 생성하여 반환 |
static E valueOf(String name) | 전달된 문자열과 일치하는 해당 열거체의 상수를 반환 |
protected void finalize() | 해당 Enum 클래스가 final 메서드를 가질 수 없도록 함 |
String name() | 해당 Enum 클래스의 상수 이름 반환 |
int ordinal() | 해당 Enum 클래스의 상수가 정의된 순서를 반환 |
boolean equals(Object other) | 객체가 Enum 클래스 내의 상수와 동일하면 true 반환 |
Refernce
https://limkydev.tistory.com/50
[Java] enum 이란?
Enum class란? 우리가 흔히 상수를 정의할 때 final static string 과 같은 방식으로 상수를 정의를합니다. 하지만 이렇게 상수를 정의해서 코딩하는 경우 다양한 문제가 발생됩니다. 따라서 이러한 문제
limkydev.tistory.com
https://velog.io/@mooh2jj/Java-Enum%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
[Java] Enum을 사용하는 이유와 사용법
Java enum은 제한된 값 목록을 갖는 타입입니다. enum은 다음과 같은 이점을 갖습니다.enum은 컴파일 타임에 타입 안정성을 보장합니다. 특정 범위의 값만 사용 가능하므로 컴파일 오류나 런타임 예
velog.io
https://yeonyeon.tistory.com/171
[Java] Enum에 대해
목차 1. Enum이란? 2. 사용 방법 3. 주요 메소드 4. Singleton과 Enum 1. Enum이란? 🤔 enumerance type = 열거형 JDK 1.5부터 생겨난 기능으로 열거체를 정의할 수 있는 클래스 비교 시 실제 값 뿐만 아니라 타입
yeonyeon.tistory.com
https://techblog.woowahan.com/2527/
Java Enum 활용기 | 우아한형제들 기술블로그
{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E
techblog.woowahan.com
댓글