Enum은 왜 쓰는 걸까?

박화랑·2025년 3월 13일
0

Spring_6기

목록 보기
12/15

1. Enum이란?

Enum열거형이라고도 하는데, 상수(constant)들의 집합을 의미한다.
예를 들어, 요일을 표현할 때 월, 화, 수, 목, 금, 토, 일처럼 정해진 값들만 존재한다면 Enum이 적합함.

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

Day Enum은 요일을 나타내는 고정된 값들의 집합
이제 Day 타입을 이용하면, 다른 문자열("Mon", "Monday") 같은 잘못된 입력을 방지할 수 있다.

✅ Enum의 주요 특징

  • Enum은 상수들의 집합이다.
    즉, final static한 값들로 이루어져 있음.
  • Enum은 내부적으로 final class처럼 동작한다.
    다른 클래스가 상속할 수 없음(불변성 보장).
  • Enum도 객체처럼 필드와 메서드를 가질 수 있다.
    그냥 상수가 아니라, 내부적으로 필드와 메서드를 추가할 수 있음.
  • Enum은 특정 상태를 표현하는 데 유용하다.
    예를 들어, 신청 상태 (WAITING, APPROVED, REJECTED) 같은 것들을 Enum으로 표현하면 가독성이 좋아짐.

2. Enum도 객체다 (즉, 인스턴스다!)

"Enum은 단순한 상수가 아니라, 내부적으로 클래스로 변환된다!"

Enum을 단순한 "고정된 값"이라고만 생각하기 쉽지만 사실 Enum은 객체(Instance)임을 명심해야 한다.
실제로 Enum은 내부적으로 클래스처럼 동작하며, 자동으로 객체가 생성된다..

🔍 왜 Enum이 내부적으로 클래스일까?

  1. Enum의 각 값은 하나의 인스턴스(instance)다.
    MONDAY, TUESDAY, WEDNESDAY 각각이 하나의 객체.
  2. Enum 값마다 필드, 생성자, 메서드를 가질 수 있다.
    → 단순한 상수가 아니라, 각 값마다 고유한 속성을 가질 수 있음.
  3. Enum은 new 키워드로 생성할 수 없다.
    → 대신, JVM이 자동으로 객체를 생성해서 관리해줌.

3. Enum 내부 구조 분석

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);
    }
}
  • Enum은 내부적으로 final class처럼 동작함 (상속 불가능).
  • Enum<Day>를 상속받아 기본 기능을 제공함.
  • SUNDAY, MONDAY 등은 자동으로 생성된 객체(instance)!
  • private 생성자를 사용해서 new로 새롭게 만들지 못하게 막음.

즉, Enum은 단순한 데이터가 아니라 JVM이 관리하는 싱글턴 객체들의 모음이다


4. Enum의 필드와 생성자

Enum을 단순한 값만 저장하는 게 아니라, 추가적인 정보를 저장하는 필드와 생성자를 가질 수 있어.

enum Status {
    WAITING(0), PROCESSING(1), COMPLETED(2);

    private final int code;

    // 생성자
    Status(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

설명

  1. WAITING(0), PROCESSING(1), COMPLETED(2) → Enum 값마다 고유한 숫자를 저장함.
  2. private final int code; → 각 Enum 값이 가질 수 있는 필드를 정의.
  3. Status(int code) { this.code = code; } → 생성자를 이용해 필드 초기화.
  4. getCode() 메서드를 추가해서, 각 상태에 대한 숫자를 조회할 수 있도록 함.
Status currentStatus = Status.PROCESSING;
System.out.println(currentStatus.getCode());  // 출력: 1

Enum 값마다 필드를 가질 수 있어서, 추가 정보를 저장하고 활용할 수 있음!


5. 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: 불금
  • Enum은 메서드도 가질 수 있다!
  • name()을 사용하면 FRIDAY 같은 Enum 이름을 가져올 수 있음.
  • printInfo() 같은 커스텀 메서드를 만들어 활용할 수도 있음.

6. Enum의 동등성과 동일성 비교

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 값들은 항상 같은 인스턴스를 공유하기 때문에 == 비교가 안전하다.

profile
개발자 희망생

0개의 댓글

관련 채용 정보