이전글
서론
이전 글에서 java에서의 상수와 enum을 알아봤다.
enum은 상수를 모으는 역할을 할 뿐만 아니라, 연관값을 설정하는 등 다양하게 활용될 수 있다고 하였는데 이번에 다양한 활용법들을 정리해보려고 한다.
아래의 블로그를 많이 참고하여 작성한다!
https://techblog.woowahan.com/2527/
활용1: 연관이 있는 상태와 행위를 한 곳에서 관리하기
예를 들어 enum타입별로 다르게 동작하는 메서드가 있다고 하자.
이 경우에 switch, if문 등으로 enum타입을 분류하여 각각에 맞는 동작을 수행하게 된다
enum Month {
JANUARY,
FEBRUARY,
MARCH;
}
class Me {
public void eatFood() {
Month month = Month.JANUARY;
switch (month) {
case JANUARY:
System.out.println("1월에는 붕어빵 먹기!");
break;
case FEBRUARY:
System.out.println("좀 따뜻해졌으니 냉모밀!");
break;
case MARCH:
System.out.println("3월에는 화전!");
break;
}
}
}
이렇게 구현한 경우 eatFood() 메서드를 딱 봤을 때 MONTH 와 관련있다는 걸 알 수 없다.
그렇다고 메서드 이름에 enum을 넣을 수도 없다. 게다가 다음과 같은 2가지 단점이 더 있다
- 똑같은 기능을 하는 메소드 중복 생성 가능
- 다른 클래스에서 옆에 클래스에 같은 기능을 하는 메서드가 있는 걸 모르고 중복구현을 할 수 있다
- 관리 포인트가 증가함
- 계산 메소드 누락가능
- 만약 eatFood와 같은 간단한 메소드가 아니라 뭔가를 계산하는 메소드가 있다고 생각해보자
- 새로운 기능 생성 시 계산 메소드를 누락할 수 있다
enum Month {
JANUARY((value) -> value + 1),
FEBRUARY((value) -> value + 2),
MARCH((value) -> value + 2);
private Function<Long, Long> expression;
Month(Function<Long, Long> expression) {
this.expression = expression;
}
public long calculate(long value) {
return expression.apply(value);
}
}
class Me {
public void eatFood() {
Month month = Month.JANUARY;
long value = 1;
long calculated = month.calculate(value);
System.out.println(calculated);
}
}
이를 다음과 같이 enum 안에서 처리할 수가 있다 (java 8부터 업데이트 된 내용)
활용2: 연관된 데이터 여러 개 넣기
enum Month {
JANUARY(1, Arrays.asList("붕어빵", "알코올")),
FEBRUARY(2, Arrays.asList("메밀면", "잡곡밥", "통밀빵")),
MARCH(3, Arrays.asList("화전", "츄러스"));
private int number;
private List<String> food;
Month(int number, List<String> food) {
this.number = number;
this.food = food;
}
}
이렇게 구현하면 enum에 해당하는 상수들을 순회하며 찾을 수 있고, 상수값에 길이가 다른 연관값들을 넣을 수 있다
Food들을 enum으로 다시 묶으면 더 가독성이 좋아지고, 유지보수도 편해진다
enum Food {
FISH_BUN("붕어빵"),
ALCOHOL("알코올"),
BUCKWHEAT_NOODLE("메밀면"),
MULTIGRAIN_RICE("잡곡밥"),
WHOLE_WHEAT_BREAD("통밀빵");
private String name;
Food(String name) {
this.name = name;
}
}
enum Month {
JANUARY(1, Arrays.asList(Food.FISH_BUN, Food.ALCOHOL)),
FEBRUARY(1, Arrays.asList(Food.BUCKWHEAT_NOODLE, Food.MULTIGRAIN_RICE)),
MARCH(1, Arrays.asList(Food.WHOLE_WHEAT_BREAD));
private int number;
private List<Food> food;
Month(int number, List<Food> food) {
this.number = number;
this.food = food;
}
}
데이터베이스 관련 내용을 제외하고 자바에 관련한 내용들만 정리해봤는데, 이렇게 enum을 사용하면 다양한 일을 할 수 있다!
이전에는 enum을 상수값을 저장하는 용도로만 사용했었는데, 내부에 메소드도 넣을 수 있는 등 클래스와 다름 없는 것 같다. (사실 특별한 클래스가 맞긴 하다)
이번 기회에 enum을 자세하게 알아봐서 좋다. 상수를 많이 사용해야할 일이 있으면 유용하게 사용할 수 있을 것 같다!
'프로그래밍 언어 > Java' 카테고리의 다른 글
[JAVA] 자주 사용하는 Exception들 알아보기(IllegalArgumentException, IllegalStateException, IOException, NullPointerException) (0) | 2023.11.08 |
---|---|
[JAVA] Test로 Collections 공부하기 (0) | 2023.11.07 |
[JAVA] 상수와 enum 공부하기1 (0) | 2023.11.07 |
[JAVA] 상수를 private static final로 선언하는 이유 (0) | 2023.11.07 |
[JAVA] 단위테스트 공부3: 활용하기 (0) | 2023.11.01 |