Ch2 계산기 과제 Lv2.

728x90

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

  • Lv2.java
더보기
package Lv2;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Lv2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Calculator calculator = new Calculator();
        while (true) {
            int num1 = 0;
            int num2 = 0;
            boolean validInput = false;

            // 양의 정수 입력받기
            while (!validInput) {
                try {
                    System.out.print("양의 정수를 입력해주세요(1/2):");
                    num1 = scanner.nextInt(); // 첫 번째 정수 입력
                    if (num1 < 0) {
                        System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
                    } else {
                        validInput = true; // 유효한 입력
                    }
                } catch (InputMismatchException e) {
                    System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
                    scanner.next();
                }
            }
            validInput = false; // 루프용 boolean 초기화
            while (!validInput) {
                try {
                    System.out.print("양의 정수를 입력해주세요(2/2):");
                    num2 = scanner.nextInt(); // 두 번째 정수 입력
                    if (num2 < 0) {
                        System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
                    } else {
                        validInput = true; // 유효한 입력
                    }
                } catch (InputMismatchException e) {
                    System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
                    scanner.next();
                }
            }
            validInput = false; // 루프용 boolean 초기화
            scanner.nextLine(); // 남아있는 줄바꿈 제거

            // 사칙연산 기호 입력받기
            while (!validInput) {
                System.out.print("사칙연산 기호를 입력해주세요(+-*/):");
                String operator = scanner.nextLine();
                // 확인 후 연산하기
                if (operator.equals("+") || operator.equals("-") || operator.equals("*")) {
                    calculator.calculate(operator, num1, num2); // calculator 클래스 활용
                    validInput = true;
                    break;
                } else if (operator.equals("/")) {
                    if (num2 == 0) {
                        System.out.println("0으로 나눌 수 없습니다. 다시 입력해주세요.");
                    } else {
                        calculator.calculate(operator, num1, num2);
                        validInput = true;
                    }
                } else {
                    System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
                }
            }

            // 결과 출력하기
            calculator.getAnswer();

            // exit 입력시 루프 탈출
            System.out.print("계속 하시겠습니까?(종료:exit):");
            String exit = scanner.nextLine();
            if (exit.equalsIgnoreCase("exit")) { // 대소문자 구분 없이 처리
                System.out.println("프로그램을 종료합니다. 감사합니다!");
                break;
            }
        }
        scanner.close();
    }
}

 

 

  • Calculator.java
더보기
package Lv2;

import java.util.LinkedList;
import java.util.Queue;

public class Calculator {
    // 연산 결과 저장
    private int num1 = 0;
    private int num2 = 0;
    String operator = "";
    private double answer = 0;
    private Queue<Double> data = new LinkedList<>();

    // 연산 수행
    public void calculate(String operator, int num1, int num2) {
        this.operator = operator;
        this.num1 = num1;
        this.num2 = num2;
        if (operator.equals("+")) {
            plus();
        } else if (operator.equals("-")) {
            minus();
        } else if (operator.equals("*")) {
            mul();
        } else {
            div();
        }
    }

    private void plus() {
        answer = num1 + num2;
    }

    private void minus() {
        answer = num1 - num2;
    }

    private void mul() {
        answer = num1 * num2;
    }

    private void div() {
        answer = num1 / num2;
    }

    // 연산 출력
    public void getAnswer() {
        if (data.isEmpty()) { // 큐 데이터
            System.out.println("결과:" + answer);
            data.add(answer); // 비어있으면 값 추가함
        } else {
            data.remove(); // 비어있지 않으면 값 제거함
        }
    }
}

Lv 2. 의 과제는 연산을 수행하고, 결과를 컬렉션에 저장하고, 반환하는 메서드가 있는 Calculator 클래스를 구현하는 것입니다. 사실상 Lv 1. 과제에 연산하는 부분만 Calculator 클래스로 옮기고 결과를 컬렉션에 저장 및 제거하기만 하는 기능을 추가하는 거라 크게 어렵지 않았습니다. 다만 Getter, Setter 메서드를 제대로 활용하지 못한 것 같습니다.

Getter, Setter

두 메서드를 사용하면 Lv2 클래스에 입력한 값을 Caclulator 클래스로 가져가고, 이를 통해 계산을 할 수 있습니다. 근데 사칙연산 기호를 입력받은 후 연산할 때 클래스에 인자를 직접 가져갑니다. calculate(operator, num1, num2)로 가져가서 사실상 Calculator 클래스에 num1과 num2를 Setter로 가져가도 활용할 수가 없습니다.

Getter은 calculate 메서드를 통해 저장된 answer 값을 Lv2 클래스로 가져가 결과를 출력할 수 있습니다. 하지만 굳이 이것도 Lv2 클래스에서 수정하게 두고싶지 않아 Calculator 클래스 내에서 해결하도록 만들었습니다.

Queue

Queue 클래스는 데이터 컬렉션 타입 중 하나로, 선입후출의 특징을 가지고 있습니다. 과제의 요구사항인 가장 먼저 저장된 데이터를 삭제하는 기능은 Queue를 사용하는 것이 좋습니다. 여기에서는 그냥 간단하게 getAnswer 메서드를 통해 값을 출력할 때 단순하게 비어있으면 값을 추가하고, 비어있지 않으면 값을 제거하도록 만들었습니다. 이에 대한 활용 방안은 더 있었지만(ex. 값 나열, 추가할지 말지 선택) 불의의 사고로 Lv2. 과제를 세 번 만들게 되어 Lv3. 과제에 좀 더 힘을 주기로 했습니다.

728x90
반응형
LIST

'Sparta' 카테고리의 다른 글

Ch2 키오스크 과제 트러블 슈팅  (0) 2024.11.28
Ch2 계산기 과제 Lv3.  (0) 2024.11.18
Ch2 계산기 과제 Lv1.  (0) 2024.11.18
TIL(Today I Learned)_24.11.04.mon  (0) 2024.11.04
TIL(Today I Learned)_24.11.02.Sat  (0) 2024.11.02