열거형 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)
근데 사칙연산처럼 두 입력값에 대해서 람다식으로 표현하려면,
1. Funcition 인터페이스를 똑같이 사용하되 pair 객체로 입력값을 넣어준다. Function 인터페이스는 단일 입력 값에 대해서 값을 반환하기 때문에 두 개의 입력 값을 넣으려면 다른 접근 방식이 필요하다.
2. 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
https://devjanghwa.tistory.com/181
https://adjh54.tistory.com/427
'JAVA' 카테고리의 다른 글
[JAVA] 직렬화, 역직렬화 개념 (1) | 2024.10.02 |
---|---|
[JAVA] 큐(Queue), 덱(Deque) 구현체, 메서드 정리 (0) | 2024.09.30 |
[JAVA] 자바와 C언어 메모리 구조 비교 (0) | 2024.08.19 |
[JAVA] comparable, comparator 비교 (0) | 2024.07.03 |
[JAVA] System.in.read() (1) | 2024.06.30 |