ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Enumμ΄λž€?
    Android/Java 2021. 2. 14. 18:43
    λ°˜μ‘ν˜•
    • 이 글은 "μžλ°” 온라인 μŠ€ν„°λ””" λ‚΄μš©μ„ κ³΅λΆ€ν•˜μ—¬ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€.

    μƒμˆ˜μ˜ ν‘œν˜„

    • 기쑴에 μƒμˆ˜λ₯Ό ν‘œν˜„ν•  λ•ŒλŠ” ν•΄λ‹Ή 클래슀 내뢀에 final static String, final static int와 같이 μ •μ˜λ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    • 이처럼 μ •μ˜ν•˜λŠ” 방식은 μƒμˆ˜κ°€ λ§Žμ•„μ§ˆ 경우 가독성이 떨어지고, μ–΄λ–€ 것에 κ΄€ν•œ μƒμˆ˜μΈμ§€ νŒŒμ•…ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

    • κ·Έλž˜μ„œ μƒˆλ‘œμš΄ μƒμˆ˜ 클래슀 λ˜λŠ” μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ μ •μ˜λ₯Ό ν•˜μ§€λ§Œ 이 μ—­μ‹œλ„ μ—¬λŸ¬κ°€μ§€ λΆˆνŽΈν•¨μ΄ μ‘΄μž¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    interface UNIVERSITY{
        int SEOUL = 1;
        int YONSEI = 2;
        int KOREA = 3;
    }
    
    interface MAJOR{
        int KOREAN = 1;
        int MATH = 2;
        int ENGLISH = 3;
        int SCIENCE = 4;
    }
    
    
    public class EnumExample {
        public static void main(String[] args) {
    
            if(UNIVERSITY.SEOUL == MAJOR.KOREAN){
                System.out.println("두 μƒμˆ˜λŠ” κ°™μŠ΅λ‹ˆλ‹€");
            }
    
            int major = MAJOR.MATH;
    
            switch (major){
                case MAJOR.KOREAN:
                    System.out.println("κ΅­μ–΄ 전곡");
                    break;
                case MAJOR.MATH:
                    System.out.println("μˆ˜ν•™ 전곡");
                    break;
                case MAJOR.ENGLISH:
                    System.out.println("μ˜μ–΄ 전곡");
                    break;
                case MAJOR.SCIENCE:
                    System.out.println("κ³Όν•™ 전곡");
                    break;
            }
        }
    }

    λ‹€μŒ μ½”λ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μƒμˆ˜λ₯Ό ν‘œν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν•œ 클래슀 λ‚΄λΆ€μ—μ„œ final static int 와 같이 ν‘œν˜„ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” 집합끼리 μƒμˆ˜λ₯Ό λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ κ΅¬λ³„ν•˜κΈ°κ°€ μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μœ„ 방법에도 λ¬Έμ œκ°€ μ‘΄μž¬ν•˜λŠ”λ° UNIVERSITY의 μƒμˆ˜μ™€ MAJOR μƒμˆ˜μ˜ 비ꡐ뢀뢄에 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ§‘ν•©μ˜ μƒμˆ˜λΌλ¦¬λŠ” 비ꡐλ₯Ό ν•˜λ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— 컴파일 λ‹¨κ³„μ—μ„œ μ—λŸ¬λ₯Ό 확인할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. ν˜„μž¬ μ½”λ“œλŠ” 두 μƒμˆ˜ intν˜• νƒ€μž…μ΄κ³  1μ΄λΌλŠ” 값도 λ™μΌν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κ²Œ 되면 λŸ°νƒ€μž„ λ‹¨κ³„μ—μ„œ 예기치 λͺ»ν•œ 문제λ₯Ό 마주치게 λ©λ‹ˆλ‹€.

    class UNIVERSITY{
        public static final UNIVERSITY SEOUL = new UNIVERSITY();
        public static final UNIVERSITY YONSEI = new UNIVERSITY();
        public static final UNIVERSITY KOREA = new UNIVERSITY();
    }
    
    class MAJOR{
        public static final MAJOR KOREAN = new MAJOR();
        public static final MAJOR MATH = new MAJOR();
        public static final MAJOR ENGLISH = new MAJOR();
        public static final MAJOR SCIENCE = new MAJOR();
    }
    
    
    public class EnumExample {
        public static void main(String[] args) {
    
            if(UNIVERSITY.SEOUL == MAJOR.KOREAN){
                System.out.println("두 μƒμˆ˜λŠ” κ°™μŠ΅λ‹ˆλ‹€");
            }
    
            MAJOR major = MAJOR.MATH;
    
            switch (major){
                case MAJOR.KOREAN:
                    System.out.println("κ΅­μ–΄ 전곡");
                    break;
                case MAJOR.MATH:
                    System.out.println("μˆ˜ν•™ 전곡");
                    break;
                case MAJOR.ENGLISH:
                    System.out.println("μ˜μ–΄ 전곡");
                    break;
                case MAJOR.SCIENCE:
                    System.out.println("κ³Όν•™ 전곡");
                    break;
            }
        }
    }

    λ‹€μŒ μ½”λ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘μ„±ν•œ 뢀뢄을 클래슀둜 λ³€κ²½ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 각 μƒμˆ˜μ—λŠ” μžμ‹  μžμ‹ μ„ μΈμŠ€ν„΄μŠ€ν™”ν•˜μ—¬ 값을 ν• λ‹Ήν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이둜 인해 μƒμˆ˜μ§‘ν•©μ—μ„œ 각 μƒμˆ˜λ“€μ˜ νƒ€μž…μ€ λ™μΌν•˜λ˜ λ°μ΄ν„°λŠ” λ‹€λ₯΄κ²Œ λ©λ‹ˆλ‹€. μƒμˆ˜λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ μ •μ˜ν•œ 결과와 달리 UNIVERSITY의 μƒμˆ˜μ™€ MAJOR μƒμˆ˜λ₯Ό 비ꡐ할 경우 μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž…λΌλ¦¬ 비ꡐ할 수 μ—†λ‹€λŠ” λ©”μ‹œμ§€μ™€ ν•¨κ»˜ μ»΄νŒŒμΌλ‹¨κ³„μ— μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€. λŸ°νƒ€μž„μ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό 컴파일 λ‹¨κ³„μ—μ„œ 미리 μ•Œ 수 있기 λ•Œλ¬Έμ— 사전에 차단할 수 μžˆλ‹€λŠ” μž₯점이 μƒκ²ΌμŠ΅λ‹ˆλ‹€.

    이 방법에도 λ¬Έμ œκ°€ μ‘΄μž¬ν•˜λŠ”λ° switchλ¬Έμ—μ„œ ν˜Έν™˜λ  수 μ—†λŠ” νƒ€μž…μ΄λΌλŠ” λ©”μ‹œμ§€μ™€ ν•¨κ»˜ 컴파일 μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€. μƒμˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ switch문을 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ©΄ 가독성이 크게 μ €ν•˜λ˜λŠ”λ° 이λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μƒμˆ˜ ν‘œν˜„λ°©λ²•μ΄ Enum ν΄λž˜μŠ€μž…λ‹ˆλ‹€.


    Enumμ΄λž€?

    • Enum은 Eumeration둜 μ—΄κ±°ν˜•μ΄λΌκ³  뢈리며, μ„œλ‘œ μ—°κ΄€λœ μƒμˆ˜λ“€μ˜ 집합을 μ˜λ―Έν•©λ‹ˆλ‹€.

    • μžλ°”μ—μ„œ final static String, int와 같이 λ¬Έμžμ—΄μ΄λ‚˜ μˆ«μžλ“€μ„ λ‚˜νƒ€λ‚΄λŠ” κΈ°λ³Έμžλ£Œν˜•μ˜ 값을 Enum으둜 λŒ€μ²΄ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μœ„ μ˜ˆμ‹œμ— λ‚˜μ˜¨κ²ƒμ²˜λŸΌ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 클래슀둜 μƒμˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 것을 λ³΄μ™„ν•˜μ—¬ IDE의 지원을 적극적으둜 λ°›κ³  νƒ€μž… μ•ˆμ •μ„±λ„ κ°–μΆœ 수 있게 λ©λ‹ˆλ‹€.


    Enum의 νŠΉμ§•

    1. 클래슀λ₯Ό μƒμˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.

    enum Student{
    
        KIM("SEOUL","KOREAN"),
        PARK("KOREA","MATH"),
        LEE("YEOSEI","SCIENCE");
    
        private final String university;
        private final String major;
        private int number;
    
        // public μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ
        Student(String university, String major) {
            this.university = university;
            this.major = major;
        }
    }

    Enum 클래슀λ₯Ό κ΅¬ν˜„ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€. μƒμ„±μžλŠ” Public으둜 ν•  경우 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ private둜 생성해야 ν•©λ‹ˆλ‹€. Enum은 κ³ μ •λœ μƒμˆ˜λ“€μ˜ μ§‘ν•©μœΌλ‘œ, λŸ°νƒ€μž„μ΄ μ•„λ‹Œ μ»΄νŒŒμΌνƒ€μž„μ— λͺ¨λ“  값에 λŒ€ν•΄ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. 즉, λ‹€λ₯Έ νŒ¨ν‚€μ§€λ‚˜ ν΄λž˜μŠ€μ—μ„œ Enum νƒ€μž…μ— μ ‘κ·Όν•΄μ„œ λ™μ μœΌλ‘œ μ–΄λ–€ 값을 정해쀄 수 μ—†μŠ΅λ‹ˆλ‹€.


    2. Enum 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ” 경우 μƒμˆ˜ κ°’κ³Ό 같이 μœ μΌν•˜κ²Œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ–΄ μ‚¬μš©λœλ‹€.

    enum Student{
    
        KIM("SEOUL","KOREAN"),
        PARK("KOREA","MATH"),
        LEE("YEOSEI","SCIENCE");
    
        private final String university;
        private final String major;
        private int number;
    
        Student(String university, String major) {
            this.university = university;
            this.major = major;
        }
    
        public void plusnumber(){
            this.number++;
        }
    }

    Enum ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έν•œ μƒμˆ˜λ“€μ€ ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ μƒμ„±λ˜μ–΄ Sigleton ν˜•νƒœλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. μƒμˆ˜ κ°’μœΌλ‘œ μ •μ˜λ˜μ§€ μ•Šμ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μžˆλ‹€λ©΄ λ©€ν‹° μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„ μ˜ˆμ‹œμ²˜λŸΌ number λ³€μˆ˜λŠ” KIM μ΄λΌλŠ” μΈμŠ€ν„΄μŠ€μ—μ„œ plusnumber λ©”μ†Œλ“œλ₯Ό 톡해 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬λŸ¬ μ“°λ ˆλ“œμ—μ„œ Student.KIM μƒμˆ˜λ₯Ό μ‚¬μš©ν•  경우 number λ³€μˆ˜λŠ” 곡유되기 λ•Œλ¬Έμ— 쑰심해야 ν•©λ‹ˆλ‹€.


    3. μΈμŠ€ν„΄μŠ€ 생성과 상속을 λ°©μ§€ν•˜μ—¬ μƒμˆ˜κ°’μ˜ νƒ€μž…μ•ˆμ •μ„±μ΄ 보μž₯λ©λ‹ˆλ‹€.

    public class EnumExample {
        public static void main(String[] args) {
    
               // java.lang.enum의 toString λ©”μ†Œλ“œ 상속
            System.out.println(Student.KIM.toString());
        }
    }

    νŠΉμ§•1μ—μ„œ μ„€λͺ…ν–ˆλ“―이 Enum 클래슀의 μƒμ„±μžλ₯Ό private둜 μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ νŒ¨ν‚€μ§€λ‚˜ ν΄λž˜μŠ€μ—μ„œ λ™μ μœΌλ‘œ 값을 ν• λ‹Ήν•  수 μ—†κΈ° λ•Œλ¬Έμ— νƒ€μž… μ•ˆμ •μ„±μ΄ 보μž₯λ©λ‹ˆλ‹€. λ˜ν•œ λͺ¨λ“  Enum ν΄λž˜μŠ€λŠ” λ‚΄λΆ€μ μœΌλ‘œ java.lang.enum ν΄λž˜μŠ€μ— μ˜ν•΄ μƒμ†λ©λ‹ˆλ‹€. μžλ°”λŠ” 닀쀑상속을 μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Enum은 λ‹€λ₯Έ 클래슀λ₯Ό 상속받을 수 μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ‹€μ–‘ν•œ μΈν„°νŽ˜μ΄μŠ€λ“€μ€ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


    java.lang.Enum 클래슀

    • Enum ν΄λž˜μŠ€λŠ” λͺ¨λ“  μžλ°” μ—΄κ±°ν˜•μ˜ κΈ°λ³Έ 쑰상 ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

    • Enum ν΄λž˜μŠ€μ—λŠ” μ—΄κ±°ν˜•μ„ 닀루기 μœ„ν•œ λ‹€μ–‘ν•œ λ©”μ†Œλ“œλ“€μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

    • κ³΅μ‹λ¬Έμ„œ

    Enum λŒ€ν‘œ λ©”μ†Œλ“œ

    1. values() : Enum ν΄λž˜μŠ€μ—μ„œ 가지고 μžˆλŠ” λͺ¨λ“  μƒμˆ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 배열에 λ‹΄μ•„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

    public class EnumExample {
        public static void main(String[] args) {
            Student[] values = Student.values();
            for(int i=0;i<values.length;i++){
                System.out.println(values[i]);        // java.lang.enum toString λ©”μ†Œλ“œ 호좜
                System.out.println(values[i].getNumber());
            }
    
            // Kim, 0, PARK, 0, LEE, 0
        }
    }

    2. valueOf() : String을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ μΌμΉ˜ν•˜λŠ” μƒμˆ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. (없을 경우 λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒ)

    public class EnumExample {
        public static void main(String[] args) {
            System.out.println(Student.valueOf("LEE"));
            System.out.println(Student.valueOf("LEE").getNumber());
    
            // RuntimeException
            try{
                System.out.println(Student.valueOf("OH"));
            }catch (IllegalArgumentException e){
                System.out.println("λŸ°νƒ€μž… μ—λŸ¬");
            }
    
            // LEE, 0, λŸ°νƒ€μž„ μ—λŸ¬
        }
    }

    3. ordinal() : Enum 클래슀 내뢀에 μžˆλŠ” μƒμˆ˜λ“€μ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    public class EnumExample {
        public static void main(String[] args) {
            Student[] values = Student.values();
            for(int i=0;i<values.length;i++){
                System.out.println(values[i]+"의 index : "+values[i].ordinal());
            }
    
            /**
             * KIM의 index : 0
             * PARK의 index : 1
             * LEE의 index : 2
             */
        }
    }

    EnumSet



    • EnumSet은 enum 클래슀의 μƒμˆ˜λ‘œ κ΅¬ν˜„λœ νŠΉλ³„ν•œ Set μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

    • AbstractSet와 AbstractCollection은 λŒ€λΆ€λΆ„ Setκ³Ό Collection μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•˜μ§€λ§Œ, EnumSet은 λŒ€λΆ€λΆ„ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

    • EnumSet은 였직 enum μƒμˆ˜λ§Œ 포함될 수 있으며, 같은 enum에 속해야 ν•©λ‹ˆλ‹€.

    • null 값이 포함될 수 μ—†κ³ , thread-safe ν•˜μ§€ μ•Šμ•„μ„œ ν•„μš”μ‹œ 동기화λ₯Ό ν•΄μ•Όν•©λ‹ˆλ‹€.

    • enum 클래슀 내뢀에 μ„ μ–Έλœ μˆœμ„œλŒ€λ‘œ EnumSet에 ν¬ν•¨λ©λ‹ˆλ‹€.

    • fail-safe iteratorλ₯Ό μ‚¬μš©ν•˜μ—¬ ConcurrnetModificationException이 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • EnumSet의 λͺ¨λ“  λ©”μ†Œλ“œλŠ” μ‚°μˆ  λΉ„νŠΈ 연산을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„λ˜κΈ° λ•Œλ¬Έμ— 맀우 λΉ λ₯΄κ²Œ μ‹€ν–‰λœλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.


    EnumSet μ˜ˆμ‹œ

    public class EnumExample {
        public static void main(String[] args) {
    
            EnumSet<Student> Allset = EnumSet.allOf(Student.class);
            Iterator<Student> iterator = Allset.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
            // KIM, PART, LEE
    
            EnumSet<Student> Someset = EnumSet.of(Student.LEE,Student.PARK);
            iterator = Someset.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
            // PART, LEE
    
            EnumSet<Student> Noneset = EnumSet.noneOf(Student.class);
            if(Noneset.contains(Student.PARK)){
                System.out.println("EnumSet 내뢀에 PARK이 μžˆμŠ΅λ‹ˆλ‹€");
            }else{
                System.out.println("EnumSet 내뢀에 PARK이 μ—†μŠ΅λ‹ˆλ‹€");
            }
            Noneset.add(Student.PARK);
            iterator = Noneset.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
            // EnumSet 내뢀에 PARK이 μ—†μŠ΅λ‹ˆλ‹€. PART
        }
    }
    λ°˜μ‘ν˜•
Designed by Tistory.