(Java) 계산기 프로그램 만들기 - Lv 2

Yong Lee·2025년 3월 4일

계산기

목록 보기
2/4

계산기


개요

이 프로젝트는 자바로 계산기 프로그램을 만드는 것입니다.
이 프로젝트는 level이 나뉘어져 있으며, level이 올라갈수록 백엔드 개발자스러운 코드로 변할 예정입니다.
현재 블로그는 level 1에서 했던 계산기 프로그램에서부터 시작하여 level2 형태로 변형한 것입니다.


조건

Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기

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

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

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

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

    • 키워드 : 컬렉션
      • 컬렉션에서 ‘값을 넣고 제거하는 방법을 이해한다.’가 중요합니다!

Code!

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

Trouble!

setter로만 데이터를 가져올 수 있게 캡슐화를 하였고, 결과 값을 getter로 사용할 수 있게 했습니다.
부족한점이 많지만 이렇게 함으로써 캡슐화가 되었고, private으로 다른 값들은 모르는 상태로 결과만 추출할 수 있는 클래스를 만들었습니다.

추가적으로, LinkedList를 활용하여 데이터를 저장하였습니다.
조건에서 저장된 값 중 앞에서부터 없어져야하기 때문에 node로 연결된 linkedlist를 활용한다면 시간복잡도가 O(1)이 되기 때문에 이 방식으로 결정하였습니다.


Print!

profile
오늘은 어떤 새로운 것이 나를 즐겁게 할까?

0개의 댓글