자바의 Enum은 Enumeration의 약자로 JDK 5부터 지원되는 기능이다.

     

    Enum 사용하기

    • 클래스를 생성하는 방식처럼 Enum을 생성한다.
    • Enum 안에 상수를 나타내는 값을 적는다. 상수와 상수는 콤마(,)로 구분한다.

    Enum의 특징

    • Enum은 타입에 대해 안전하다. 미리 정의된 Enum 변수 안의 상수만을 대입할 수 있다.
    Day day = Day.SUNDAY;

    위와 같은 코드는 되지만

    Day day = 5;

    위와 같은 코드는 되지 않는다.

    • Enum은 switch문에서 사용 가능하다.
    • JDK 7부터 switch문에서 String도 사용 가능하다.
    public class DaySwitchTest {
        public static void main(String[] args) {
            Day day = Day.SUNDAY;
    
            switch (day){
                case SUNDAY:
                    System.out.println("일요일입니다.");
                    break;
                case MONDAY:
                    System.out.println("월요일입니다.");
                    break;
                default:
                    System.out.println("그 밖의 요일");
            }
        }
    }
    • day가 어떤 상수냐에 따라서 알맞은 case부분이 실행된다.
    • 이 때 조심할 것은 case 다음에는 Day가 가지고 있는 상수의 이름이 나와야 한다는 것이다.
    • case 다음에 Day.SUNDAY라고 사용하면 컴파일 에러 발생한다.

    Enum 타입의 특징

    • Enum은 생성자를 가질 수 있다. 단, 생성자는 private해야 한다.
    • Enum의 생성자는 내부에서만 호출이 가능하다.
    public enum Gender {
        MALE("XY"),
        FEMALE("XX");
    
        private String chromosome; // 염색체
        private Gender(String chromosome){
            this.chromosome = chromosome;
        }

    Enum의 메소드, 변수 선언하기

    • Enum안에 선언된 메소드나 변수를 가질 수 있다.
    • 또한 Object가 가지고 있는 메소드를 오버라이딩 할 수도 있다.

    Enum 값끼리 비교시에는 == 를 사용한다.

    • ==를 이용해서 Enum타입으로 초기화된 변수를 비교할 수 있다.
    Day day1 = Day.MONDAY;
    Day day2 = Day.MONDAY;
    
    if(day1 == day2){
    	System.out.println("같은 요일입니다.")
    }

    EnumMap

    • Enum타입을 키(Key)로 사용할 수 있도록 해주는 클래스이다.
    import java.util.EnumMap;
    
    public class EnumMapTest {
        public static void main(String[] args) {
            EnumMap emap = new EnumMap(Day.class);
            emap.put(Day.SUNDAY, "일요일은 잠이 최고!!");
            emap.put(Day.MONDAY, "월요병임");
            emap.put(Day.FRIDAY, "야호 불금!!");
    
            System.out.println(emap.get(Day.MONDAY));
        }
    }

    EnumSet

    • Enum 상수를 Set자료구조로 다루기 위한 유용한 메소드를 제공하는 클래스이다.
    import java.util.EnumSet;
    import java.util.Iterator;
    
    public class EnumSetTest {
        public static void main(String[] args) {
            EnumSet eset = EnumSet.allOf(Day.class);
    
            Iterator<Day> dayIter = eset.iterator();
    
            while (dayIter.hasNext()){
                Day day = dayIter.next();
                System.out.println(day);
            }
            System.out.println("---------------------------------");
    
            EnumSet eset2 = EnumSet.range(Day.MONDAY, Day.WEDNESDAY);
            Iterator<Day> dayIter2 = eset2.iterator();
            while (dayIter2.hasNext()){
                Day day = dayIter2.next();
                System.out.println(day);
            }
        }
    }

    Enum은 인터페이스를 구현하고, 해당 인터페이스를 오버라이딩하여 구현할 수 있다.

    public enum Color implements Printer{
        RED("FF0000"),
        GREEN("00FF00"),
        BLUE("0000FF");
    
        private String rgb;
        private Color(String rgb){
            this.rgb = rgb;
        }
    
    
        @Override
        public void print() {
            System.out.println("rgb : " + rgb);
        }
    }
    
    public class ColorTest {
        public static void main(String[] args) {
            Color color = Color.RED;
            color.print();
        }
    }

    Enum은 추상메소드를 가질 수 있다.

    추상메소드를 가질 경우에는 상수를 정의할 때 추상메소드를  함께 구현해주어야 한다.

    public enum Country {
        KOREA{
           public void print(){
               System.out.println("대한민국");
           }
        },
        JAPAN{
            public void print(){
                System.out.println("일본");
            }
        },
        USA{
            public void print(){
                System.out.println("미국");
            }
        };
        public abstract void print();
    }
    
    public class CountryTest {
        public static void main(String[] args) {
            Country country = Country.KOREA;
            country.print(); // 대한민국
        }
    }

    그 밖의 특징

    • Enum 객체는 Enum 상수가 처음 호출되거나 참조될 때 생성된다.
    • Enum은 Serializable 과 Comparable 인터페이스를 이미 구현하고 있다.

    'JAVA' 카테고리의 다른 글

    Java IO 2  (0) 2023.08.23
    JAVA IO 1  (0) 2023.08.23
    팩토리 메소드 패턴과 Java Reflection  (0) 2023.08.14
    this , super()  (0) 2023.08.13
    추상화, 캡슐화, 객체  (0) 2023.08.10

    댓글