[내일배움캠프 Spring_3기] CH2 계산기 과제 Step1

jiiim_ni·2026년 1월 9일
post-thumbnail

오늘은 CH2 Java 계산기 과제를 해보았다.
저번 주, 어제 틈틈히 Java 강의를 들어서 오늘 바로 과제를 진행할 수 있었다.


과제 Intro

클래스를 사용하지 않는 계산기:

필수 [STEP 1] : 클래스 없이 자바의 기본 문법만을 사용하여 구현한 계산기

클래스를 활용한 계산기:

필수 [STEP 2] : 객체 지향 개념을 적용하여 클래스 정의, 연산을 수행하는 메소드 작성한 계산기

도전 [STEP 3] : Java의 Enum, 제네릭, 람다 & 스트림을 적용한 계산기


0단계(개발환경 세팅)

  • IntelliJ IDEA 사용
  • 새 Java 프로젝트 생성 -> 패키지 및 클래스 추가 -> 기본 코드 작성

Hello, Calculator! 잘 출력 되는 모습


생각해보기

이번 과제를 받고 단순히 기능을 구현하는 것보다
어떻게 접근하고 설계하는지가 더 중요한 과제
라는 느낌을 받았다.

그래서 바로 시작하기 보다는
어떻게 풀어나갈지를 정리해보기로 했다.

  1. 요구사항 정의
    단순한 사칙연산 계산기가 아니라,
    괄호와 제곱, 제곱근까지 사용할 수 있는 계산기를 목표로 설정했다.
  • 기본 사칙연산: 덧셈, 뺄셈, 곱셈, 나눗셈
  • 괄호를 이용한 연산 우선순위 처리
  • 제곱 연산(^)과 제곱근(sqrt)
  • 공백이 포함된 수식도 입력 가능

사용자 인터페이스는 콘솔 기반으로 결정했다.
이번 과제의 필수 목표는 계산 로직 자체에 있다고 생각이 되어 우선은 콘솔에서 수식을 입력받고 결과를 출력하는 방식으로 진행할 것이다.
추후에 GUI로 구현하는 것도 해볼 예정이다.

또한 계산기에서 발생할 수 있는 예외 상황도 함께 고려했다.
특히 0으로 나누는 경우나 잘못된 수식이 입력되는 경우에는
프로그램이 종료되지 않고,
오류 메시지를 출력한 뒤 다시 입력을 받을 수 있도록 처리하고 싶었다.

  1. 설계
    입력과 출력은 main 메서드에서 담당하고, 실제 계산과 관련된 로직은 별도의 Calculator 클래스에서 처리하도록 나눌 계획이다.

각 연산은 메서드 단위로 분리해 하나의 메서드가 하나의 역할만 하도록 구현하려고 한다.
이렇게 하면 코드가 길어지더라도 가독성을 유지할 수 있고, 이후 기능을 추가하거나 수정하기도 쉬울 것이라 생각했다.

특히 괄호와 연산자 우선순위를 처리해야 하기 때문에,
단순히 if/else로 계산하는 방식 보다는
문자열 형태의 수식을 해석해서 계산하는 구조로 설계하는 것이 필요하다고 판단했다.

  • 필수과제에서는 콘솔 기반 계산기를 완성하는 것을 목표로 한다.
    계산 로직을 중심으로 구현하면서, 요구사항에 맞는 기능과 예외 처리를 먼저 안정적으로 완성한다.
  • 도전과제에서는 필수과제에서 구현한 계산 로직을 기반으로,자바에서 배운 개념들을 실제로 적용해 구조를 개선해보고자 한다.
    연산자 타입은 Enum으로 관리하고, 계산기는 제네릭을 적용해 정수뿐 아니라 실수 타입의 연산도 처리할 수 있도록 확장한다.
    또한 연산 결과 조회 기능은 람다와 스트림을 활용해 구현할 예정이다.
    추가적으로, 계산 로직은 그대로 유지한 채 입력과 출력 부분만 GUI로 확장하여 콘솔 계산기를 GUI 계산기로 재사용해보는 것도 도전해볼 계획이다.

Step 1 구현 방향

Step 1에서는 클래스 없이 기본적인 연산을 수행하는 계산기를 만드는 것이 목표였기 때문에, 별도의 Calculator 클래스를 만들지 않고 App 클래스의 main 메서드 안에서 모든 기능을 구현했다.
또한 계산기가 한 번 계산하고 끝나는 구조가 아니라, 사용자가 종료를 입력하기 전까지 계속 계산할 수 있어야 하므로 전체 로직을 반복문 안에 넣는 방식으로 구성했다.

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (true) {
            // 입력 → 연산 → 출력 → 종료여부 확인
        }
    }
}
  • Calculator 클래스를 만들지 않고 main 안에 구현
  • while(true)로 exit전까지 계속 반복

입력 처리 방식

사용자 입력은 Scanner를 사용해 받았다.
숫자 입력은 nextInt()로 두 번 받아 각각 num1, num2에 저장했고, 연산자는 문자열로 입력받은 뒤 charAt(0)을 사용해 첫 글자만 char로 가져왔다.
이렇게 하면 사용자가 + 같은 기호를 입력했을 때 조건문에서 쉽게 비교할 수 있다.

System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt();

System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt();

