Enum

kailyn·2024년 9월 9일

JAVA

목록 보기
14/17

1. Enum 개요

1. 열거타입(enum) 이란?

1-1. 열거타입 정의

💡 열거타입(enum) 이란 관련이 있는 상수의 집합의 클래스를 의미한다. 각각의 열거 상수는 열거 객체로 생성된다.
자바 1.5 이후 새롭게 추가되었으며 기존의 상수를 정의하는 방법을 효과적으로 대체해준다.

  • 상수란?
    • 상수는 변하지 않는 수이다. 예를 들어 하루는 24시간이고 한 시간은 60분이다.
      이런 변하지 않는 것을 상수라고 하고 자바에서는 final 이라는 키워드로 선언한다.
    • 상수는 값이 한번 정해지면 변경할 수 없다.
    • 변수와 다르게 상수명은 모든 문자를 영어 대문자로 작성해야한다.

2. enum 의 등장 배경

자바 1.5 버전 이전에 어떻게 상수를 정의를 하였는지 알아보자.

enum이 등장하기 전에는 정수 열거 패턴을 이용해 상수를 선언했다.

public class Foods {

		// 정수 열거 패턴
    public final static int MEAL_AN_BUTTER_KIMCHI_STEW = 0;
    public final static int MEAL_MINT_SEAWEED_SOUP = 1;
    public final static int MEAL_BUNGEOPPANG_SUSHI = 2;

    public final static int DRINK_RADISH_KIMCHI_LATTE = 0;
    public final static int DRINK_WOOLUCK_SMOOTHIE = 1;
    public final static int DRINK_RAW_CUTTLEFISH_SHAKE = 2;

}

정수 열거 패턴에는 다양한 단점이 존재했다.

2-1. 정수 열거 패턴 단점

  1. 정수 열거 패턴은 타입 안전을 보장할 방법이 없으며 에러 디버깅이 어렵다.

    자바에서 별도의 namespace를 지원하지 않아 접두어를 붙여 상수 명을 구분하였어도 실제 프로그램이 기동할 때에 MEAL_AN_BUTTER_KIMCHI_STEWDRINK_RADISH_KIMCHI_LATTE 의 값이 둘 다 0이기 때문에 구분하지 못한다.

  1. 정수형 상수는 문자열로 출력하기 어렵다.

    정수형으로 선언된 상수명을 문자열을 출력하고 싶을 때 출력하기 어렵다.

  2. 정수 열거 그룹에 속한 모든 상수를 순회하는 방법도 쉽지 않다.

  3. 정수 열거 패턴으로 상수가 선언된 경우 상수에 변경이 발생하면 컴파일을 새로 해야한다.

    정수 열거 패턴의 경우 해당 값이 클라이언트에 새겨지기 때문에 값이 변경되는 경우 다시 컴파일을 해야한다.

위와 같은 단점으로 “문자열 열거 패턴을 사용하면 되지 않느냐” 라는 의견도 있을 수 있으나, 해당 패턴도 다양한 이슈가 발생한다.
문자열 열거 패턴 이용시 연산할 때 문자열을 그대로 사용하여 하드코딩을 하는 이슈가 발생할 수 있고, 런타임 때 버그가 발생하거나
문자열 비교에 따른 성능 저하가 유발될 수 있다.

3. 열거 타입의 등장

enum이 등장하게 된 이후로 정수 열거 패턴의 단점을 모두 보완할 뿐 아니라 그 외에 다양한 장점도 존재한다.

3-1. 열거타입 선언 및 사용 방법

enum 키워드를 활용하여 열거 타입을 선언할 수 있다.

접근제어자 enum 열거체이름 {

		상수명1, 상수명2, ... 상수명XX;		
		
}

정의된 열거 타입을 사용하는 방법은 열거타입이름.상수이름 형식으로 사용하면 된다.

public static void main(String[] args) {

    if("MEAL_AN_BUTTER_KIMCHI_STEW".equals(FoodsEnum.MEAL_AN_BUTTER_KIMCHI_STEW.toString())){
        ...   
    }       
    
}

3-2. 열거 타입 장점

  1. 열거 타입은 싱글톤 방식으로 구현되기 때문에 인스턴스의 생성이나 확장이 되지 않는다.
    즉, 인스턴스가 통제되며 하나만 존재하는 것이 보장된다.

  2. 열거 타입은 컴파일 타임 타입 안정성을 높여준다.
    enumTest() 는 FoodsEnum 타입으로 받도록 선언해 두었기 때문에 다른 타입의 매개변수가 들어오는 경우 컴파일 에러를 발생시켜 준다.

  3. 열거 타입은 상수 이름을 문자열로 출력할 수 있다.

  4. 열거 타입에 메소드나 필드를 추가 할 수 있다.
    추가로 열거 타입은 근본적으로 불변이라 모든 필드는 final 이어야 한다

  5. 열거 타입도 클래스이기 때문에 toString() 을 재정의하여 사용할 수 있다.

  6. 열거 타입에 선언된 상수 하나를 제거하더라도 클라이언트에 영향을 주지 않는다.
    혹시나 삭제된 상수를 참조하고 있는 곳이 있다면 컴파일 에러를 출력해주기 때문에 안전하다.

  7. 열거 타입 내에 선언된 상수들을 순회할 수 있다.

profile
나는 할 수 있다...!

0개의 댓글