
Enum은 배울 때는 후루룩 배우지만 프로젝트를 할 때는 꽤나 많이 사용되는 존재 인 것 같아서 다시 공부해보고 싶었다. 그래서 Enum이 어떻게 사용되고, 어떻게 활용할 수 있는지를 알아보고 실습해보았다.
공부하기 전 Enum
코드의 유지보수를 위해서 같은 종류끼리 모아놓은 상수 집합?(근데 이제 클래스 처럼 사용가능한..) 같은 이미지였다.
밑의 코드 처럼만 사용해 왔었음
@AllArgsConstructor
@Getter
public enum Developer {
FRONT_END(1, "프론트"),
BACK_END(2,"백엔드"),
FULL_STACK(3, "풀스택"),
NON_DEV(4,"non");
private final int value;
private final String korean;
private static final Developer[] developers = Developer.values();
}
공부 한 후 Enum ( 다양한 쓰임새 )
enum은 생각보다 훨씬 활용도가 높았다.
1. 데이터들 간의 연관관계 표현
아래처럼 같은 의미를 가진 데이터들간의 연관관계를 표현하는데에 적합하고, 이를 이용하여 코드를 더 가독성 있게 작성할 수 있다.
public enum tableStatus{
Y("1", true ),
N("0", false);
}
2. 행위를 관리할 수 있다.
각 값마다 지정된 행위를 해야 할 경우가 있다.
그런데 그 값과 행위 메서드를 분리 할 경우, 둘이 관계가 있음을 표현할 방법이 없다.
예를 들어 뽑아낸 상태에 따라 지정된 메서드에서만 계산되길 원하는데, 강제할 수단이 없다.
이 때 "특정 값이 지정된 메서드와 관계가 있다"라는 것을 표현하기 위해 Enum을 사용할 수 있다.
@AllArgsConstructor
public enum CalculatorType {
CALC_A(value -> value),
CALC_B(value -> value + 10),
CALC_C(value -> value * 10),
CALC_D(value -> value - 10),
CALC_E(value -> value /10),
CALC_ETC(value -> 0L);
private Function<Long, Long> expressions;
public long calculate(long value) {
return expressions.apply(value);
}
}
이런식으로 각각의 타입이 본인만의 행위를 갖도록 하여 값과 메서드가 어떤 관계가 있는지 바로 인지할 수 있다.
3. 데이터 그룹 관리 (enum안의 enum)
결제라는 데이터는 결제 종류와 결제 수단이라는 2가지 형태로 표현된다.
"카드" 라는 결제 종류에는 "신용카드", "카카오페이"등 다양한 수단이 존재한다.
이렇게 2가지 형태 관계를 명확히 표현하기 위해 Enum이 사용될 수 있다.
@AllArgsConstructor
@Getter
public enum PayGroup {
CASH("현금", Arrays.asList(PayType.ACCOUNT_TRANSFER, PayType.REMITTANCE, PayType.ON_SITE_PAYMENT, PayType.TOSS)),
CARD("카드",Arrays.asList(PayType.PAYCO,PayType.CARD,PayType.KAKAO_PAY, PayType.BAEMIN_PAY)),
ETC("기타",Arrays.asList(PayType.POINT, PayType.COUPON)),
EMPTY("없음", Collections.emptyList());
private final String title;
private final List<PayType> payList;
public static PayGroup findByPayCode(PayType payType){
return Arrays.stream(PayGroup.values())
.filter(payGroup -> payGroup.hasPayCode(payType))
.findAny()
.orElse(EMPTY);
}
public boolean hasPayCode(PayType payType){
return payList.stream()
.anyMatch(pay -> pay == payType);
}
}
@AllArgsConstructor
@Getter
public enum PayType {
ACCOUNT_TRANSFER("계좌이체"),
REMITTANCE("무통장입금"),
ON_SITE_PAYMENT("현장결제"),
TOSS("토스"),
PAYCO("페이코"),
CARD("신용카드"),
KAKAO_PAY("카카오페이"),
BAEMIN_PAY("배민페이"),
POINT("포인트"),
COUPON("쿠폰"),
EMPTY("없음");
private String title;
}
이렇게 표현함으로써 "결제종류"와 "결제수단"의 관계를 명확하게 파악할 수 있고, 입력값과 결과값이 예측가능해진다. 또한 그룹별로 기능을 추가하는 것도 용이하다.
마무리
지금까지 enum을 오직 유지보수의 측면에서만, 정말 단순하게 사용해왔었다.
공부하면서 느꼈던것은 enum은 데이터들관의 관계를 나타내기에 정말 적합한 수단이라는 것이다.
데이터들의 관계는 문서, 구두상으로 설명 가능하지만 아무래도 제일 좋은 것은 코드로 관계를 보여줄 수 있는게 아닐까.
개발자가 처음 코드를 읽을 때 그 코드가 무엇을 의미하는지 잘 파악이 된다면 그게 정말 좋은 코드라고 생각한다.
가독성 좋은 코드가 곧 생산성을 높이는 것이기 때문이다.
Enum을 잘 활용하면 가독성 좋고, 유지보수에 좋은 코드를 작성할 수 있을 것 같다. 물론 모든걸 enum으로 작성하려면 안되겠지만...ㅎㅎ 나도 앞으로 enum을 활용해서 더 좋은 코드를 쓰는 개발자가 되고 싶다.
참고자료
'Java' 카테고리의 다른 글
| [Java] Optional (0) | 2022.12.02 |
|---|---|
| [Java] 함수형 인터페이스 (0) | 2022.12.02 |
| [Java] Arrays.asList 와 List.of (0) | 2022.11.17 |
| [Java] MultiValueMap이란 (0) | 2022.11.17 |
| [Java] 스트림 (0) | 2022.10.31 |