일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MySQL
- VueDevTools
- Junit5
- 스프링
- Java
- 이벤트루프
- Vue
- 한빛미디어
- 이것이자바다
- AWS 비용 최적화 바이블
- 도메인 주도 개발 시작하기
- Git
- 백준
- pinia
- JavaScript
- GitHub
- 2817
- 1436
- 알고리즘
- 러닝GO
- 헤드퍼스트 디자인패턴
- 네트워크
- vue-router
- 혼공컴운
- 구글 엔지니어는 이렇게 일한다
- 자바스크립트
- WebTestClient
- cicd
- 이것이안드로이드다
- HTTP
- Today
- Total
이시안 개발 블로그
BigDecimal로 간단한 사칙연산 계산기 만들기 본문
💻 문제
사수님이 내준 과제로 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 |