Java/계산기 구현

2단계 계산기 기능 정리

JuNo_12 2025. 4. 16. 20:50

클래스는 메인 클래스로 사용될 App 클래스와 사칙연산 메서드와 삭제 메서드를 가진 Calculator 클래스로 나눠서 진행했다.

 

public class Calculator {

private List<Double> results = new ArrayList<>(); // 연산 결과들을 저장하는 컬렉션 타입 필드

	public void calculate(int positiveInteger1, int positiveInteger2, char operator) {
        // App에서 입력받은 데이터 3개를 가져오는 기능

        boolean possible = true; // boolean은 연산 처리와 오류 방지 로직을 깔끔하게 제어하기 위한 장치로써 사용했다.
                                 // 사칙연산 기능을 Calculator 클래스에 만들어주었고, 반복문은 App 클래스에 구현이 되어있어서
                                 // 이 클래스 내에는 continue를 사용하지 못한다. 따라서 조건문을 통해 오류 로직을 제어하기 위해 사용했다.

        double result = 0; // 나눗셈에서 소숫점까지 표현해주기 위해 double로 표현

        switch (operator) {
            // 사칙연산 코드
        }

        if (possible) {
            System.out.println("결과: " + result);

            results.add(result); // results는 List<Double> 타입의 리스트이다.
                                 // result는 연산이 끝난 후에 얻은 데이터 값이다.
                                 // 그 result 값을 results 리스트에 추가하겠다는 의미
        }
    }
    
    public void removeResults() { // 기록된 값 맨 첫 번째 삭제하는 메서드
             if(!results.isEmpty()) {
                 double removed = results.remove(0);
                 System.out.println("삭제된 값 : " + removed);
                 for(int i=0; i<results.size(); i++) {
                     System.out.println((i+1) + "번째 결과값 : " + results.get(i));
                 }
             } else {
                 System.out.println("삭제할 연산 결과가 존재하지 않습니다.");
             }
        }
}

 

여기서 boolean이 필요한 이유가 더 명확해졌다.

왜냐하면, 이 Calculator 클래스 내에는 continue를 사용하지 못한다. 왜? 애초에 반복문이 없으니까.

따라서 조건문을 활용하여 오류 로직을 제어해주기로 했다.

 


< 그리고 false가 된다면, App 클래스에서 사칙연산 코드를 입력하는 곳으로 이동을 하고 싶은데,

이는 아직 어떻게 구현해야할지 아직 모르겠어서 추후에 이에 대한 정보를 적어놓겠다. >


 

results.add(result); 부분을 보면,

results는 위에서 List<Double>타입의 변수명이다. result는 연산이 끝난 후에 얻은 데이터 값이고, 

그 result 값을 results 리스트에 추가하겠다는 의미이다.

 

 

그리고 맨 아래는 리스트 값들 중에 가장 오래된 계산 결과부터 삭제를 해주는 메서드이다.

만약, results값들이 isEmpty() 비어있지 않다면, 

double타입의 removed라는 상자 안에 기억해놓고 삭제된 값을 보여주고,

results.remove(0)은 results라는 리스트 중 0번째 값을 삭제한다는 의미이다.

 

 

아래는 간단한 반복문인데, 

results.size()는 연산결과의 데이터값들의 개수이고, 

results.get(i)은 리스트에 저장된 값 중에서 i번째 값을 가져온다는 의미이다.

 

public class App {

    public static void main(String[] args) {

        Calculator calc = new Calculator(); // Calculator 인스턴스 생성

        Scanner sc = new Scanner(System.in);

        inputLoop : while (true) {
            // 양의 정수와 사칙연산 문자를 받는 코드

            calc.calculate(positiveInteger1, positiveInteger2, operator); // Calculator 클래스의 사칙연산 메서드 가져오기

            secondLoop :while (true) {
              // 계산을 한 후에, 계산결과를 삭제할건지, 계산을 더 할건지, 종료할건지 정하고 실행하는 코드
            }
            sc.close();
            break;
        }
      }
    }

 

일단, 사칙연산 메서드와 삭제 메서드를 가져오기 위해서는

Calculator의 인스턴스 생성을 해주어야한다.

 

그리고 메서드를 가져오는 명령어는

인스턴스명.메서드명(); 으로 가져오면 된다.

 

 

아래는 getter 및 setter 구현한 코드.

맨 아래 부분 보면, 연산을 수행한 뒤, 업데이트된 결과값들을 가져와서 setResults에 넣어준 모습이다.

아직 이걸 활용하여 어떠한 기능을 만든 것은 아니고, 나중에 필요하다면 가져다가 사용하면 될 것 같다.

public class App {

    public static void main(String[] args) {
    
		List<Double> newResults = new ArrayList<Double>(); // getter 사용, App 클래스에서 연산 결과를 관리할 수 있는 기능
        }
}
        
public class Calculator {

 		public List<Double> getResults() { // getter 메서드
        return this.results;               // results는 연산 결과들을 저장하는 리스트이고 getResults()는 그 리스트를 읽어올 수 있게 해주는 메서드
    }

    public void setResults(List<Double> results) { // setter 메서드
        this.results = results;
	}
}


            calc.calculate(positiveInteger1, positiveInteger2, operator); // 생성한 인스턴스 활용

            List<Double> newResults = calc.getResults(); // 계산 후 업데이트된 결과 리스트 가져오기
            calc.setResults(newResults); // 업데이트된 리스트 설정