Simplifying Switch Case with Java Lambda
Medium
저는 일련의 상수값을 테스트하기 위해 if-else 문보다 switch 문을 사용하는 것을 더 선호합니다. switch 문은 가능한 값이 많을 때 더 간결하고 읽기 쉽기 때문이죠.
다음 코드에서는 요일을 나타내는 열거형과 날짜별로 다른 목표를 프린팅하는 switch 문을 사용합니다.
```
public class ClientApp {
public static void main(String[] args) {
Week week = Week.SATURDAY;
GoalPrinter goalPrinter = new GoalPrinter();
showWeekGoal(goalPrinter, week);
}
private static void showWeekGoal(GoalPrinter goalPrinter,Week week) {
switch (week){
case SATURDAY:
goalPrinter.saturdayGoal();
break;
case SUNDAY:
goalPrinter.sundayGoal();
break;
// 생략
}
}
}
```
이 접근은 결함이 있습니다. Week에 새 요일을 추가해야 하는 경우 GoalPrinter와 ClientApp을 모두 수정해야 합니다. 이는 Open-Closed(SOLID 개방-폐쇄) 원칙에 위배됩니다.
더 개선할 수 있을까요? 실제로 Lambda와 Functional Interface 도움으로 결점을 줄일 수 있습니다.
```
public enum Week {
SATURDAY(GoalPrinter::saturdayGoal),
SUNDAY(GoalPrinter::sundayGoal),
// 생략
public final WeekGoalConsumer<GoalPrinter> consumer;
Week(WeekGoalConsumer<GoalPrinter> consumer) {
this.consumer = consumer;
}
}
```
WeekGoalConsumer를 만들었습니다. 이 인터페이스는 GoalPrinter의 인스턴스를 사용할 수 있습니다.
```
@FunctionalInterface
public interface WeekGoalConsumer<T> {
void execute(T t);
}
```
그리고 마침내, ClientApplication을 수정했습니다.
```
public class ClientApp {
public static void main(String[] args) {
Week week = Week.SUNDAY;
week.consumer.execute(new GoalPrinter());
}
}
```
이 접근 방식은 더 깨끗하고 간결합니다. 열거형에 새로운 상수를 추가해야 할 때, 매번 클라이언트 구현을 변경할 필요가 없습니다.
🐣 최근에 이런 switch 문 코드를 작성할 일이 있었는데, 이 포스팅을 참고해서 수정해야겠네요.
다음 내용이 궁금하다면?
이미 회원이신가요?
2023년 11월 8일 오후 1:29
저도 가독성 때문에 Switch문을 주로 사용하는데 유지보수 까지는 생각 못했네여...좋은글 감사합니닿ㅎ
안
... 더 보기이번에 우아한형제들 기술 블로그에 "타입 안전한 API 모킹으로 프론트엔드 생산성 높이기"라는 새 글을 발행하게 되었습니다.
... 더 보기코
... 더 보기