Java - enum

청포도봉봉이·2023년 11월 26일
3

java

목록 보기
5/20
post-thumbnail

enum은 무엇이고 어떻게 사용하나요?

enum 이란


자바에서 enum 타입은 열거형 요소, 한정된 값만을 갖는 데이터 타입이다. 자바에서 서로 연관있는 상수들을 편하게 관리하게 위해 사용되고 요일, 순위, 성적 등을 나타내기 위해 사용된다.
일반 클래스와 같이 확장자가 .java 이지만 키워드는 enum을 사용한다.

enum을 대체했던 방법


1. 상수를 사용하는 방법

public class Week {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;
    public static final int SUNDAY = 7;
}
public class Month {
    public static final int JANUARY = 1;
    public static final int FEBRUARY = 2;
    public static final int MARCH = 3;
    public static final int APRIL = 4;
    public static final int MAY = 5;
    public static final int JUNE = 6;
    public static final int JULY = 7;
    public static final int AUGUST = 8;
    public static final int SEPTEMBER = 9;
    public static final int OCTOBER = 10;
    public static final int NOVEMBER = 11;
    public static final int DECEMBER = 12;
}
public class Main {
    public static void main(String[] args) {

        int day = Week.MONDAY;

        if (Week.MONDAY == Month.JANUARY) {
            System.out.println(Week.MONDAY);
            System.out.println(Month.JANUARY);
            day = Month.JANUARY;
        }

        switch (day) {
            case Week.MONDAY:
                System.out.println(day);
                break;
            case Week.TUESDAY:
                System.out.println(day);
                break;
            case Week.WEDNESDAY:
                System.out.println(day);
                break;
        }
    }
}

문제점

  • 값의 중복: 상수 값은 고유성을 보장하지 않아서 값의 중복이 발생할 수 있다. 예를 들어, 1이라는 값이 월, 요일 등 여러 곳에서 사용될 수 있어서 혼동이 올 수 있다.
  • 타입 안전성: 타입 안전성이란, 변수에 할당될 수 있는 값의 범위를 제한하고, 이를 컴파일 시점에 검사하여 프로그램의 오류를 줄이는 것을 말한다. 상수를 사용하면 이 타입 안전성을 보장받지 못한다.

2. 클래스를 이용하는 방법

public class WeekInstance {

    public static final WeekInstance MONDAY = new WeekInstance();
    public static final WeekInstance TUESDAY = new WeekInstance();
    public static final WeekInstance WEDNESDAY = new WeekInstance();
    public static final WeekInstance THURSDAY = new WeekInstance();
    public static final WeekInstance FRIDAY = new WeekInstance();
    public static final WeekInstance SATURDAY = new WeekInstance();
    public static final WeekInstance SUNDAY = new WeekInstance();
}
public class Main {
    public static void main(String[] args) {
    
        WeekInstance week = new WeekInstance();
        if (week == WeekInstance.MONDAY) {
            System.out.println("Same");
        }
        else {
            System.out.println("Not same");
        }
    }
}
Not same

문제점

  • 새로운 인스턴스 생성: 클래스를 이용하면 새로운 인스턴스를 만들 수 있다. 이렇게 되면 기존에 정의된 상수와는 다른 인스턴스가 되어서 비교문이 제대로 동작하지 않는다.

3. 인터페이스를 이용하는 방법

인터페이스 내의 변수는 자동으로 public, static, final이 되기 때문에 상수로 사용할 수 있다.

public interface Week {
    int MONDAY = 1;
    int TUESDAY = 2;
    int WEDNESDAY = 3;
    int THURSDAY = 4;
    int FRIDAY = 5;
    int SATURDAY = 6;
    int SUNDAY = 7;
}
public interface Month {
    int JANUARY = 1;
    int FEBRUARY = 2;
    int MARCH = 3;
    int APRIL = 4;
    int MAY = 5;
    int JUNE = 6;
    int JULY = 7;
    int AUGUST = 8;
    int SEPTEMBER = 9;
    int OCTOBER = 10;
    int NOVEMBER = 11;
    int DECEMBER = 12;
}

문제점

  • 값의 중복과 타입 안전성 문제: 상수를 사용하는 방법과 같은 문제가 발생하다.
  • 클래스의 복잡성: 인터페이스를 구현함으로써 상수를 가져오는 것이 가능한데, 이는 클래스의 복잡성을 증가시킬 수 있다.

💡 enum을 사용하였을때


내부적으로는 사실상 클래스이며, 해당 열거형 각 멤버는 해당 열거형의 객체로 취급된다. 이 객체들은 컴파일 시점에 생성되고 수정이 불가능하다. 그래서 상수라고 불린다.

public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public enum Month {
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}

enum 클래스는 위의 3가지 방법에 대한 문제들을 아래와 같이 해결할 수 있다.

  1. 값의 중복: enum은 각 값이 고유한 인스턴스로 존재하기 때문에 중복의 문제가 발생하지 않는다.
  2. 타입 안전성: enum은 특정한 타입의 변수로, 그 타입의 값만 할당할 수 있어서 타입 안전성을 보장한다.
  3. 새로운 인스턴스 생성: enum은 이미 정의된 값 외에는 다른 값을 할당할 수 없어서 새로운 인스턴스를 생성하는 문제가 없다.
  4. 클래스의 복잡성: enum은 별도의 타입으로 존재하기 때문에 클래스의 복잡성을 증가시키지 않는다.
  5. 코드 가독성 향상: enum을 사용하면 코드를 읽는 사람이 해당 값이 어떤 의미를 가지는지 더 쉽게 이해할 수 있다.
  6. 싱글톤 패턴: enum은 싱글톤을 만드는 가장 안전한 방법이며 enum의 각 값은 하나의 인스턴스를 나타내므로 싱글톤 패턴 구현에 활용할 수 있다.

이렇게 enum을 사용하면 코드가 더 안정적이고 가독성도 좋아진다.

profile
서버 백엔드 개발자

0개의 댓글