Project

[Project]Calculator_1

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

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

  1. 최소 사칙연산이 가능할것

    • $+$ , $-$ , $*$ , $/$ + $a$
  2. 양의 정수(0 포함)을 입력 받기

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

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

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

    • for or while
import java.util.Objects;
import java.util.Scanner;

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

        int a = 0;
        int b = 0;
        int result = 0;
        String 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){
                c = sc.next();
                if(c.equals("+") || c.equals("-") || c.equals("*") || c.equals("/")){
                    break;
                } else{
                    System.out.println("잘못된 값을 입력하였습니다. 다시 입력해주세요");
                    System.out.print(": ");
                }
            }



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

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

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

if(out == "exit")if(Objects.equals(out, "exit")) 의 차이

  1. if (out == "exit") -> 주소 비교

    1. == 연산자는 메모리 주소를 비교

    2. outexit이 동일한 객체(메모리 주소)를 가리킬 때만 true

    3. 문자열 리터럴(exit)은 JVM의 string Pool에 저장됨으로 ture일 가능성이 크다.

      But. 새로운 String exit을 생성하면 false이 됨

      예시

      String out1 = "exit"; // String Pool에 저장됨
      String out2 = new String("exit"); // 새로운 객체 생성
      

System.out.println(out1 == out2); // false (참조 주소가 다름)

2. `if(Obhects.equals(out, "exit"))` -> 값 비교
    1. `Objects.equals(out, "exit"`은 내부적으로 `out == "exit"`를 먼저 체크한 후 `out.equals("exit")`를 실행
    2. 값 자체가 동일하면 `true`