Lv.3 의 구현사항
- 계산기 클래스의 메서드 calculate의 피연산자로 모든 타입의 숫자를 받아올 수 있어야 한다. (int, double, 양수, 음수)
- enum 으로 연산자 타입을 관리하고 활용한다.
- 계산기에 저장된 연산 결과를 Lambda & Stream을 활용하여 조건에 맞도록 조회하는 메서드를 구현한다.
오늘은 어제 1,2를 구현하면서 대강만 짜놨던 3번 요구사항을 세부 구현해보았다.
어제는 아래 코드와 같이 메서드를 하나만 추가해놨었다.
public void printResultGreaterThan(Number value) {
String str = result.stream()
.filter(v -> v > value.doubleValue())
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println(str);
}
1. 리스트 필터링 로직 분리하기
여러 조건으로 리스트를 필터링하는 로직을 따로 모듈로 뽑아야겠다고 생각했다.
그 이유는 다음과 같다.
- 재사용성을 높일 수 있다. (지금 과제에서는 재사용할 일이 없기는 하지만)
- 로직을 테스트하기 용이하다.
- 만일 분리하지 않는다면 해당 필터링 로직이 올바르게 수행되는가를 확인하기 위해서 Calculator 인스턴스를 만들어야하고, 피연산자와 연산자를 입력해서 결과값을 만들어주는 작업을 해야한다.
- 필터링 로직만 분리해놓는다면 List만 구성해서 간단하게 테스트할 수 있다.
✅ NumberListFilter 구현
import java.util.List;
import java.util.stream.Collectors;
public class NumberListFilter {
public static <T extends Number> List<T> findAllGreaterThan(List<T> list, Number value) {
return list.stream()
.filter(v -> v.doubleValue() > value.doubleValue())
.collect(Collectors.toList());
}
public static <T extends Number> List<T> findAllLessThan(List<T> list, Number value) {
return list.stream()
.filter(v -> v.doubleValue() < value.doubleValue())
.collect(Collectors.toList());
}
public static <T extends Number> List<T> findAllEqualTo(List<T> list, Number value) {
return list.stream()
.filter(v -> v.doubleValue() == value.doubleValue())
.collect(Collectors.toList());
}
}
- 조건에 맞게 필터링한 리스트를 반환하는 `static 메서드`로 구성하였다.
- Number를 상속한 모든 타입의 리스트에 대해 적용이 가능하도록 `제네릭 메서드`로 구현하였다.
- 모든 메서드에서 stream을 사용했다.
2. 계산기 클래스 : 결과 필터링 조회 메서드 추가하기
이제 계산기 클래스에 NumberListFilter를 사용하는 조회 메서드를 추가해보자.
public void printResultGreaterThan(Number value) {
String resultStr = NumberListFilter.findAllGreaterThan(result, value)
.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println(resultStr);
}
public void printResultLessThan(Number value) {
String resultStr = NumberListFilter.findAllLessThan(result, value)
.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println(resultStr);
}
public void printResultEqualTo(Number value) {
String resultStr = NumberListFilter.findAllEqualTo(result, value)
.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println(resultStr);
}
- 이제 필터링 로직은 NumberListFilter가 수행하고, 계산기 클래스는 이를 포맷팅하여 출력하는 작업만 수행한다.
그런데 또 반복되는 코드들이 눈에 들어온다.
필터링 된 List 요소를 String으로 변환하고, 하나의 문자열로 합치는 작업이다. 이 작업도 메서드로 분리했다.
✅ 각 메서드 구현
public void printResultGreaterThan(Number value) {
System.out.println(joinToString(NumberListFilter.findAllGreaterThan(result, value)));
}
public void printResultLessThan(Number value) {
System.out.println(joinToString(NumberListFilter.findAllLessThan(result, value)));
}
public void printResultEqualTo(Number value) {
System.out.println(joinToString(NumberListFilter.findAllEqualTo(result, value)));
}
private String joinToString(List<Double> list) {
return list.stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
}
}
아주 깔끔해졌다 ✨
'TIL' 카테고리의 다른 글
🧐 계산기 과제를 마무리하는데 생겨난 궁금증 (0) | 2025.01.09 |
---|---|
계산기 과제 : Java Generics, Enum 활용기 (0) | 2025.01.06 |
날아갈랑말랑했던 SQL 문법 복기 (2) (1) | 2024.12.27 |
날아갈랑말랑했던 SQL 기본 문법 복기 (1) (0) | 2024.12.26 |