System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): ");
char operator = sc.next().charAt(0);
  • 숫자 - nextInt()로 각각 입력
  • 연산자 - next()로 문자열 입력 -> charAt(0)으로 첫글자만 char로 사용

연산 처리 방식(switch 사용)

연산자에 따라 다른 계산을 수행해야 하므로 switch문을 사용했다.
+, -, *, / 각각의 케이스에서 연산을 수행하고 결과를 result 변수에 저장한다.
switch를 사용하면 연산자에 따른 분기가 한눈에 보이고, if-else 체인보다 가독성이 좋다고 판단했다.

int result = 0;
boolean isValid = true;

switch (operator) {
    case '+':
        result = num1 + num2;
        break;
    case '-':
        result = num1 - num2;
        break;
    case '*':
        result = num1 * num2;
        break;
    case '/':
        // 나눗셈 예외처리는 아래 “예외 처리” 파트 참고
        break;
    default:
        System.out.println("지원하지 않는 연산자입니다.");
        isValid = false;
}
  • switch로 연산자별 분기
  • 결과는 result에 저장
  • 정상 여부는 isValid로 관리

예외 처리(0으로 나누기 / 잘못된 연산자)

나눗셈의 경우 두 번째 숫자가 0이면 오류가 발생할 수 있으므로, / 케이스에서 num2 == 0인지 먼저 검사했다.
0으로 나누는 상황에서는 프로그램이 종료되지 않도록 오류 메시지를 출력하고, 결과 출력은 하지 않도록 isValid라는 플래그 변수를 사용했다.

또한 ₩+ - * /₩외의 문자가 입력될 수 있기 때문에 default 케이스에서 "지원하지 않는 연산자" 메시지를 출력하도록 처리했다.

case '/':
    if (num2 == 0) {
        System.out.println("나눗셈 연산에서 분모(두 번째 숫자)에 0이 입력될 수 없습니다.");
        isValid = false;
    } else {
        result = num1 / num2;
    }
    break;
  • / 케이스에서 num2 == 0 먼저 검사
  • 0이면 오류 메시지 출력 + isValid=false
  • 0이 아니면 정상 나눗셈 수행
default:
    System.out.println("지원하지 않는 연산자입니다.");
    isValid = false;
        • / 외 문자가 들어오면 default로 처리
  • 계산 결과 출력은 막기 위해 isValid=false

Step1 전체코드

package com.example.calculator.step1;

import java.util.Scanner;

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

        // Scanner: 콘솔로부터 입력을 받기 위한 도구
        Scanner sc = new Scanner(System.in);

        // while(true): 무한 반복(계산을 계속 진행하기 위해)
        // 사용자가 "exit"을 입력하면 break로 반복을 끝낸다.
        while (true) {

            // 1) 첫 번째 숫자 입력 받기
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1 = sc.nextInt(); // 사용자가 입력한 정수를 num1에 저장

            // 2) 두 번째 숫자 입력 받기
            System.out.print("두 번째 숫자를 입력하세요: ");
            int num2 = sc.nextInt(); // 사용자가 입력한 정수를 num2에 저장

            // 3) 사칙연산 기호 입력 받기
            // sc.next()는 문자열(String)로 입력을 받음
            // charAt(0)은 그 문자열의 첫 번째 글자를 char로 가져옴
            System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): ");
            char operator = sc.next().charAt(0);

            // 결과를 담을 변수, 초기값 0
            int result = 0;

            // 정상 연산 여부를 표시하는 변수
            // 0으로 나누기 / 지원하지 않는 연산자 등의 상황에서 false로 바꿈
            boolean isValid = true;

            // 4) 연산자에 따라 다른 계산을 수행하기 위해 switch 사용
            switch (operator) {
                case '+':
                    result = num1 + num2;
                    break;

                case '-':
                    result = num1 - num2;
                    break;

                case '*':
                    result = num1 * num2;
                    break;

                case '/':
                    // 나눗셈은 두 번째 숫자가 0이면 오류가 발생하므로 예외 처리
                    if (num2 == 0) {
                        System.out.println("나눗셈 연산에서 분모(두 번째 숫자)에 0이 입력될 수 없습니다.");
                        isValid = false; // 정상 연산이 아니므로 결과를 출력하지 않게함
                    } else {
                        result = num1 / num2; // int 나눗셈이므로 소수점은 버려짐
                    }
                    break;

                default:
                    // + - * / 가 아닌 다른 문자를 입력한 경우
                    System.out.println("지원하지 않는 연산자입니다.");
                    isValid = false;
            }

            // 5) 정상 연산일 때만 결과 출력
            if (isValid) {
                System.out.println("결과: " + result);
            }

            // 6) 계속 계산할지 종료할지 입력 받기
            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            String answer = sc.next(); // exit 입력 여부 확인

            // 7) exit이면 반복문 종료
            if (answer.equals("exit")) {
                System.out.println("계산기를 종료합니다.");
                break;
            }

            // exit이 아니면 while문이 다시 반복되면서 다음 계산을 진행
        }

        // Scanner 닫기: 프로그램 종료 직전에 닫아주면 좋음
        sc.close();
    }
}

결과

  • 기본적인 사칙연산이 모두 정상적으로 동작하는 것을 확인했다.
    각 연산 결과가 올바르게 출력되었고, 잘못된 연산자 입력이나 0으로 나누는 경우에도 프로그램이 종료되지 않고 예외 메시지를 출력하도록 구현했다.

0개의 댓글