JAVA

[JAVA] 열거형 enum

hail2y 2024. 10. 9. 18:04

열거형 enum

  • enumeration(열거, 목록)의 약자
  • 허용 가능한 값 제한
  • 특정 값들의 집합을 나타내는 데이터 타입, 서로 연관되어 있는 '미리 정의된 상수 집합'
  • 일반적으로 이름의 쌍으로 구성되어 있음
  • 열거 상수는 대문자로 작성
  • 코드의 가독성, 안정성 향상, 싱글톤 패턴 구현
public enum Day {
    MON,
    TUE,
    WED,
    THUR,
    FRI,
    SAT,
    SUN;
}

일반 열거 상수 형태

열거 상수의 데이터

  • 위처럼 열거 상수 이름만으로도 선언할 수 있지만, 열거 상수 안에 필드를 두어 세부적으로 접근 가능
  • 필드 뿐만 아니라 메서드도 가능하여 각각의 기능을 처리할 수 있다
public enum Day {
    MON("월"),
    TUE("화"),
    WED("수"),
    THUR("목"),
    FRI("금"),
    SAT("토"),
    SUN("일");

    private final String korean; // 데이터 필드

    Day(String korean) { // 생성자로 열거 상수 데이터 등록
        this.korean = korean;
    }
    
    public String getKorean() { // 데이터 필드 확인해 보는 getter 함수 
        return korean;
    }
}
public class TestClass {
    public static void main(String[] args) {
        System.out.println(Day.WED.name()); // WED
        System.out.println(Day.WED.toString()); // WED
        System.out.println(Day.WED.getKorean()); // 수
    }
}

 

lombok을 활용해 더 간단히 작성할 수 있다. 단 열거형의 구조를 잘 알고 있다는 전제 하에 사용하는 게 좋다.

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {

    // 두 가지 상수 정의
    // 각각의 상수에 key, title 필드 부여
    // 스프링 시큐리티에서는 권한 코드에 항상 'ROLE_'이 앞에 있어야만 한다

    GUEST("ROLE_GUEST", "손님"),
    USER("ROLE_USER", "일반 사용지");

    private final String key;
    private final String title;
}

 

다음은 열거 상수 안에 필드 대신 메서드를 입력한 예시다. (https://adjh54.tistory.com/427)

이 경우에는 추상 메서드를 활용해 상수별로 메서드 구현한 것이다.

public enum Calculator {
    PLUS {
        public int apply(int x, int y) { return x + y; }
    },
    MINUS {
        public int apply(int x, int y) { return x - y; }
    },
    MULTIPLY {
        public int apply(int x, int y) { return x * y; }
    },
    DIVIDE {
        public int apply(int x, int y) { return x / y; }
    };

    public abstract int apply(int x, int y);
}

열거 상수 안 메서드 입력 예시

열거 상수 안에 각 메서드를 정의할 수 있어서 새로운데, 이 말은 열거 상수에 따라 값에 대한 처리를 다르게 해 줄 수 있다는 말과 같다. 아래는 단일값에 대한 처리를 하는 모습인데, Function 인터페이스와 함께 썼다. (https://techblog.woowahan.com/2527/)

Function <T,R>은 함수형 인터페이스인데 함수형 인터페이스는 람다식으로 표현할 수 있다. 덕분에 깔끔한 코드를 확인할 수 있다. (https://bcp0109.tistory.com/313)

 

Java Enum 활용기 | 우아한형제들 기술블로그

안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 Enum에 관해

techblog.woowahan.com

함수형 인터페이스는 람다식으로 표현 가능하다
단일 값에 대한 처리

근데 사칙연산처럼 두 입력값에 대해서 람다식으로 표현하려면,

1. Funcition 인터페이스를 똑같이 사용하되 pair 객체로 입력값을 넣어준다. Function 인터페이스는 단일 입력 값에 대해서 값을 반환하기 때문에 두 개의 입력 값을 넣으려면 다른 접근 방식이 필요하다.

2. BiFunction 인터페이스를 사용한다. 그러면 앞서 추상 메서드를 썼을 때와 동일한 결과를 얻을 수 있다.

두 입력 값에 대한 처리를 할 때 BiFunction 인터페이스를 사용할 수 있다
두 값에 대한 처리

내장 메서드

메서드 실행 결과를 보고 빠르고 직관적으로 파악하는 것이 도움될 것 같다. 

  • name(): 열거 상수의 이름을 문자열로 반환 (enum 클래스에서 선언한대로)
  • toString(): 열거 상수의 이름을 문자열로 반환, name()이랑 별 차이가 없어 보이는데 공식 문서에는 toString()이 사용자에게 더 친숙한 이름을 반환한다고 나와 있다 ("Most programmers should use the toString method in preference to this one(name()), as the toString method may return a more user-friendly name. ")
  • ordinal(): 선언 순서를 나타내는 ordinal 필드는 프로그래머가 잘 사용하지 않는다고 나와 있다. 이것은 enum을 기반한 자료 구조에서 주로 사용된다고 한다.(Most programmers will have no use for this field. It is designed for use by sophisticated enum-based data structures, such as java. util. EnumSet and java. util. EnumMap.)
  • compareTo(): 선언한 순서대로 객체 비교, 먼저 선언했으면 -, 늦게 선언했으면 +
  • equals(): 같은 enum 타입의 열거 상수와만 비교 가능
  • getDeclaringClass(): 열거 상수의 enum 타입과 일치하는 class 객체 반환 
  • hashCode(): 열거 상수의 해시 코드 반환
  • valueOf(String name): 열거 상수 반환, values(): 열거 상수들을 배열에 담아 반환

메서드 실행 결과 화면

 

https://docs.oracle.com/en/java/javase/11/docs/api///java.base/java/lang/Enum.html

 

Enum (Java SE 11 & JDK 11 )

 

docs.oracle.com

 

https://devjanghwa.tistory.com/181

 

[JAVA] Enum(열거형) 개념과 예제

Enum 이란?enum은 'Enumeration' 의 약자로 열거, 목록 이라는 뜻을 가지고 있다. 말 그대로 관련있는 상수들의 집합이며 JAVA에서는 final로 String, int 등을 나타내는 일정 개수의 기본 자료형의 값을 고정

devjanghwa.tistory.com

https://adjh54.tistory.com/427

 

[Java] Enum(Enumerated type) : 열거형 이해하기 -1 : 정의, 주요특징, 메서드, 활용 예시

해당 글에서는 Java에서 Enum에 대해 이해하고 이를 활용할 수 있는 방안에 대해서 알아봅니다.1) Enum(Enumerated type) : 열거형💡 Enum(Enumerated type) : 열거형- 특정 값들의 집합을 나타내는 데이터 타입

adjh54.tistory.com