enum
public enum OperatorType {
ADD('+'){
@Override
public double apply(double num1, double num2) {
return num1 + num2;
}
},
SUB('-'){
@Override
public double apply(double num1, double num2) {
return num1 - num2;
}
},
MUL('*'){
@Override
public double apply(double num1, double num2) {
return num1 * num2;
}
},
DIV('/'){
@Override
public double apply(double num1, double num2) {
if(num2 == 0){
throw new ArithmeticException("0으로 나눌수없습니다.");
}
return num1 / num2;
}
};
private final char symbol;
OperatorType(char symbol){
this.symbol = symbol;
}
public abstract double apply(double num1, double num2);
public static OperatorType fromChar(char operator){
for(OperatorType op : values()){
if ( op.symbol == operator){
return op;
}
}
throw new IllegalArgumentException("잘못된 부호입니다.");
}
}
calculator
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ArithmeticCalculator {
public List<Double> results = new ArrayList<>();
public <T extends Number, U extends Number>Double calculate(T num1, U num2, OperatorType operator){
double double1 = num1.doubleValue();
double double2 = num2.doubleValue();
double result = operator.apply(double1, double2);
results.add(result);
return result;
}
public List<Double> getResults(){
return results;
}
public void removeResults(){
results.remove(0);
}
public List<Double> getBigResults(double value){
return results.stream()
.filter(v -> v > value)
.collect(Collectors.toList());
}
}
main
import java.util.Scanner;
public class CoreApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator();
String exit = " ";
while(!exit.equals("exit")){
System.out.print("첫번째 숫자를 입력하세요: ");
String input1 = sc.next();
Number num1 = input1.contains(".") ? Double.parseDouble(input1) : Integer.parseInt(input1);
System.out.print("연산할 부호를 입력하세요: ");
char operator = sc.next().charAt(0);
OperatorType operatorType = OperatorType.fromChar(operator);
System.out.print("두번째 숫자를 입력하세요: ");
String input2 = sc.next();
Number num2 = input2.contains(".") ? Double.parseDouble(input2) : Integer.parseInt(input2);
Double result = arithmeticCalculator.calculate(num1,num2,operatorType);
System.out.println("결과: " + result);
System.out.println("계산 기록: " + arithmeticCalculator.getResults());
System.out.print("가장 먼저 계산된 기록을 삭제할까요?(yes입력): ");
String yes = sc.next();
if(yes.equals("yes")){
arithmeticCalculator.removeResults();
System.out.println("계산 기록: " + arithmeticCalculator.getResults());
}
System.out.print("특정값보다 큰 값을 조회할까요?(yes 입력): ");
String answer = sc.next();
if(answer.equals("yes")){
System.out.print("조회할 값을 입력하세요: ");
double value = sc.nextDouble();
System.out.println(value + "보다 큰 값들: " + arithmeticCalculator.getBigResults(value));
}
System.out.print("계산을 종료할까요?(exit 입력): ");
exit = sc.next();
}
System.out.println("프로그램을 종료합니다...");
sc.close();
}
}
기존에 정리한 내용이니 추가로 정리는 진행하지않음.
이차원 배열이니 나머지 구하기니 아직 익숙치않은데 너무 욕심부려서 이것저것집어넣었나보다. 이번엔 정석대로 진행.
step3만 두번째하는데 아직도 익숙하지않은듯 중간중간 해설을 들여다보지않으면 완성하기 힘들다.
클래스를 불러오는 것도 아직도 참 낯설다. 그래도 step2는 대략 마스터한듯..