πŸ› οΈBackend/β˜•Java

[Java] Enum μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°

junbin2 2025. 5. 5. 15:39

βœ… 1. Enum μ΄λž€?

  • μ„œλ‘œ κ΄€λ ¨ μžˆλŠ” μƒμˆ˜λ“€μ„ ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ λ¬Άμ–΄μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” νŠΉλ³„ν•œ ν΄λž˜μŠ€μ΄λ‹€.
  • μ‰½κ²Œλ§ν•΄, ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— μ—¬λŸ¬ μƒμˆ˜λ“€μ„ μ •μ˜ν•˜κ³  ν•΄λ‹Ή 클래슀λ₯Ό 톡해 μƒμˆ˜λ₯Ό μ΄μš©ν•˜κ²Œ λ˜λŠ” 방식이닀.
  • Enum은 Java 5 (JDK 1.5)에 처음 λ„μž…λœ κΈ°λŠ₯이닀.

βœ… 2. μƒμˆ˜λž€?

  • μƒμˆ˜(Constant)λž€ ν•œλ²ˆ μ •ν•΄μ§€λ©΄ λ³€κ²½ν•  수 μ—†λŠ” 값을 μ˜λ―Έν•œλ‹€.
  • μžλ°”μ—μ„œ μƒμˆ˜λŠ” 데이터 ν•„λ“œλΆ€μ— μ •μ˜λ₯Ό ν•˜λ©°, 보톡 staticν‚€μ›Œλ“œμ™€ finalν‚€μ›Œλ“œλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•œ 데이터λ₯Ό μƒμˆ˜λ‘œ λ³Έλ‹€.
public class Constants {
    public static final int MAX_USERS = 100;
}

βœ… 3. Enum μ‚¬μš©λ²•

  • λŒ€ν‘œμ μΈ μ‚¬μš©λ²•μ€ class ν‚€μ›Œλ“œ 뢀뢄에 enum ν‚€μ›Œλ“œλ₯Ό λΆ™νžˆλ©΄ enum ν΄λž˜μŠ€κ°€ λ§Œλ“€μ–΄μ§„λ‹€.
  • enum에 μƒμˆ˜λͺ…을 적으면, μƒμˆ˜κ°’μ΄ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄ μ§„λ‹€. μƒμˆ˜λ₯Ό 쉽고 νŽΈν•˜κ²Œ 늘리고 쀄일 수 있음.

 

public enum Direction {
    NORTH, 
    SOUTH, 
    EAST, 
    WEST;
}

 


βœ… 4. java.lang.Enum 좔상 클래슀

  • μžλ°”μ—λŠ” "Enum" μ΄λΌλŠ” 클래슀λͺ…을 κ°€μ§„ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€.
  • ν•΄λ‹Ή Enum ν΄λž˜μŠ€λŠ” enum ν‚€μ›Œλ“œλ‘œ λ§Œλ“€μ–΄μ§„ ν΄λž˜μŠ€λ“€μ΄ μžλ™μœΌλ‘œ 상속을 λ°›κ²Œ 되며, μ˜€λ²„λΌμ΄λ”©μ„ 톡해 이용이 λœλ‹€.
public abstract class Enum<E extends Enum<E>>
        implements Constable, Comparable<E>, Serializable {

    private final String name;

    public final String name() {
        return name;
    }

    private final int ordinal;

    public final int ordinal() {
        return ordinal;
    }

    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

    public String toString() {
        return name;
    }

βœ… 5. Enum λ‚΄λΆ€ λ™μž‘ 원리

  • enum은 λ‚΄λΆ€μ μœΌλ‘œ μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 μ‹œμ μ— ν˜•νƒœλ₯Ό λ°”κΏ”μ€€λ‹€.

(1) 컴파일 μ „

public enum Direction {
    NORTH, 
    SOUTH, 
    EAST, 
    WEST;
}

 

(2) 컴파일 ν›„

public final class Direction extends Enum<Direction> {

    public static final Direction NORTH = new Direction("NORTH", 0);
    public static final Direction SOUTH = new Direction("SOUTH", 1);
    public static final Direction EAST  = new Direction("EAST", 2);
    public static final Direction WEST  = new Direction("WEST", 3);

    private static final Direction[] VALUES = { NORTH, SOUTH, EAST, WEST };

    private Direction(String name, int ordinal) {
        super(name, ordinal); // Enum 클래슀의 μƒμ„±μž 호좜
    }

    @Override
    public static Direction[] values() {
        return VALUES.clone();
    }

    @Override
    public static Direction valueOf(String name) {
        for (Direction d : VALUES) {
            if (d.name().equals(name)) return d;
        }
        throw new IllegalArgumentException("No enum constant " + name);
    }
}
  • enum ν‚€μ›Œλ“œκ°€ class ν‚€μ›Œλ“œλ‘œ λ³€κ²½λ˜λ©΄μ„œ, ν΄λž˜μŠ€κ°€ λœλ‹€.
  • Enum 클래슀λ₯Ό μƒμ†λ°›λŠ” ꡬ쑰가 λœλ‹€.
  • 핡심은 enum을 λ§Œλ“€ λ•Œ μ‚¬μš©ν•œ μƒμˆ˜λͺ…이 μžλ™μœΌλ‘œ μƒμˆ˜ ν•„λ“œκ°’μ— 객체λ₯Ό 생성해 λ„£μ–΄μ£Όκ²Œ λœλ‹€.

βœ… 6. 정리

  • μžλ°”μ—μ„œ enum ν‚€μ›Œλ“œλ‘œ λ§Œλ“  ν΄λž˜μŠ€λŠ” 컴파일 μ‹œμ μ— class ν‚€μ›Œλ“œλ‘œ λ³€κ²½λ˜λ©°, ν΄λž˜μŠ€κ°€ λœλ‹€.
  • enum μƒμˆ˜λͺ…은 μžλ™μœΌλ‘œ μƒμˆ˜ ν•„λ“œκ°’μ— 객체λ₯Ό μƒμ„±ν•΄μ„œ λ„£μ–΄μ€€λ‹€.
  • Enum ν΄λž˜μŠ€λŠ” java.lang νŒ¨ν‚€μ§€μ— μΆ”μƒν΄λž˜μŠ€λ‘œ μ‘΄μž¬ν•˜λ©°, ν•΄λ‹Ή Enum을 μžλ™ 상속을 λ°›κ²Œ 됨.