본문 바로가기
BACK-END/JAVA

[자바] 계산기 과제 TIL

by codechu 2025. 4. 23.

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

  • [ ] 사칙연산을 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
    • [ ] 사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
    • [ ] 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
    • [ ] 1) 양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(➕,➖,✖️,➗) 기능을 수행한 후 2) 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
    • [ ] Lv 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정
      • [ ] 연산 수행 역할은 Calculator 클래스가 담당
        • [ ] 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장
      • [ ] 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다.
      • [ ] App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정 (캡슐화)
        • [ ] 간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현합니다. (Getter 메서드)
        • [ ] 간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현합니다. (Setter 메서드)
        • [ ] 위 요구사항을 모두 구현 했다면 App 클래스의 main 메서드에서 위에서 구현한 메서드를 활용 해봅니다.
        • 예시 코드
        • public class Calculator { /* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/ public 반환타입 calculate(...매개변수) { ... } /* Getter 메서드 구현 */ /* Setter 메서드 구현 */ } public class App { public static void main(String[] args) { /* Calculator 인스턴스 생성 */ Scanner sc = new Scanner(System.in); /* 반복문 시작 */ System.out.print("첫 번째 숫자를 입력하세요:"); int num1 = sc.nextInt(); System.out.print("두 번째 숫자를 입력하세요:"); int num2 = sc.nextInt(); System.out.print("사칙연산 기호를 입력하세요: "); char operator = sc.next().charAt(0); /* 위 요구사항에 맞게 소스 코드 수정 */ System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)"); ... /* 반복문 종료 */ } }
      • [ ] Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정
        • [ ] 키워드 : 컬렉션

 

 

 

 

더보기
더보기
더보기
package caculator;

import java.sql.SQLOutput;
import java.util.Scanner;
import java.util.InputMismatchException;
public class App {
    public static void main(String[] args) {

        Calculator calculator = new Calculator();

        Scanner sc = new Scanner(System.in);

            while (true) {
                try {
                System.out.println("첫 번째 정수를 입력해 주세요");
                int num1 = sc.nextInt();

                System.out.println("사칙연산 기호를 입력하세요");
                char op = sc.next().charAt(0);

                System.out.println("두 번째 정수를 입력해 주세요:");
                int num2 = sc.nextInt();

                  if (num2 == 0) {
                           System.out.println(" 0은 입력할 수 없습니다. 다시 입력해 주세요:");
                           num2 = sc.nextInt();

                  }

                int result = calculator.calculate(num1, num2, op);
                System.out.println("결과 값 :" + result);
                sc.nextLine();


               }catch(InputMismatchException e){
                System.out.println("숫자만 입력해주세요");
                sc.nextLine(); // 이거 없으면 무한 바복
               
            }
            System.out.println("더 계산하시겠습니까? 아무 글자나 입력해주세요.(exit 입력 시 종료)");
            String end = sc.nextLine();

            if (end.equals("exit")) {
                break;
            }

        }

        System.out.println("값 :" + calculator.getResult());
         calculator.removeResult();
        System.out.println("현재 값 :" + calculator.getResult());
         //calculator.clearResult();
       // System.out.println("값 초기화 :" + calculator.getResult());
    }
    }

 

 

package caculator; // 쓰일 멤버변수 // 사칙연산을 수행하는 메서드


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

public class Calculator {
  private List<Integer> results = new ArrayList<>();// 연산결과를 저장하는컬렉션 타입  필드 선언 및 생성


  public int calculate(int num1, int num2, char op) {
    int result;
    switch (op) {
      case '+':
        result = num1 + num2;
        results.add(result);//인덱스 넣기
        return result ;

      case '-':
        result = num1 - num2;
        results.add(result);
        return result;


      case '*':
        result = num1 * num2;
        results.add(result);
        return result ;

      case '/':
        if (num2!= 0) {
        result = num1 / num2;
        results.add(result);
        return result ;

        } else {
          System.out.println("0은 입력하실 수 없습니다.");

        }
      default  :
        throw new IllegalArgumentException("지원하지 않는 연산자입니다.");
    }

  }

  public List<Integer> getResult() {
    return results;
  }
  //public void clearResult(){ 값 초기화 메서드
  // results.clear();
  // }

  public void removeResult() {
    // 삭제된 값을 보여주기 위해 변수에 저장.
    if (!results.isEmpty()) {
      int removedValue = results.remove(0);
      System.out.println("삭제된 값 : " + removedValue);
      //먼저 입력된 값 삭제 list.remove(인덱스 번호)
    }
  }
}

 

트러블 슈팅 : 처음에 연산기호를 입력할 때 System.out.println("사칙연산 기호를 입력하세요");char op = sc.next(); 여기에서 자꾸 오류가 났다. 스캐너에서 사용자에게 입력을 받을때 보통 단어, 문장으로입력을 받지만 글자 하나만입력 받는 경우는 없기 때문에 난 오류라고 한다.

charAt()은 스캐너에서도 char타입의 문자를 받을 수 있도록 해준다. 그래서 

char op = sc.next().charAt(0); 사용자에게 입력받은글자중에 첫번째만(0번째 인덱스)에 것을 받아온다는 의미로 
charAt()을 사용했더니 문제해결이 되었음. (설명에 charAt())을 사용해 받으라고 했지만 정확하게 왜 안되는지가 궁금했음.