- 기능 정의
- 사칙연산 (calc)
입력예시 : 1 + 2
- 더하기(sum) : 두 수를 더하는 식을 입력 받으면 결과를 출력한다.
- 빼기(sub) : 두 수를 빼는 식을 입력 받으면 결과를 출력한다.
- 곱하기(mul) : 두 수를 곱하는 식을 입력받으면 결과를 출력한다.
- 나누기(div) : 두 수를 나누는 식을 입력받으면 결과 출력한다.
- 결과 기록 출력(print log)
- 지금까지 실행한 계산의 결과값을 차례대로 출력한다.
- 첫번째 결과 삭제(delete first)
- 가장 처음 실행한 계산의 결과값을 기록에서 삭제한다.
- 기준값보다 큰 결과값 출력(search)
- 입력받은 기준값(실수)보다 큰 결과값을 차례로 출력한다.
- 프로그램 종료(exit)
- 프로그램을 종료한다.
-
인터페이스 방식 : 콘솔 기반
-
예외처리
- 0으로 나눴을 때 : “error:
0으로 나눌 수 없습니다.” 메시지 출력 - 사칙연산 외의 문자가 들어왔을 때 : “error:
지원하지 않는 연산자입니다.” 메시지 출력 - 필수 과제 - 양의 정수 이외의 숫자가 입력되었을 때 : “error:
error: 양의 정수만 계산 가능합니다.” 메시지 출력 - 필수 과제 - 입력 형식을 지키지 않았을 때 : “error:
올바른 형식으로 입력해주세요. ex) 1 + 2” - 도전 과제 - 양의 실수 이외의 숫자가 입력되었을 때 : “error:
실수만 입력할 수 있습니다” 메시지 출력 - 도전 과제 - 기준값으로 실수 이외의 숫자가 입력되었을 떄 "error:
숫자만 입력하세요." 메시지 출력 - 도전 과제 - 빈 배열에 접근하려고 할 때 "error:
결과 로그가 비어있거나 존재하지 않습니다." 메시지 출력
- 0으로 나눴을 때 : “error:
-
제네릭 기반 클래스 :
Calculator<T extends Number & Comparable<T>>-
Number: 산술 연산을 위해 숫자로 변환(doubleValue()) 가능한 타입만 허용하도록 함.
-
Comparable: 로그 조회 시 기준값과 크기를 비교(compareTo())할 수 있도록 함.
-
-
Enum 상수를 통한 연산자 타입 관리
- 사용자가 입력한 문자열(+, - 등)을 객체인 OperatorType으로 변환하여 switch 문에서 안전하게 처리할 수 있도록 함.
-
스트림 기반의 람다식을 사용한 데이터 조회
searchLog(T param)메서드는 Stream의 filter를 사용하여 저장된 데이터 중 특정 기준을 만족하는 값만 추출함.
- Generic 활용
- T 타입끼리는 연산자를 적용할 수 없는 오류를 계속 겪게 됨.
- 자바 컴파일러는 T가 무엇인지 끝까지 의심하기 때문에 이에 제약을 걸어주어야 함을 알게 됨.
- Number, Comparable 제약을 걸어주어 doubleValue(), compareTo()를 사용할 수 있게 됨.
- Enum 활용
- enum 상수를 작성하였으나 이를 어떻게 활용해야할지 알 수가 없었음.
- 또한 입력받은 연산자와 일치하는 enum값이 넘어가도록 하려면 어떻게 해야하는지 알 수 없었음.
values()로 enum에 담긴 값을 자동으로 리스트화할 수 있음을 알게 됨.- 이를 for문으로 순회하여 입력받은 연산자와 비교하면 해당 값으로 대입할 수 있게 됨.
- 향상된 for문과 values() 함수를 통해 역추적하여 넘기는 함수를 구현함.