[내일배움캠프] 계산기 구현 - level.03(3)

2024. 9. 8. 13:10내일배움캠프

 마지막 요구사항(도전 기능)은 'Stream & Lambda 를 적용한 메서드' 를 구현해 'level03' 계산기에 적용하는 것이다. 정확한 요구사항은 현재 연산결과를 저장하는 'Collection' 객체와 현재 입력한 연산의 결과를 비교해 현재 연산결과 보다 큰 이전 연산결과들을 출력하는 메서드 구현이고 해당 메서드에 'Lambda & Stream' 을 활용하는 것이다.

 

1. 새로운 연산결과 출력 메서드 추가(Lambda & Stream 활용 필수!)

 수정 전 코드를 기준으로 설명하면 나의 경우 'Calculator' 클래스에 연산결과를 저장하는 'Collection' 객체가 필드에 존재한다. 그리고 가장 최근 연산결과 5개를 출력하는 메서드 'getCalculateResults()' 를 구현해 두었다. 그래서 'Calculator' 클래스에 현재 가지고 있는 연산결과에서 방금 입력한 연산의 결과보다 큰 값을 가진 연산결과들만을 반환하는 메서드 'getBiggerResults()' 를 구현해 추가하였다. 추가한 해당 메서드는 아래와 같다.

Calculator 클래스의 getBiggerResults() 메서드

 

방금 입력한 연산의 결과를 파라미터(매개변수)로 받으며, Stream.filter() 메서드에 'Lambda' 식을 사용하여 요구사항을 만족 시켰으며, Stream 의 각 메서드는 아래와 같은 기능을 수행한다.

  • stream() : Collection 객체인 calculateResults 를 '스트림화' 한다. 반환 타입은 Stream<Double> 이 된다(현재 코드 기준).
  • filter() : 필터링 메서드로 '( )' 안의 내용으로 필터링을 진행한다. 나의 경우 파라미터로 전달 받은 result 보다 큰 요소들만 필터링을 통과할 수 있게 하였다.
  • toList() : 필터링을 통과한 스트림 요소를 'List' 객체에 담아 반환한다. '.collect(Collectors.toList())' 구문을 사용해도 같은 결과가 출력된다.

java 8 ~ 9 인 경우 '.collect(Collectors.toList())' 를 사용해야 한다. 이유는 이미지에서 사용한 '.toList()' 는 java 16 에서 등장해 이상 버전에서만 사용가능 한 것 같다. 그러면 16 이상 버전에서는 두 메서드를 어떻게 사용해야 할까? 두 메서드의 차이는 반환하는 'List' 의 수정여부에 있다. '.collect(Collectors.toList())' 의 경우 반환 'List' 를 수정(요소 추가 등)할 수 있지만 '.toList()' 의 경우 수정을 시도하면 아래와 같은 에러가 발생한다.

Stream.toList() 반환 List 수정 시도
수정 시도 결과 - UnsupportedOperationException

 

해당 Exception 은 요청 작업(=반환 List 수정 시도)이 지원되지 않는 작업임을 알리기 위해 있는 Exception 이라고 한다. 즉, '.toList()' 의 반환 List 의 수정을 막아 두었기에 요청 작업을 수행할 수 없는 것이다. 반대로 'collect(Collectors.toList())' 의 경우에는 에러 없이 반환 'List' 가 너무나 잘 수정이 된다.

 

마지막으로 이렇게 추가한 메서드를 포함하여 'level03' 계산기를 실행한 결과를 이야기해 보자면...

추가 메서드 작동 확인

 

'7 * 10' 이란 연산을 입력하면 연산결과는 '70.0' 되고, '최근 계산 결과' 에서 '70.0' 보다 큰 값들 만이 따로 출력되는 것을 확인 할 수 있다. 요구사항에 '연산 결과보다 큰 값들' 을 출력하라 명시했기에 만약 최근 계산 결과에 '70.0' 이란 값이 있더라도 해당 값은 출력되지 않는다(Stream.filter() 에서 걸러짐).

 

 

2. 마무리

 이렇게 CH2 - Java 에서의 첫 번째 과제의 모든 요구사항을 반영한 계산기를 완성하였다. 하지만 아직 제출까지 시간이 2~3일 정도 남아있기 때문에 개인적인 요구사항을 반영한 'level04' 계산기를 구현해보려 한다. 지금 보다 많은 것을 변경할 생각은 없지만 적용해 보고 싶은 방식이 하나 있어 해당 내용을 적용해보려 한다. 물론 'level04' 계산기 구현 전에 현재 프로젝트가 요구사항을 만족하는지 다시 면밀히 확인해 볼 생각이다.