첫 개인 프로젝트라 문법 이해와 학습을 위해 코드마다 메모처럼 주석처리를 했다. 나중에 익숙해진 문법들부터 차차 주석 제거 예정이다
요구사항 체크리스트 ⬜✅ :
양의 정수(0 포함)를 입력받기
✅ Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있다.
✅ 양의 정수는 각각 하나씩 전달 받는다.
✅ 양의 정수는 적합한 타입으로 선언한 변수에 저장한다.
사칙연산 기호(➕,➖,✖️,➗)를 입력받기
✅ Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있다.
✅ 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장한다.(charAT(0))
위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력하기
✅ 사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행한다.
✅ 입력받은 연산 기호를 구분하기 위해 제어문을 사용한다. (if switch)
✅ 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력한다.
반복문을 사용하되, 반복의 종료를 알려주는 "exit" 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드 수정하기
✅ 반복문 사용하기 (for while)
✅ 무한으로 반복 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하도록 수정)
코드를 한 번에 모두 작성한 뒤에 문제점 발견 및 수정 하려면 어디서부터 어느 부분이 문제인지 초보인 나로서는 아직 찾기도, 수정하기도 어려울 것 같아 그때 그때 바로 확인하면서 메모해두었다가 수정하면서 코딩했다
숫자 입력받는 부분에서 num1 = 0 으로 초기값 설정했더니 0 입력시에 다음 입력받기로 넘어가지 않고 첫 번째 숫자를 입력하라는 문구 반복 출력 → num1 = -1 로 수정해서 해결
사칙연산 기호를 char 타입으로 선언한 변수에 저장
사칙연산에서 연산 기호랑 다른 문자 함께 입력 시의 상황 대처 없음
(예) -5, +3, *f 등등
// 사칙연산 입력받기
char AddSubMulDiv = ' '; // 변수 선언 (이미 메서드 내에서 선언됨)
boolean validAddSubMulDiv = false;
while (!validAddSubMulDiv ) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
AddSubMulDiv = scanner.next().charAt(0); // 여기서 다시 선언하지 않고 값을 할당만 합니다.
// 입력값이 사칙연산 기호인지 체크
if (AddSubMulDiv == '+' || AddSubMulDiv == '-' || AddSubMulDiv == '*' || AddSubMulDiv == '/') {
validAddSubMulDiv = true; // 유효한 연산자면 루프 종료
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
➡️➡️➡️
// 사칙연산 입력받기
char AddSubMulDiv = ' '; // 초기화
boolean validAddSubMulDiv = false;
while (!validAddSubMulDiv) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
String operatorInput = scanner.next();
if (operatorInput.length() == 1 &&
(operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
validAddSubMulDiv = true;
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}

➡️➡️➡️
양의 정수 아니라서가 아니라 어디서 잘못된건지 아예 연산 안됨

➡️➡️➡️
AddSubMulDiv 변수는 사칙연산 기호를 저장하기 위해 선언되었다. 하지만, operatorInput 변수에서 사용자가 입력한 연산자를 AddSubMulDiv에 할당해주지 않아서 발생했던 오류
// 사칙연산 입력받기
char AddSubMulDiv = ' '; // 초기화
boolean validAddSubMulDiv = false;
while (!validAddSubMulDiv) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
String operatorInput = scanner.next();
if (operatorInput.length() == 1 &&
(operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
AddSubMulDiv = operatorInput.charAt(0); // 연산자를 변수에 할당
validAddSubMulDiv = true;
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}

// 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
int num1 = -1;
while (num1 < 0) {
System.out.println("첫 번째 숫자를 입력하세요: ");
num1 = scanner.nextInt();
if (num1 < 0) {
System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
}
}
➡️➡️➡️
// 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
boolean validNum1 = false;
int num1 = -1;
while (!validNum1) {
System.out.println("첫 번째 숫자를 입력하세요: ");
num1 = scanner.nextInt();
if (num1 >= 0) {
validNum1 = true;
} else {
System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
}
}
이 과정에서 while, if문을 더 이해하게 되었지만, 전자의 코드가 더 간략해서 다시 재수정
package firstproject;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Calculator calculator = new Calculator();
while (true) { // "exit"를 입력하기 전까지 계속 반복
// 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
int num1 = -1;
while (num1 < 0) { // 0 미만이면 루프 반복하기
System.out.println("첫 번째 숫자를 입력하세요: ");
num1 = scanner.nextInt(); // num1에 값 입력받기
scanner.nextLine(); // 버퍼 비우기
if (num1 < 0) {
System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요."); // 0 미만이면 메시지 출력하기
}
}
// 사칙연산 입력받기
char AddSubMulDiv = ' '; // 초기화
boolean validAddSubMulDiv = false;
while (!validAddSubMulDiv) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
String operatorInput = scanner.next(); // 사칙연산 입력받기
if (operatorInput.length() == 1 &&
(operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
AddSubMulDiv = operatorInput.charAt(0); // 연산자를 변수에 할당
validAddSubMulDiv = true;
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
// 두 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
int num2 = -1;
while (num2 < 0) {
System.out.println("두 번째 숫자를 입력하세요: ");
num2 = scanner.nextInt();
scanner.nextLine();
if (num2 < 0) {
System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
}
}
int result = 0;
// 반복문을 사용하되, 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정하기
// 무한으로 반복, 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하며 수정)
// 사칙연산 수행하기
switch (AddSubMulDiv) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
System.out.println("0으로 나눌 수 없습니다.");
}
break;
default:
System.out.println("유효하지 않은 연산입니다.");
return;
}
System.out.println("계산 결과: " + result);
// 계속 계산할지 물어보기
String continueInput = "";
boolean validInput = false;
while (!validInput) {
System.out.println("계속 계산하시겠습니다? (yes / exit): ");
continueInput = scanner.nextLine(); // 엔터를 눌러 빈 줄이 남지 않게 하기
if (continueInput.equalsIgnoreCase("exit")) {
System.out.println("계산기를 종료합니다.");
return;
} else if (continueInput.equalsIgnoreCase("yes")) {
validInput = true;
} else {
System.out.println("잘못된 입력입니다. 'yes' '또는 'exit' 를 입력해주세요.");
}
}
}
}
}
인 줄 알았으나, 숫자 입력받는 부분에서도 숫자 외의 문자 입력시 상황 대처 없음. 바로 실행 종료된다는 문제 또 발견😂😂😂
(예) _1, %4, ^2
수정하면서 코드를 아예 전체적으로 수정했다
더 간략하고 알아보기 쉽게
package firstproject;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) { // "exit"를 입력하기 전까지 계속 반복
// 첫 번째 숫자 입력받기
int num1 = getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ");
// 사칙연산 입력받기
char operator = getValidOperator(scanner);
// 두 번째 숫자 입력받기
int num2 = getValidNumber(scanner, "두 번째 숫자를 입력하세요: ");
// 사칙연산 수행 후 결과 출력
int result = performCalculation(num1, num2, operator);
if (result != Integer.MIN_VALUE) {
System.out.println("계산 결과: " + result);
}
// 계속 계산할지 물어보기
if (!getContinueInput(scanner)) {
System.out.println("계산기를 종료합니다.");
return;
}
}
}
// 숫자 입력받기 (유효성 검사 포함)
private static int getValidNumber(Scanner scanner, String prompt) {
int num;
while (true) {
System.out.println(prompt);
String input = scanner.nextLine();
try {
num = Integer.parseInt(input);
if (num >= 0) {
return num;
} else {
System.out.println("0 이상의 수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
}
}
// 사칙연산 입력받기
private static char getValidOperator(Scanner scanner) {
while (true) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
String operatorInput = scanner.nextLine();
if (operatorInput.length() == 1 && "+-*/".indexOf(operatorInput.charAt(0)) != -1) {
return operatorInput.charAt(0);
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
}
// 계속 계산할지 묻기
private static boolean getContinueInput(Scanner scanner) {
while (true) {
System.out.println("계속 계산하시겠습니까? (yes / exit): ");
String continueInput = scanner.nextLine();
if (continueInput.equalsIgnoreCase("exit")) {
return false;
} else if (continueInput.equalsIgnoreCase("yes")) {
return true;
} else {
System.out.println("잘못된 입력입니다. 'yes' 또는 'exit'를 입력해주세요.");
}
}
}
// 사칙연산 수행
private static int performCalculation(int num1, int num2, char operator) {
switch (operator) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
if (num2 != 0) {
return num1 / num2;
} else {
System.out.println("0으로 나눌 수 없습니다.");
return Integer.MIN_VALUE; // 에러 표시
}
default:
System.out.println("잘못된 연산자입니다.");
return Integer.MIN_VALUE; // 에러 표시
}
}
}
➡️ 프로그램 흐름
사용자로부터 첫 번째 숫자 입력받기.
사칙연산 기호 입력받기.
두 번째 숫자 입력받기.
연산 수행하고 결과 출력.
계산을 계속할지 물어보기.
"exit"을 입력하면 종료하고, "yes"를 입력하면 다시 반복.
이러한 흐름을 통해 프로그램은 사용자가 원하는 계산을 반복적으로 처리
1. 패키지 선언과 Scanner 객체 생성
package firstproject;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
import java.util.Scanner; : 사용자로부터 입력을 받기 위한 클래스. Scanner 클래스를 사용하려면 java.util 패키지를 임포트해야 한다
Scanner scanner = new Scanner(System.in); : 사용자로부터 입력을 받기 위해 Scanner 객체를 생성. System.in은 콘솔(터미널)에서 사용자 입력을 받기 위해 사용
2. 무한 반복 루프 시작
while (true) { // "exit"를 입력하기 전까지 계속 반복
조건이 항상 true이기 때문에 이 루프는 "exit"을 입력할 때까지 계속해서 반복된다
루프 안에서는 계속해서 계산을 입력받고 결과를 출력한 후, 사용자가 "exit"을 입력하면 프로그램을 종료
3. 첫 번째 숫자 입력받기 (getValidNumber 함수 사용)
// 첫 번째 숫자 입력받기
int num1 = getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ");
getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ") : 사용자가 유효한 숫자를 입력할 때까지 계속해서 요청하는 함수
이 함수는 숫자가 0 이상인지 확인하고, 유효한 숫자를 받으면 그 값을 num1에 저장한다
4. 사칙연산 기호 입력받기 (getValidOperator 함수 사용)
// 사칙연산 입력받기
char operator = getValidOperator(scanner);
getValidOperator(scanner): 사용자가 사칙연산 기호(+, -, *, /) 중 하나를 입력할 때까지 반복적으로 요청
올바른 연산자를 입력하면 그 연산자를 반환하고, 그 외의 입력이 들어오면 오류 메시지를 출력하고 다시 입력을 요구
연산자가 유효하면 그 값은 operator 변수에 저장
5. 두 번째 숫자 입력받기 (getValidNumber 함수 사용)
// 두 번째 숫자 입력받기
int num2 = getValidNumber(scanner, "두 번째 숫자를 입력하세요: ");
getValidNumber(scanner, "두 번째 숫자를 입력하세요: ") : 첫 번째와 마찬가지6. 사칙연산 수행 (performCalculation 함수 사용)
// 사칙연산 수행 후 결과 출력
int result = performCalculation(num1, num2, operator);
performCalculation(num1, num2, operator) : 첫 번째 숫자 num1, 두 번째 숫자 num2, 그리고 연산자 operator 를 받아서 계산을 수행하고 결과를 반환
switch 문을 사용하여 사칙연산 기호를 처리. 나눗셈만 num2 가 0이면 에러메시지 출력하고 Integer.MIN_VALUE 를 반환
Integer.MIN_VALUE 는 계산이 잘못되었을 때 오류를 표시하기 위해 사용된다
7. 계산 결과 출력
if (result != Integer.MIN_VALUE) {
System.out.println("계산 결과: " + result);
}
if (result != Integer.MIN_VALUE) : performCalculation 함수에서 결과가 Integer.Min_Value 인 경우는 계산 잘못됐다고 나타내며, 그런 경우 결과를 출력하지 않고 넘어간 뒤에 올바른 계산 결과만 출력8. 계속할지 여부 물어보기 (getContinueInput 함수 사용)
// 계속 계산할지 물어보기
if (!getContinueInput(scanner)) {
System.out.println("계산기를 종료합니다.");
return;
}
getContinueInput(scanner) : 사용자가 "yes" 를 입력하면 true 를 반환하고, "exit" 를 입력하면 false 를 반환하고, 그 외의 입력에 대해서는 다시 물어본다.
"yes" 입력시 계속 계산 반복, "exit" 입력시 return 을 통해 프로그램 종료
9. getValidNumber 함수
private static int getValidNumber(Scanner scanner, String prompt) {
int num;
while (true) {
System.out.println(prompt);
String input = scanner.nextLine();
try {
num = Integer.parseInt(input);
if (num >= 0) {
return num;
} else {
System.out.println("0 이상의 수를 입력해주세요.");
}
} catch (NumberFormatException e) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
}
}
사용자로부터 유효한 숫자를 입력받기 위한 함수
scanner.nextLine() : 사용자가 입력한 값을 문자열로 받는다
Integer.parseInt() 메서드를 사용해 문자열을 정수로 반환한다
숫자가 아닌 값을 입력하면 NumberFormatException 이 발생하여 오류 메시지를 출력하고 다시 입력을 받는다
숫자가 () 이상이면 유효한 숫자이므로 그 값을 반환하고, () 미만이면 다시 입력을 받는다
10. getValidOperator 함수
private static char getValidOperator(Scanner scanner) {
while (true) {
System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
String operatorInput = scanner.nextLine();
if (operatorInput.length() == 1 && "+-*/".indexOf(operatorInput.charAt(0)) != -1) {
return operatorInput.charAt(0);
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
}
사칙연산 기호를 입력받고, 유효한 연산자일 경우에만 그 값을 반환
operatorInput.length() == 1 : 입력받은 문자열이 한 글자인지 확인
"+-*/".indexOf(operatorInput,charAt(0)) != -1 : 그 문자가 유효하 연산자인지 확인
잘못된 입력 하면 오류 메시지를 출력하고 다시 입력 받기
11 getContinueInput 함수
private static boolean getContinueInput(Scanner scanner) {
while (true) {
System.out.println("계속 계산하시겠습니까? (yes / exit): ");
String continueInput = scanner.nextLine();
if (continueInput.equalsIgnoreCase("exit")) {
return false;
} else if (continueInput.equalsIgnoreCase("yes")) {
return true;
} else {
System.out.println("잘못된 입력입니다. 'yes' 또는 'exit'를 입력해주세요.");
}
}
}
사용자가 "yes" 입력하면 계산 계속하고, "exit" 입력하면 프로그램 종료
그 외의 입력은 메시지 출력하고 다시 물어본다
12. performCalculation 함수
private static int performCalculation(int num1, int num2, char operator) {
switch (operator) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
if (num2 != 0) {
return num1 / num2;
} else {
System.out.println("0으로 나눌 수 없습니다.");
return Integer.MIN_VALUE; // 에러 표시
}
default:
System.out.println("잘못된 연산자입니다.");
return Integer.MIN_VALUE; // 에러 표시
}
}
performCalculation 함수 : 연산자에 맞는 계산을 수행하는 함수
switch 문 : 입력받은 연산자에 따라 덧셈, 뺄셈, 곱셈, 나눗셈 처리
나눗셈에서 num2 ㅣ 0이면 오류메시지 출력하고 Integer.Min_Value 를 반환
잘못된 연산자 입력하면 메시지 출력하고 Integer.Min_Value 를 반환