Java & Kotlin

Java enum

필자A 2022. 11. 2. 22:55

 

 

 

 

 

enum, 열거형

 

어떤 내용에 관련된 상수들의 집합

 


 

왜 enum을 사용해야 할까?

 

📗성격별로 상수를 분리

 

enum을 사용하지 않고 상수값을 관리하고 싶으면

아래처럼 사용해도 된다.

 

public class OldEnumClass {
    public static final int MOUSE       = 1;
    public static final int KEY_BOARD   = 2;
    public static final int MONITOR     = 3;
}
public class OldEnumClass2 {
    public static final int RUN     = 1;
    public static final int JUMP    = 2;
    public static final int STOP    = 3;
}

 

 

 

하지만 논리적으로 다른 성격인 상수임에도

같은 값을 가지므로 아래에서는 true가 출력이 됩니다.

정확한 결과이지만 논리적으로는 옳지못합니다.

public static void main(String[] args) {
    System.out.println(OldEnumClass.MOUSE == OldEnumClass2.RUN);
}

 

enum으로 장비와, 행동을 나누어 상수값을 관리하면

서로를 비교하는 로직을 작성 할 수 없습니다.

 


주의점

 

enum class의 ordinal() 메서드는

enum 내부의 상수의 순서를 표현합니다.

 

해당 메서드로 기능을 작성 하였다면

절대 상수의 순서를 바꾸면 안됩니다.

 

실제로도 응용프로그래머에게 제공하려고 만든 기능은 아니라고 합니다.

그러면 왜 캡슐화하지 않았을까..?

 


간단한 사용 예제

 

public enum Type {
    HARD(1), SOFT(3), HALF(4), MIX(25);

    private int value;

    Currency(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }

    public static void main(String[] args) {
        System.out.println(Type.HARD); // 문자열 HARD가 출력
    }
}

 

 

 

public enum PencilGroup {
    KOREA_PENCIL("한국펜슬종류", Arrays.asList("한국브랜드1","한국브랜드2")),
    JAPAN_PENCIL("일본펜슬종류", Arrays.asList("일본브랜드1", "일본브랜드2"));

    private String title;
    private List<String> brandList;

    PencilGroup(String title, List<String> brandList) {
        this.title      = title;
        this.brandList  = brandList;
    }
    
}

 

public enum Rotate
{
    ONE(0), TWO(1), THREE(2), FOUR(3);

    private int value;

    private static Rotate[] rotates = Rotate.values();

    Rotate(int value) {
        this.value = value;
    }
    /** 우측 숫자로 한칸씩 이동합니다. 4를 넘어서면 다시 0으로 돌아옵니다.*/
    public Rotate move(int movement) {
        return rotates[movement % 4];
    }

    public static void main(String[] args) {
        Rotate rotate = Rotate.ONE;
        System.out.println(rotate);
        System.out.println(rotate.move(1));
        System.out.println(rotate.move(2));
    }
}

enum class에서 제공되는 주요 method

 

String name() : 각 요소들의 이름

int ordinal() : enum의 순서

T valueOf(Class<T> enumType, String name) : 문자열로 enum의 이름을 찾아서 요소의 이름을 반환

 T[] values() :  모든 enum의 요소들을 배열로 만들어줌


 

enumSet

 

enum과 자료구조 set이 함께 동작하는 기능

 

특징 

 

1. 열거형값만 저장 할 수 있다.

2. 모든 값이 같은 열거형에 속해야한다.

3. not null

4. not thread safe

5. 열거형에 정의된 순서에따라 정렬된다.

 

 

 

 


enum class 정리

 

1. 기본 생성자가 묵시적 private 이다. 생성자를 호출하여 인스턴스 생성 불가

 

2. enum에 정의한 상수값들은 해당 enum class의 객체이다.

 

3. 컴파일 시점에 서비스에서 어떠한 관심사에서 사용되는 상수정보를

모두 알 수 있다면 enum으로 관리하자.

 

반응형