enum은 일정 개수의 상수값을 정의해주고 그 외의 값은 허용해 주지 않는 타입이다.
이전에는 그저 상수 정의 용도 로만 사용을 했지만 생각보다 다양하게 활용을 할 수 있었다.
이미 많은 곳에서 enum의 기본적인 내용을 소개했으므로 정의나 기본은 생략하고 enum의 활용법에 대해 설명하겠다.
public enum Rank {
FIRST("1", 20000000),
SECOND("2", 3000000);
private String rank;
private int prize;
Rank(String rank, int prize) {
this.rank = rank;
this.prize = prize
}
public String getRank() {
return rank;
}
public int getPrize() {
return prize;
}
}
위와같이 "FIRST", "1", 20000000
을 한 묶음으로 만들 수 있다. 또한 필요하다면 get메서드를 추가할 수 있다.
int reward = FIRST.getPrize();
String rank = SECOND.getRank();
enum에도 class처럼 메소드를 사용할 수 있는데 enum에 메소드를 사용하면 더 관리하기 편한 코드를 만들 수 있다.
public enum Student {
JAMES("제임스",0),
JOHN("존",1),
// ~ 다른 학생 정보 ~
ALICE("앨리스",2);
private final String name;
private final int number;
Student(String name, int number) {
this.name = name;
this.number = number;
}
public static Student fromName(String name) {
return Arrays.stream(Student.values())
.filter(student -> student.name.equals(name)
.findAny()
.orElseThrow(() -> new IllegalArgumentException());
}
public int getNumber() {
return number;
}
}
public int getStudentNumber(String name) {
return Student.fromName(name)
.getNumber();
}
위와 같이 enum을 활용하여 getStudentNumber()를 더 간단하게 구현이 가능하다.
enum에 함수형 인터페이스를 활용할 수 있다.
enum Calculate {
PLUS((x,y) -> x + y),
MINUS((x,y) -> x - y),
MULTIPLY((x,y) -> x * y),
DIVIDE((x,y) -> x / y);
public final BiFunction<Integer, Integer, Integer> expression;
Calculate(BiFunction<Integer, Integer, Integer> expression) {
this.expression = expression;
}
public int calc(int x, int y) {
return expression.apply(x,y);
}
}