이시안 개발 블로그

BigDecimal로 간단한 사칙연산 계산기 만들기 본문

☕Java

BigDecimal로 간단한 사칙연산 계산기 만들기

ICAN 2022. 1. 10. 23:52

💻 문제

사수님이 내준 과제로 Java의 변수, 연산자, 제어문 등을 활용해서 만들수 있는 매우 사소한 미니 프로젝트였습니다.

조건은 다음과 같았습니다.

  • 사칙연산 (+, -, *, /)가 가능할 것
  • 소수값을 정밀하게 계산해서 반환할 수 있을 것
  • 원할 때 종료할 수 있을 것

원할 때 종료하는 것이야 while문 탈출용 트리거를 쓰면 되겠지만 소수값을 정밀하게 얻는 것은 자바의 double 타입으로는 불가능한 것이었습니다. 자바의 실수 타입인 float과 double은 이진수의 근사치를 저장하기 때문에 정확한 값을 산출할 수 없습니다.

 

하지만 자바에는 BigDecimal이라는 아주 유용한 것이 있습니다.

📚 BigDecimal이란?

BigDecimal은 자바가 제공하는 API java.math에 포함되어 있는 클래스입니다.

BigDecimal num = new BigDecimal("3.14");

위 코드처럼 문자열로 생성할 수 있으며 문자열은 자바의 기본타입보다 더 넓은 범위의 수를 작성할 수 있습니다.

 

BigDecimal add(BigDecimal augend)
BigDecimal subtract(BigDecimal subtrahend)
BigDecimal multiply(BigDecimal multiplicand)
BigDecimal divide(BigDecimal divisor)

BIgDecimal이 제공하는 기본 사칙연산 메서드로 BigDeicmal 타입의 매개변수를 받아서 BigDecimal로 반환합니다.

이 클래스를 이용하여 소수점 계산까지 정밀한 값을 얻어낼 수 있었습니다.

 

📖 소스코드

Calculation 클래스

public class Calculation {
    public BigDecimal calculating(String operations) {

        String[] arr = splitOperations(operations);

        try {
            // 숫자가 아니면 예외 발생
            BigDecimal num1 = new BigDecimal(arr[0]);
            BigDecimal num2 = new BigDecimal(arr[2]);

            switch (arr[1]) {
                case "+":
                    return num1.add(num2);
                case "-":
                    return num1.subtract(num2);
                case "*":
                    return num1.multiply(num2);
                case "/":
                    return num1.divide(num2);
                default:
                    throw  new Exception();
            }
        } catch (Exception e) {
            System.out.println("잘못 입력하셨습니다. 다시 입력해주세요");
            return null;
        }
    }

    public String[] splitOperations(String operations){
        
        // 문자열 쪼개서 배열로 담기
        return operations.split(" ");
    }
}

사칙연산을 맡은 Calculation 클래스입니다.

calculating 메서드는 매개값으로 문자열을 받고 그 문자열을 쪼개는 splitOpertations 메서드를 호출하여 문자열 배열을 반환받습니다. 문자열 배열의 0번 인덱스와 2번 인덱스는 숫자, 1번 인덱스는 산술 연산자가 들어있습니다.

만약 숫자가 아니라면 NumberFormatException이 발생하게 되는데 그냥 Exception으로 다 잡도록 했습니다.

 

switch문은 산술 연산자를 확인해서 해당 사칙연산에 맞는 계산을 하도록 하였고 엉뚱한 값이 들어왔다면 잘못입력했다는 예외를 반환하도록 했습니다.

 

Calculator 클래스

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

        System.out.println("계산기 작동 중...");
        while (true) {
            System.out.println("=============================");
            System.out.println("계산을 원하는 식을 입력해주세요.\n종료를 원하시면 exit를 입력해주세요.");
            System.out.println("ex) 1 * 3");
            System.out.println("=============================");

            String str = sc.nextLine();

            // 탈출 트리거
            if (str.equals("exit")) {
                System.out.println("계산기를 종료합니다.");
                break;
            }

            BigDecimal result = cal.calculating(str);

            // 정상 작동 시 결과 반환
            if(result != null){
                System.out.println("결과 = " + result);
            }
        }
    }
}

실행 메서드를 가진 Calculator 클래스는 Scanner로 입력값을 받게 했고 while문으로 계속해서 계산을 하도록 작성했습니다. 사용자가 exit를 입력하면 반복문을 종료하도록 했고 입력한 문자열을 calculating의 매개값으로 전달하여 호출하여 결과값을 출력하도록 했습니다.

☄️ 결과

콘솔 결과

제가 원하는 결과가 잘 나왔습니다.

자바를 좀 더 이해할 수 있는 간단한 과제였습니다.

 

참고
BigDecimal (Java Platform SE 8 ) (oracle.com)

'☕Java' 카테고리의 다른 글

외부 API를 이용해서 JSON 데이터 다뤄보기  (0) 2022.02.09
멀티 스레드의 임계 영역  (1) 2022.01.19
Comments