이전글
[JAVA] 상수와 enum 공부하기1
Java에서 Enum이란? enum은 enumeration이라는 셈, 계산, 열거, 목록이라는 뜻의 앞부분만 따서 만든 자바의 예약어이다. JDK 1.5 부터 등장한 열거형 상수이다. 서로 연관된 상수들의 집합이라고 생각할
fladi.tistory.com
서론
이전 글에서 java에서의 상수와 enum을 알아봤다.
enum은 상수를 모으는 역할을 할 뿐만 아니라, 연관값을 설정하는 등 다양하게 활용될 수 있다고 하였는데 이번에 다양한 활용법들을 정리해보려고 한다.
아래의 블로그를 많이 참고하여 작성한다!
https://techblog.woowahan.com/2527/
Java Enum 활용기 | 우아한형제들 기술블로그
{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E
techblog.woowahan.com
활용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 |