πŸ“Œ Java enum ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžμ™€ ν•„λ“œκ°’ 바인딩 κ³Όμ •

μ΄μŠΉμ›Β·2025λ…„ 3μ›” 10일

πŸ“Œ Java enum ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžμ™€ ν•„λ“œκ°’ 바인딩 κ³Όμ •


  • Java의 enum은 λ‚΄λΆ€μ μœΌλ‘œ 클래슀처럼 λ™μž‘ν•˜λ©°, μƒμ„±μžμ™€ ν•„λ“œλ₯Ό κ°€μ§ˆ 수 있음

  • ν•˜μ§€λ§Œ enum의 μΈμŠ€ν„΄μŠ€ 생성 방식은 일반 ν΄λž˜μŠ€μ™€ 닀름 β†’ κ°œλ°œμžκ°€ 직접 newλ₯Ό μ‚¬μš©ν•΄ 생성할 수 μ—†κ³ , JVM이 미리 μƒμ„±ν•΄μ„œ 관리함.


1️⃣ enum ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžμ™€ ν•„λ“œκ°’ 바인딩 κ³Όμ •


public enum Day {
    MONDAY("μ›”μš”μΌ"), TUESDAY("ν™”μš”μΌ"), WEDNESDAY("μˆ˜μš”μΌ");

    private final String koreanName;  // ν•„λ“œ μ„ μ–Έ

    // μƒμ„±μž (private μƒλž΅ κ°€λŠ₯)
    Day(String koreanName) {
        this.koreanName = koreanName;
    }

    public String getKoreanName() {
        return koreanName;
    }
}

public class EnumTest {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println(today.getKoreanName()); // "μ›”μš”μΌ"
    }
}

2️⃣ enum의 μΈμŠ€ν„΄μŠ€ 생성 κ³Όμ •

JVM λ‚΄λΆ€μ—μ„œ enum 생성 흐름


  1. Day μ—΄κ±°ν˜•μ΄ 클래슀둜 λ³€ν™˜λ¨.

  2. 컴파일 μ‹œ, MONDAY, TUESDAY, WEDNESDAYλŠ” 정적 μƒμˆ˜ 객체(static final)둜 선언됨.

  1. JVM이 클래슀 λ‘œλ“œ μ‹œ λͺ¨λ“  enum μΈμŠ€ν„΄μŠ€λ₯Ό 미리 μƒμ„±ν•˜κ³ , 각각의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•„λ“œκ°’μ„ 바인딩함.

  2. μ‹€ν–‰ μ‹œ, Day.MONDAYλ₯Ό ν˜ΈμΆœν•˜λ©΄ 이미 μƒμ„±λœ MONDAY μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜.


    3️⃣ 컴파일 ν›„ λ³€ν™˜λ˜λŠ” μ½”λ“œ (μ‹€μ œ λ‚΄λΆ€ λ™μž‘)


  • μœ„ enum을 μ»΄νŒŒμΌν•˜λ©΄ λ‹€μŒκ³Ό 같은 final class둜 λ³€ν™˜λ¨ (JVM λ‚΄λΆ€ μ½”λ“œ ꡬ쑰)


    public final class Day extends Enum<Day> {
       public static final Day MONDAY = new Day("MONDAY", 0, "μ›”μš”μΌ");
       public static final Day TUESDAY = new Day("TUESDAY", 1, "ν™”μš”μΌ");
       public static final Day WEDNESDAY = new Day("WEDNESDAY", 2, "μˆ˜μš”μΌ");
    
       private final String koreanName;
    
       private Day(String name, int ordinal, String koreanName) {
           super(name, ordinal); // Enum λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜
           this.koreanName = koreanName;
       }
    
       public String getKoreanName() {
           return koreanName;
       }
    }

    μ„€λͺ…


  1. enum은 JVMμ—μ„œ final class 둜 λ³€ν™˜λ¨

  2. MONDAY< TUESDAY, WEDNESDAYλŠ” static final 객체둜 미리 생성됨.

  3. 각 객체의 μƒμ„±μž ν˜ΈμΆœμ‹œ this.koreanName ν•„λ“œκ°€ 바인딩됨.

  4. super(name, ordinal) -> Enum λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜 (nameκ³Ό ordinal μžλ™κ΄€λ¦¬)

  5. κ°œλ°œμžκ°€ new Day(...)둜 직접 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŒ.


0개의 λŒ“κΈ€