Java

[Java] Enum

lala9663 2022. 10. 6. 16:26

Enum


enum은 "Enumeration" 의 약자로 "열거, 목록, 일람표" 라는 뜻을 가지고 있다. 보통은 열거형이라 부른다.
열거형, Enum은 요소, 멤버라 불리는 명명돈 값의 집합을 이루는 자료형이다. 열거자 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자다.
자바 Enum은 상수 컬렉션을 정의하는 데 쓰이는 특수한 자바 유형(type)이다. 열거형에는 상수, 메서드 등이 포함될 수 있으며 자바 1.5부터 추가되었다.

쉽게 말해 Enum은 열거형이라 불리며, 서로 연관된 상수들의 집합을 의미한다.
기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있다.

Enum의 장점

  1. 코드가 단순해지며, 가독성이 좋다.
  2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다.
  3. enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크한다.
  4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있다.

java.lang.Enum 클래스

  • Enum 클래스는 모든 자바 열거형의 기본 조상 클래스이다.
  • Enum 클래스에는 열거형을 다루기 위한 다양한 메소드들이 존재한다.
  • 공식문서 Link

Enum 예시


package EnumExample;

public class EnumExample {
    // 기존에 상수를 정의하는 방법
    public static final String MALE = "MALE";
    public static final String FEMALE = "FEMALE";

    public static void main(String[] args) {
        String gender1;
        gender1 = EnumExample.MALE;
        gender1 = EnumExample.FEMALE;
        // MALE, FEMALE이 아닌 상수 값이 할당 될 때 //컴파일시 에러가 나지 않음. -> 문제점 발생.
        gender1 = "boy";
        Gender gender2;
        gender2 = Gender.MALE;
        gender2 = Gender.FEMAL;
        // 컴파일 시 의도하지 않는 상수 값을 체크할 수 있음.
        // Enum으로 정의한 상수값만 할당 받을 수 있음.
        gender2 = "boy";
    }
}

// enum class를 이용해 Gender라는 새로운 상수들의 타입을 정의한다.
enum Gender { 
    MALE,
    FEMAL; 
}

기존의 상수를 정의하는 방법에 따라 상수를 정의했다.

public static final String MALE = "MALE";

public static final String FEMALE = "FEMALE";

String gender1;을 통해 우리가 정의한 상수타입과 같은 String 타입의 변수 gender1;을 선언한다.
static 키워드를 통해 인스턴스 없이 상수를 사용할 수 있도록 MALE, FEMALE을 정의했기 때문에
gender1의 각각 원하는 상수를 할당 할 수 있다.

문제는 우리가 원하는 MALE, FEMALE의 상수가 아닌 gender1과 같은 타입이면서 엉뚱한 값이 들어가면 이야기가 달라진다.

만약 아래와 같이 gender1 이라는 변수에 우리가 원치않는 "boy"라는 실수 값이 할당되었을때
따로 우리가 기대하는 상수값이 할당되었는지 안되었는지에 대한 유효성 검사하는 로직이 들어가있지 않다면,
런타임시 문제가 발생하고 우리가 원치않은 상수값이 애초에 할당되었기 때문에 엉뚱한 결과값을 얻을 것이다.

gender1= "boy";

이러한 문제가 발생하는 이유는 자바 컴파일시 문제점을 발견할 수 없기 때문이다.
자바 입장에서는 String 이라는 타입에 String이 들어왔으니 당연하다고 여긴다.

이 문제를 해결 하기위해서 enum을 사용한다.

예시 아래쪽 코드를 보면 enum을 통해 Gender라는 상수타입을 정의했다.

enum Gender{  
    MALE,
    FEMAL;    
}

그 후 다음과 같이 Gender 타입으로 gender2 라는 변수를 선언한다.

Gender gender2;

gender2 가 Gender타입이기 때문에 다음과 같이 Gender 타입인 MALE, FEMALE 을 할당 할 수 있다.

gender2 = Gender.MALE;
gender2 = Gender.FEMALE;

enum class 의 인스턴스를 따로 생성하지 않고 바로 MALE, FEMALE 로 접근한 이유는 내부적으로 생략되었기 때문이다.

class Gender{

    public static final Gender MALE = new Gender();
    public static final Gender FEMALE = new Gender();

}    // 생략 안 된 enum 클래스

static이 생략 되었을 뿐 enum class 안에 정의된 상수들은 static 변수 효과를 나타내는 것이다.

이번에 다시

gender2 = "boy";

gender2라는 타입은 Gender라는 상수타입인데 String 타입인 boy를 할당하려고하니 컴파일에러가 발생한다.
즉, 컴파일시 우리가 기대하지 않는 상수값의 할당을 사전에 체크할 수 있는 것이다.