🌐 github 주소
https://github.com/JoeMinKyung/java_Calculator
Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있습니다.
양의 정수는 각각 하나씩 전달 받습니다.
양의 정수는 적합한 타입으로 선언한 변수에 저장합니다.
예시 코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력하세요: ");
// Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
System.out.print("두 번째 숫자를 입력하세요: ");
// Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
}
}
Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있습니다.
사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다. (charAt(0))
예시 코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
...
System.out.print("사칙연산 기호를 입력하세요: ");
// 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다.
}
}
키워드 : if switch
사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행합니다.
입력받은 연산 기호를 구분하기 위해 제어문을 사용합니다. (예를 들면 if, switch)
연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력합니다.
예시 코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
...
int result = 0;
/* 제어문을 활용하여 위 요구사항을 만족할 수 있게 구현합니다.*/
System.out.println("결과: " + result);
}
}
키워드 : 무한으로 반복, 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하며 수정)
반복문을 사용합니다. (예를 들어, for, while…)
예시 코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/* 반복문 사용 해서 연산을 반복 */
...
System.out.println("결과: " + result);
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
/* exit을 입력 받으면 반복 종료 */
}
}
💻 정답 코드
package com.example.calculator;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 반복문 실행
while (true) {
int firstNum, secondNum;
// 첫번째 숫자 입력받기
while (true) {
// 양의 정수(0 포함)를 입력 받기
System.out.print("첫 번째 숫자를 입력하세요: ");
String input = sc.next();
// 정수 입력 확인
try {
firstNum = Integer.parseInt(input); // 문자열을 정수로 변환
// 양의 정수 입력 확인
if (firstNum >= 0) {
break; // 양의 정수이면 반복 종료
} else {
System.out.println("양의 정수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("유효한 정수를 입력해주세요.");
}
}
// 두번째 숫자 입력받기
while (true) {
// 양의 정수(0 포함)를 입력 받기
System.out.print("두 번째 숫자를 입력하세요: ");
String input = sc.next();
// 정수 입력 확인
try {
secondNum = Integer.parseInt(input); // 문자열을 정수로 변환
// 양의 정수 입력 확인
if (secondNum >= 0) {
break; // 양의 정수이면 반복 종료
} else {
System.out.println("양의 정수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("유효한 정수를 입력해주세요.");
}
}
// 사칙연산 기호 유효성 체크
char operator;
while (true) {
System.out.print("사칙연산 기호를 입력하세요: ");
operator = sc.next().charAt(0);
if (operator == '+' || operator == '-' || operator == '*' || operator == '/') {
break;
} else {
System.out.println("잘못된 사칙연산 기호입니다. 다시 입력해주세요.");
}
}
// 연산 수행하기
int result = 0; // 연산 결과 값 저장 변수
boolean validOperation = true; // 사칙 연산 수행 실패 시 결과를 출력하지 않도록 설정하는 변수
switch (operator) {
case '+':
result = firstNum + secondNum;
break;
case '-':
result = firstNum - secondNum;
break;
case '*':
result = firstNum * secondNum;
break;
case '/':
if (secondNum == 0) {
System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
validOperation = false;
} else {
result = firstNum / secondNum;
}
break;
}
// 연산 결과 출력하기
if (validOperation) {
System.out.println("결과: " + result);
}
// 반복 여부 확인하기
System.out.println("더 계산하시겠습니까? 아무 키나 입력해주세요. (exit 입력 시 종료)");
String continueText = sc.next();
if (continueText.equals("exit")) {
break;
}
}
}
}
💡 코드 해설
public class Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calculator 클래스는 간단한 사칙연산 계산기를 실행한다.
Scanner 객체는 사용자 입력을 받기 위해 사용된다.
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
String input = sc.next();
try {
firstNum = Integer.parseInt(input);
if (firstNum >= 0) {
break;
} else {
System.out.println("양의 정수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("유효한 정수를 입력해주세요.");
}
}
사용자가 숫자를 입력할 때:
Integer.parseInt(input)로 문자열을 정수로 변환.
입력값이 양의 정수인지 검사 (firstNum >= 0).
예외 처리: NumberFormatException 발생 시 숫자가 아닌 입력값을 감지하여 에러 메시지를 출력.
while (true) {
System.out.print("두 번째 숫자를 입력하세요: ");
String input = sc.next();
try {
secondNum = Integer.parseInt(input);
if (secondNum >= 0) {
break;
} else {
System.out.println("양의 정수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("유효한 정수를 입력해주세요.");
}
}
첫 번째 숫자 입력과 동일한 로직.
두 번째 숫자도 양의 정수만 허용.
while (true) {
System.out.print("사칙연산 기호를 입력하세요: ");
operator = sc.next().charAt(0);
if (operator == '+' || operator == '-' || operator == '*' || operator == '/') {
break;
} else {
System.out.println("잘못된 사칙연산 기호입니다. 다시 입력해주세요.");
}
}
사용자가 입력한 사칙연산 기호(+, -, *, /)가 유효한지 확인.
유효하지 않은 경우 에러 메시지를 출력하고 다시 입력받음.
int result = 0;
boolean validOperation = true;
switch (operator) {
case '+':
result = firstNum + secondNum;
break;
case '-':
result = firstNum - secondNum;
break;
case '*':
result = firstNum * secondNum;
break;
case '/':
if (secondNum == 0) {
System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
validOperation = false;
} else {
result = firstNum / secondNum;
}
break;
}
switch 문으로 입력된 연산자를 확인하고, 해당 연산을 수행.
나눗셈 연산 시 분모가 0인 경우 오류 메시지 출력 후 연산을 중단 (validOperation = false).
if (validOperation) {
System.out.println("결과: " + result);
}
System.out.println("더 계산하시겠습니까? 아무 키나 입력해주세요. (exit 입력 시 종료)");
String continueText = sc.next();
if (continueText.equals("exit")) {
break;
}
사용자에게 프로그램 종료 여부를 묻기.
exit를 입력하면 반복문을 종료하고 프로그램 종료.
operator = sc.next().charAt(0);1. sc.next()
Scanner 객체인 sc를 사용하여 입력된 문자열(공백 이전까지)을 읽는다.
반환 값은 String 타입이다.
예를 들어, 사용자가 +를 입력하면 "+"라는 문자열이 반환된다.
2. charAt(0)
String 클래스의 메서드로, 문자열에서 지정된 인덱스(0)에 해당하는 문자를 반환한다.
인덱스는 0부터 시작하므로 charAt(0)은 문자열의 첫 번째 문자를 가져온다.
예를 들어, 문자열 "+"에서 charAt(0)은 '+'를 반환한다.
3. operator
char 타입 변수 operator에 charAt(0)의 반환 값을 저장합니다.
결과적으로 operator는 사용자가 입력한 문자열의 첫 번째 문자를 저장한다.
💥 트러블 슈팅
1. 숫자 이외의 입력 처리
문제: 사용자가 숫자 대신 문자나 기호를 입력하면 프로그램이 비정상 종료.
해결: try-catch 블록을 추가하여 NumberFormatException을 처리.
2. 분모가 0인 경우 나눗셈 오류
문제: 0으로 나누려 하면 ArithmeticException이 발생.
해결: 나눗셈 연산 전에 if (secondNum == 0)로 검사하고 에러 메시지를 출력.
3. 잘못된 연산 기호 처리
문제: 지원하지 않는 연산 기호를 입력하면 계산이 실행되지 않음.
해결: 연산 기호를 입력받을 때 유효성 검사를 수행.
4. 프로그램 종료 흐름
문제: exit 이외의 입력이 반복적으로 종료 메시지를 표시.
해결: if 조건으로 정확히 "exit"만 처리하여 중단.
✍ 고민 및 어려웠던 부분
// 첫번째 숫자 입력받기
while(true){
String input = sc.next();
try {
firstNum = Integer.parseInt(input); // 문자열을 정수로 변환
if (firstNum >= 0) {
break; // 양의 정수이면 반복 종료
} else {
System.out.println("양의 정수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("유효한 정수를 입력해주세요.");
}
}
😮 입력받는 부분 예외처리를 구현할 때 고민이 있었다. 사용자 입력이 무조건 숫자라는 조건으로 구현한다면 간단하겠지만, 문자까지 처리하고 싶었다.
처음에는nextInt()로 입력을 받고 예외처리를 하려고 했는데, 단순 문자면 상관이 없었지만 문자열일 경우 (예를 들어 'abccc') 잘못된 입력이 버퍼에 남아 있어sc.next()로 버퍼에서 제거해줘야했다. 그래서 그냥 처음부터 입력을next()로 받고 문자열을 정수로 변환해주기로 했다. (문자를 아스키코드의 숫자로 변환하는 것은 아님)
피드백을 받을 때 튜터님이nextInt()로 받아도 될 거 같다고 하셨는데 위의 고민 내용을 말하는 것을 까먹어서 이렇게 기록을 남긴다!!..