JAVA

Enum

devstep88 2023. 8. 23. 15:18

자바의 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 인터페이스를 이미 구현하고 있다.