본문 바로가기

Java/Study

[Java] 백기선 라이브 스터디 11주차 - Enum

목표

자바의 열거형에 대해 학습하세요.


학습할 것 (필수)

enum 정의하는 방법

enum이 제공하는 메소드 (values()와 valueOf())

java.lang.Enum

EnumSet


enumerate in programming   - 상수로 식별하는 역할을 한다.

The enumerator names are usually identifiers that behave as constants in the language. 
 

Constant (computer programming) - Wikipedia

In computer programming, a constant is a value that cannot be altered by the program during normal execution, i.e., the value is constant.[a] When associated with an identifier, a constant is said to be "named," although the terms "constant" and "named con

en.wikipedia.org

JAVA에서는 final로 String과 같은 기본 자료형의 값을 고정한다 => 상수

클래스 내부나 인터페이스에 상수값을 고정할 경우 충돌이 많이 발생하고, 수정할 때 불편하다는 점 때문에 Enum 자료형이 생성되었다.

Enum은 이름있는 상수의 집합을 의미한다. 

장점

-  가독성을 높인다.(개발자의 의도가 분명히 드러난다.)

-  불필요한 인스턴스의 생성을 막아주고 충돌을 방지한다.

 

특징

- 컴파일 시점에 모든 값을 알고 있어야 한다.

열거형(Enum)을 정의하는 방법은 간단하다.

enum Menu{
    AMERICANO, LATTE, CHOCO, TEA;
}

이 간단한 작업이 내부적으로 이렇게 작동한다.

class Menu{
    public static final Menu AMERICANO = new Menu();
    public static final Menu LATTE = new Menu();
    public static final Menu CHOCO = new Menu();
    public static final Menu TEA = new Menu();
}

그래서 사용할 때에도 다른 클래스의 static변수를 사용할 때 처럼 클래스명.변수 이름으로 사용하면 된다. (생성X)

각각의 enum 상수는 객체를 나타낸다.

 

즉, 클래스가 가진 특징들을 활용할 수 있다.(생성자, 메소드, 변수 추가 등등)

enum Menu {
    AMERICANO(4100), LATTE(4600), CHOCO(5000), TEA(5500);

    private int value;

    Menu(int value) {//private생략 되어 있음 public 선언시 컴파일 에러!
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

enum 클래스는 런타임 시점에 동적으로 값을 할당할 수 없다 !

새로운 상수를 가진 인스턴스를 생성할 수 없다는 말이기도 하다. new 로 새로운 객체를 생성하려고 하면 컴파일 에러가 발생한다.

Enum이 제공하는 메서드 values(), valuesOf(), ordinal()

ordinal() 열거형 답게 변수별로 index를 출력해주는 메서드
values() Enum[] 로 enum안의 모든 값을 리턴
valueOf() 값이 존재하면, 이넘 상수 리턴

valueOf() 메서드는 enum에 없는 값을 인자로 넘겨주면 IllegalArgumentException을 발생시킨다.

values()를 사용하는 코드를 보면,

Menu arr[] = Menu.values();
        for (Menu menu : arr) {
            System.out.println(menu + "index : "+ menu.ordinal());
        }

 


java.lang.Enum

public abstract class Enum<E extends Enum>
extends Object
implements Comparable, Serializable{
}

-Enum 클래스를 상속받고 있다.

위와 같이 유용한 10가지 메서드를 제공한다.

toString를 제외하고 final이 붙어 있어 오버라이딩이 불가능하다.

그 이유는 , 위에서 언급 했듯이 프로그래머가 생성자에 접근할 수 없기 때문이다. -> sole constructor

컴파일 시점에 방출되는 것만 코드에서 사용할 수 있습니다.


EnumSet

Enum 을 위해 고안된 Set 인터페이스 이다.

https://www.geeksforgeeks.org/enumset-class-java/

바로 코드로 확인해보자. 기본적인 메서드들은 기존의 collection framewordk에서 사용하는 것들이다.

import java.util.EnumSet;

enum Menu2{
    AMERICANO, LATTE, CHOCO, TEA;
}

public class DemoEnumSet {

    public static void main(String[] args) {
        EnumSet<Menu2> set1,set2,set3,set4;
        //adding element
        set1 = EnumSet.of(Menu2.AMERICANO,Menu2.LATTE, Menu2.CHOCO);
        // set1이 가지고 있지 않은 값 출력 enum 클래스 전부를 set에 추가하면 빈 리스트 리턴
        set2 = EnumSet.complementOf(set1);
        set3 = EnumSet.allOf(Menu2.class);
        set4 = EnumSet.range(Menu2.AMERICANO, Menu2.CHOCO);
        System.out.println(set4);
        // removing element
        set4.remove(Menu2.AMERICANO);

        System.out.println(set4);
        System.out.println(set4.contains(Menu2.AMERICANO));
        System.out.println(set2);
    }
}