Project

[Project]Calculator_2

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

개별 프로젝트로 사칙연산 + $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메서드에 삭제 메서드가 활용될 수 있도록 수정


  1. Calculator 클래스에서 연산 수행
import java.util.Objects;
import java.util.Scanner;


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

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

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

        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(": ");
                }
            }

            result = Calculator.calculate(a, b, c);
            System.out.println("\n"+ a + c + b + "=" + result);


            System.out.print("종료 하시려면 'exit'를 입력해주세요: ");
            String out = sc.next();
            if (Objects.equals(out, "exit")){
                break;
            }
        }
    }
}
  1. Calculator 클래스에서 연산 수행 및 연산값 저장
    import java.util.ArrayList;
    import java.util.Objects;
    import java.util.Scanner;
    import java.util.List;
    
    

class Calculator {
private static List history = List.of();

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

//

//기능
public static 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;
    history.add(output);
    return result;
}
public List<String> getHistory() {
    return history;
}

}

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

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

    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(": ");
            }
        }

        result = Calculator.calculate(a, b, c);
        System.out.println("\n"+ a + c + b + "=" + result);

        System.out.print("최근 계산값: ");
        Calculator calculator = new Calculator();
        for (String history : calculator.getHistory()) {
            System.out.println(history);
        }

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

}

* 문제 1 : 
오류 발생 : `UnsupportedOperationException`

private static List history = List.of();

변경 불가능한 리스트로 생성
`List.of()`은 불변 리스트를 생성, `add()` 실행 시 예외 발생

this.history = new ArrayList<>();

변경 -> 정보 은닉 추가.

* 문제 2 :
최근 결과값의 출력이 이상
![](https://velog.velcdn.com/images/giwon_wg/post/f00057ea-3d7d-412d-9611-09c2ba4eecfc/image.png)
정상 출력 10 * 10 = 100
현재 출력 62 = 100

output = a + c + b + " = " + result;

`a + c + b`를 계산할때 `c`가 문자열이 아닌 연산자로 해석될 가능성

output = a + " " + c + " " + b + " = " + result;

`" "`추가로 숫자와 연산 기호 구분

---------------------
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);


        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 history; //정보 은닉

// 생성자
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;
    history.add(output);
    return result;
}

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

}

Code `main.java` 와 `Calculator.java`로 분리
`Calculator` 클래스에서 `private history` 와 `getHistory()`를 활용하여 데이터 보호

=> 캡슐화 까지 진행완료

'Project' 카테고리의 다른 글

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