이 프로젝트는 자바로 계산기 프로그램을 만드는 것입니다.
이 프로젝트는 level이 나뉘어져 있으며, level이 올라갈수록 백엔드 개발자스러운 코드로 변할 예정입니다.
현재 블로그는 level 1에서 했던 계산기 프로그램에서부터 시작하여 level2 형태로 변형한 것입니다.
사칙연산을 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
Lv 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정
App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정 (캡슐화)
Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정
Main class
import calculator.Calculator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Double> list = new LinkedList<>();
char play = 'p';
while (play != 'q' && play == 'p') {
// end condition
if (play == 'q') {
System.out.println("계산기를 종료합니다.");
break;
}
Calculator calculator = new Calculator();
// input
System.out.print("첫번째 숫자 입력: ");
calculator.setFirstNumber(scanner.nextInt());
System.out.print("두번째 숫자 입력: ");
calculator.setSecondNumber(scanner.nextInt());
System.out.print("사용할 사칙연산 기호: ");
calculator.setOperator(scanner.next().charAt(0));
System.out.println("계산 결과: " + calculator.getResult());
list.add(calculator.getResult());
System.out.println("계산 리스트: ");
list.stream().forEach((x) -> System.out.println(x));
// decide to remove the result
System.out.println("앞 결과를 삭제하시겠습니까? (y/n)");
char decision = scanner.next().charAt(0);
// output
if(decision == 'y') {
list.remove(0);
}
// decide keep playing or end program
System.out.println("프로그램 종료를 원하시면, q를 입력하고 엔터, ");
System.out.println("다른 계산을 원하시면, p를 입력하고 엔터");
play = scanner.next().charAt(0);
}
}
}
Calculator class
package calculator;
public class Calculator {
private int firstNumber;
private int secondNumber;
private char operator;
private Double result;
public void setFirstNumber(int firstNumber) {
this.firstNumber = firstNumber;
}
public void setSecondNumber(int secondNumber) {
this.secondNumber = secondNumber;
}
public void setOperator(char operator) {
this.operator = operator;
}
public Double getResult() {
return calculate();
}
private Double calculate() {
switch (operator) {
case '+':
result = (double) (firstNumber + secondNumber);
break;
case '-':
result = (double) (firstNumber - secondNumber);
break;
case '*':
result = (double) (firstNumber * secondNumber);
break;
case '/':
result = (double) (firstNumber / secondNumber);
break;
default:
}
return result;
}
}
setter로만 데이터를 가져올 수 있게 캡슐화를 하였고, 결과 값을 getter로 사용할 수 있게 했습니다.
부족한점이 많지만 이렇게 함으로써 캡슐화가 되었고, private으로 다른 값들은 모르는 상태로 결과만 추출할 수 있는 클래스를 만들었습니다.
추가적으로, LinkedList를 활용하여 데이터를 저장하였습니다.
조건에서 저장된 값 중 앞에서부터 없어져야하기 때문에 node로 연결된 linkedlist를 활용한다면 시간복잡도가 O(1)이 되기 때문에 이 방식으로 결정하였습니다.
