Project

[Project]Calculator_3

높하늬바람 2025. 5. 13. 17:43

개별 프로젝트로 사칙연산 + $a$ 가 되는 계산기 개발

LV.1

  1. 최소 사칙연산이 가능할것
    - $+$ , $-$ , $*$ , $/$ + $a$

  2. 양의 정수(0 포함)을 입력 받기

    • Scanner 활용
    • 양의 정수는 각각 하나씩 전달 받을것
  3. 연산 기호 입력받기

    • Scanner 활용
  4. 입력받은 정수 2개와 연산를 활용해 연산 후 결과값 출력

    • if or switch
    • 제어문 사용
    • 연산 오류가 발생할 경우 해당 오류에 대해 출력
      ex) 나눗셈 연산에서 분모에 0이 입력될 수 없습니다.
  5. 반복문을 사용하되, 반복 종료를 알려주는 'exit'문자열을 입력하기 전까지 무한으로 계산 진행

    • for or while

LV.2

  1. 연산 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator클래스 생성

    • 사칙연산을 수행한 후. 결과값을 반환하는 메서드 구현
    • 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스 생성
    • 양의 정수 2개와 연산 기호를 매개변수로 받아 사칙연산기능을 수행한 후
      결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스 생성
  2. LV.1에서 구현한 App 클래스의 main 메서드에 Calculator클래스가 활용될 수 있도록 수정

    • 연산 수행 역할은 Calculator클래스가 담당
      • 연산 결과는 Calculator클래스의 연산 결과를 저장하는 필드에 저장
    • 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작할것
  3. App클래스의 main메서드에서 Calculator클래스의 연산 결과를 저아하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정(캡슐화)

    • 간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현(Getter)
    • 간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현(Setter)
    • 위 요구사항을 모두 구현 했다면 App클래스의 main메서드에서 위에서 구현한 메서드를 활용
  4. Calculator클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main메서드에 삭제 메서드가 활용될 수 있도록 수정


Main.java

import java.util.Objects;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {

        int a, b, result;
        String input;
        char c;

        Calculator calculator = new Calculator();
        Scanner sc = new Scanner(System.in);

        for (int i = 1; ; i++) {
            System.out.printf("\n========계산 준비 완료 / 사용량 : %d회==========\n\n", i);
            System.out.println("첫번째 숫자를 입력하세요.");
            System.out.print(": ");
            while (!sc.hasNextInt()){
                System.out.println("잘못된 값을 입력하였습니다.");
                System.out.print(": ");
                sc.next();
            }
            a = sc.nextInt();

            System.out.println("두번째 숫자를 입력하세요.");
            System.out.print(": ");
            while (!sc.hasNextInt()){
                System.out.println("잘못된 값을 입력하였습니다.");
                System.out.print(": ");
                sc.next();
            }
            b = sc.nextInt();

            System.out.println("사칙연산 기호를 입렵하세요(+, -, *, /)");
            System.out.print(": ");
            while(true){
                input = sc.next();
                c = input.charAt(0);
                if(c == '+' || c == '-' || c == '*' || c == '/'){
                    break;
                } else{
                    System.out.println("잘못된 값을 입력하였습니다. 입력값: " + c );
                    System.out.print(": ");
                }
            }

            //연산 처리는 Calculator class에서만 진행
            result = calculator.calculate(a, b, c);
            System.out.println("\n"+ a + c + b + "=" + result);

            calculator.removeresult(); // 오래된 데이터 삭제

            System.out.println("최근 계산값");
            // getter를 사용해 데이터 받기
            for (String history : calculator.getHistory()) {
                System.out.println(history);
            }



            System.out.print("종료 하시려면 'exit'를 입력해주세요: ");
            String out = sc.next();
            if (Objects.equals(out, "exit")){
                break;
            }
        }
    }
}

Calculator.java
import java.util.ArrayList;
import java.util.List;

public class Calculator {
    private static List<String> history; //정보 은닉
    private static final int maxSize = 10;

    // 생성자
    public Calculator() {
        this.history = new ArrayList<>();
    }

    //기능
    public int calculate(int a, int b, char c) {
        int result = 0;
        String output;

        switch (c) {
            case '+':
                result = a + b;
                break;
            case '-':
                result = a - b;
                break;
            case '*':
                result = a * b;
                break;
            case '/':
                if (b == 0) {
                    System.out.println("분모에는 0이 들어갈 수 없습니다." + "\n");
                    break;
                }
                result = a / b;
                break;

        }
        output = a + " " + c + " " + b + " = " + result;
        setHistory(output); //setHistory에서 저장
        return result;
    }

    // 데이터 저장
    public void setHistory(String savedata){
        history.add(savedata);
    }

    // 원본 보호를 위해 복사본 반환
    public List<String> getHistory() {
        return new ArrayList<>(history);
    }

    //오래된 데이터 삭제 기능 구현
    //maxSize를 넘는 갯수가 저장된다면 첫번째 데이터부터 삭제
    public  void removeresult(){
        if(history.size() > maxSize) {
            history.remove(0);
        }
    }
}

최종 결과

'Project' 카테고리의 다른 글

[Project]Calculator_5  (0) 2025.05.13
[Project]Calculator_4  (0) 2025.05.13
[Project]Calculator_2  (0) 2025.05.13
[Project]Calculator_1  (0) 2025.05.13
[Mini Team Project] KPT  (0) 2025.05.13