Enum
은 열거형이라고도 하는데, 상수(constant)들의 집합을 의미한다.
예를 들어, 요일을 표현할 때 월, 화, 수, 목, 금, 토, 일처럼 정해진 값들만 존재한다면 Enum
이 적합함.
enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
위 Day
Enum은 요일을 나타내는 고정된 값들의 집합임
이제 Day
타입을 이용하면, 다른 문자열("Mon"
, "Monday"
) 같은 잘못된 입력을 방지할 수 있다.
final static
한 값들로 이루어져 있음.final class
처럼 동작한다.WAITING, APPROVED, REJECTED
) 같은 것들을 Enum으로 표현하면 가독성이 좋아짐."Enum은 단순한 상수가 아니라, 내부적으로 클래스로 변환된다!"
Enum을 단순한 "고정된 값"이라고만 생각하기 쉽지만 사실 Enum은 객체(Instance)임을 명심해야 한다.
실제로 Enum은 내부적으로 클래스처럼 동작하며, 자동으로 객체가 생성된다..
MONDAY
, TUESDAY
, WEDNESDAY
각각이 하나의 객체.new
키워드로 생성할 수 없다.public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
이 코드를 JVM이 실제로 해석하면 아래처럼 동작해.
public final class Day extends Enum<Day> {
public static final Day SUNDAY = new Day("SUNDAY", 0);
public static final Day MONDAY = new Day("MONDAY", 1);
public static final Day TUESDAY = new Day("TUESDAY", 2);
// ... (나머지 요일들도 동일하게 생성됨)
private Day(String name, int ordinal) {
super(name, ordinal);
}
}
final class
처럼 동작함 (상속 불가능). Enum<Day>
를 상속받아 기본 기능을 제공함. SUNDAY
, MONDAY
등은 자동으로 생성된 객체(instance)! new
로 새롭게 만들지 못하게 막음. 즉, Enum은 단순한 데이터가 아니라 JVM이 관리하는 싱글턴 객체들의 모음이다
Enum을 단순한 값만 저장하는 게 아니라, 추가적인 정보를 저장하는 필드와 생성자를 가질 수 있어.
enum Status {
WAITING(0), PROCESSING(1), COMPLETED(2);
private final int code;
// 생성자
Status(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
WAITING(0), PROCESSING(1), COMPLETED(2)
→ Enum 값마다 고유한 숫자를 저장함.private final int code;
→ 각 Enum 값이 가질 수 있는 필드를 정의.Status(int code) { this.code = code; }
→ 생성자를 이용해 필드 초기화.getCode()
메서드를 추가해서, 각 상태에 대한 숫자를 조회할 수 있도록 함.Status currentStatus = Status.PROCESSING;
System.out.println(currentStatus.getCode()); // 출력: 1
✔ Enum 값마다 필드를 가질 수 있어서, 추가 정보를 저장하고 활용할 수 있음!
Enum 내부에 메서드를 추가하면, 더 강력하게 활용할 수 있어!
enum Day {
SUNDAY("휴식"), MONDAY("업무"), TUESDAY("업무"), WEDNESDAY("업무"),
THURSDAY("업무"), FRIDAY("불금"), SATURDAY("휴식");
private final String description;
Day(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void printInfo() {
System.out.println(this.name() + ": " + description);
}
}
Day today = Day.FRIDAY;
today.printInfo(); // 출력: FRIDAY: 불금
name()
을 사용하면 FRIDAY
같은 Enum 이름을 가져올 수 있음. printInfo()
같은 커스텀 메서드를 만들어 활용할 수도 있음.Enum은 ==
와 .equals()
비교에서 차이가 없다는 특징이 있음
이유는 Enum 값들은 JVM이 하나의 인스턴스만 생성해서 공유하기 때문
Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
System.out.println(day1 == day2); // true
System.out.println(day1.equals(day2)); // true
==
비교 → true (같은 객체이므로) equals()
비교 → true (값이 같으므로) 이처럼 Enum은 싱글턴 패턴처럼 하나의 인스턴스만 존재하기 때문에 ==
비교가 안전하다!
✅ Enum은 단순한 상수가 아니라, 내부적으로 final class
처럼 동작하는 객체이다.
✅ Enum 값들은 JVM이 자동으로 생성해서 관리하며, new
로 만들 수 없다.
✅ Enum은 필드, 생성자, 메서드를 가질 수 있어서 단순한 상수보다 더 강력하게 활용할 수 있다.
✅ Enum 값들은 항상 같은 인스턴스를 공유하기 때문에 ==
비교가 안전하다.