[Java] Enum

박채은·2022년 11월 10일
0

Java

목록 보기
18/30

Enum

여러 상수들을 편리하게 선언할 수 있도록 만들어진 자바의 문법 요소
서로 관련있는 상수들의 집합

JDK 1.5 이전 버전에서는 enum 문법을 지원하지 않았다.
그래서 이전에는 public static final 제어자를 붙이고, 전역변수로 선언하여 상수를 사용하였다.

public static final int SPRING = 1;

하지만, 이런 경우 문제점이 발생한다.

public static final int SPRING = 1;
public static final int SPRING = 2;

(문제-1) 상수명이 중복될 수 있다. 이때는 인터페이스로 묶어주면 일차적으로는 해결할 수 있다.

interface Seasons(){
	int SPRING = 1;
}
interface Frameworks(){
	int SPRING = 2;
}

하지만 이 코드에도 (문제-2) 타입 안정성이라는 문제가 있다.

두 SPRING 변수는 int 형이기 때문에 다른 개념임에도 ==이 성립한다.

if (Seasons.SPRING == Frameworks.SPRING) {...생략...}

따라서 (문제-2)를 해결하기 위해서, 각 상수들을 서로 다른 객체로 만들어줘야 한다.

class Seasons {
    public static final Seasons SPRING = new Seasons();
}

class Frameworks {
    public static final Frameworks SPRING  = new Frameworks();
}

(문제-1/2)는 해결됐지만, 코드가 길어지고 사용자 정의 타입이기 때문에 switch문에서 사용할 수 없다.
(switch문의 조건은 char, byte, short, int, Character, Byte, Short, Integer, String, enum 타입만 가능하기 때문에 사용자 정의 타입인 Season은 사용 불가능)
즉, 이를 해결하기 위해 나온 것이 enum이다.

(1) new 키워드를 사용하여, 길게 작성한 코드

class Seasons {
    public static final Seasons SPRING = new Seasons();
    public static final Seasons SUMMER = new Seasons();
    public static final Seasons FALL = new Seasons();
    public static final Seasons WINTER = new Seasons();
}

(2) enum을 사용하여, 간단하게 작성한 코드

enum Seasons { SPRING, SUMMER, FALL, WINTER }

enum의 장점

  • 코드를 단순화 -> 가독성 좋아짐
  • switch문에 사용 가능
  • 상수명의 중복 x
  • 타입에 대한 안정성 보장

enum 사용

enum 열거형이름 { 상수명1, 상수명2, 상수명3, ...}
enum Seasons { SPRING, SUMMER, FALL, WINTER }
  • 상수명은 대문자로 작성
  • 열거 상수들은 객체이다. Seasons 열거형은 SPRING, SUMMER, FALL, WINTER 총 네 개의 열거 객체를 포함하고 있는 것!
  • 각각의 상수들에는 따로 값을 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당된다.
  • 상수에는 열거형이름.상수명 을 통해 접근

궁금한 점-해결

enum은 자동적으로 0부터 시작하는 정수값이 할당되어 각각의 상수를 가리키게 되는데 "enum에게 각각 원하는 값을 지정해줄 순 없는가?" 라는 궁금증이 들었다.

결론적으로는 객체 자체에 주어지는 정수값은 바꿀 순 없다는 것이다. 해당 정수값은 고유한 id처럼 생각해야 할 듯!

enum에 내가 값을 지정해주고 싶다면, 새로운 맴버 변수를 생성해줘야 한다.
enum은 클래스이기 때문에 내부에 멤버 변수를 선언해줄 수 있고, 이를 생성자로 값을 지정해줄 순 있다.
(enum도 클래스라는 것을 잊지말자!)

아래 예시처럼 String label 변수를 생성해주고, enum마다 값을 지정해준다.

public enum Day {
    MON("Monday"),
    TUE("Tuesday"),
    WED("Wednesday"),
    THU("Thursday"),
    FRI("Friday"),
    SAT("Saturday"),
    SUN("Sunday")
    ;

    private final String label;

    Day(String label) {
        this.label = label;
    }

    public String label() {
        return label;
    }
}

참고-1
참고-2

0개의 댓글