자바 간단한 프로젝트 console로 동작하는 정수 계산기 프로그램을 만들어보겠습니다.
💡확인하기
- OS : Windows 11
- JDK : 17
- IDE : IntelliJ
정수 2개와 연산자를 입력받아 계산 결과를 출력해 주는 프로그램을 작성해 봅시다.
요구사항
- 정수 2개와 연산자를 사용자에게 입력받습니다.
- 연산자는 +(덧셈), -(뺄셈), *(곱셈), /(나눗셈)만 입력받아야 합니다.
- 정수나 연산자에 해당하는 문자가 아닌 다른 문자를 입력하면 올바른 값을 입력받을 때까지 반복해서 입력받습니다.
- 사용자가 끝내길 원할 때까지 전체 프로그램을 반복합니다.
👇👇 전체 소스는 하단에서 👇👇
구현하기
입력받는 데이터를 저장할 변수를 생성합니다.
int num1, num2; // 연산할 정수 2개
char op; // 연산자 문자
사용자 입력을 처리할 Scanner를 생성합니다.
Scanner scan = new Scanner(System.in);
1. 첫 번째 값 입력받기
첫번째 정수를 입력받습니다.
System.out.print("1. 정수를 입력하세요 > ");
num1 = Integer.parseInt(scan.nextLine());
입력받은 값이 정수가 아니면 Integer.parseInt() 시 NumberFormatException 에러가 발생하게 됩니다.
NumberFormatException 에러가 발생한다면 우리는 사용자가 입력한 값이 정수가 아닌 다른 문자라는 것을 알 수 있죠.
프로그램에서 에러 발생 시 예상치 못한 종료를 방지하기 위해 try-catch로 에러 핸들링하며 정상적인 값을 입력하도록 유도합니다.
try {
num1 = Integer.parseInt(scan.nextLine());
} catch (Exception e) {
System.out.print("\t정수만 입력하세요 > ");
}
정상적인 값을 입력받을 때까지 반복해서 입력받도록 무한 반복문으로 감싸고, 정상 동작시 break 키워드로 무한 반복문을 빠져나갑니다.
// 숫자1 입력
System.out.print("1. 정수를 입력하세요 > ");
while (true) {
try {
num1 = Integer.parseInt(scan.nextLine());
break;
} catch (Exception e) {
System.out.print("\t정수만 입력하세요 > ");
}
}
2. 두 번째 값 입력받기
연산자 문자를 입력받습니다.
System.out.print("2. 연산자를 입력하세요(+, -, *, /) > ");
op = scan.nextLine().toCharArray()[0];
입력받은 문자가 허용된 연산자 문자인지 확인합니다.
if (op == '+' || op == '-' || op == '*' || op == '/') {
// 정상
}
무한 반복문으로 감싸 정상적인 입력값을 받을 때까지 반복하여 다시 입력받습니다.
// 연산자 입력
System.out.print("2. 연산자를 입력하세요(+, -, *, /) > ");
while (true) {
op = scan.nextLine().toCharArray()[0];
if (op == '+' || op == '-' || op == '*' || op == '/') {
break;
}
System.out.print("\t+, -, *, / 중 하나를 입력하세요 > ");
}
3. 세 번째 값 입력받기
두 번째 정수를 입력받습니다.
System.out.print("3. 정수를 입력하세요 > ");
num2 = Integer.parseInt(scan.nextLine());
첫 번째 정수와 마찬가지로 정수가 아닌 값을 입력했다면 정상적인 값을 입력받도록 무한 반복문 처리합니다.
while (true) {
try {
num2 = Integer.parseInt(scan.nextLine());
break;
} catch (NumberFormatException e1) {
System.out.print("\t정수만 입력하세요 > ");
}
}
나눗셈 연산자를 입력한 경우, 나누는 숫자(분모)가 0이 된다면 ArithmeticException 에러가 발생합니다.
따라서, 나눗셈 연산자를 입력하고 두 번째 정수가 0이라면 강제로 에러를 발생시키고, catch 문에서 핸들링합니다.
if (op == '/' && num2 == 0) {
throw new Exception("0으로 나눌 수 없습니다.");
}
catch(Exception e2) {
System.out.print("\t" + e2.getMessage() + " 다시 입력하세요 > ");
}
4. 결과 계산 및 출력하기
연산에 필요한 값은 모두 입력받았습니다.
사용자에게 출력할 연산 결과를 저장하는 변수를 생성합니다.
int result = 0;
연산자 문자 종류에 따라 계산하기 위해 switch-case 문을 사용합니다.
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
결과를 출력합니다.
System.out.println("## 결과 : " + result);
5. 종료하기
사용자가 프로그램 종료를 원할 때까지 반복해서 실행하므로 전체를 무한 반복문으로 감싸줍니다.
while (true) {
int num1, num2;
char op;
// 숫자1 입력
// 생략
// 연산자 입력
// 생략
// 숫자2 입력
// 생략
// 연산자에 따라 계산
// 생략
System.out.println("## 결과 : " + result);
} // END while
사용자에게 프로그램 진행 여부를 입력받습니다.
System.out.print("계속 하시겠습니까? 끝내려면 'Q'를 입력하세요. > ");
String quite = scan.nextLine();
종료 flag는 Q가 아닌 원하는 문자 또는 문자열로 설정해도 됩니다.
입력받은 문자열이 종료 flag라면 무한 반복문을 빠져나갑니다.
if (quite.equals("Q")) {
System.out.println("============== 계산기 종료 ==============");
break;
}
실행결과
전체 소스 보기
public static void main(String[] args) {
// 사용자 입력받는 Scanner 생성
Scanner scan = new Scanner(System.in);
System.out.println("============== 정수 계산기 ==============");
while (true) {
int num1, num2;
char op;
// 숫자1 입력
System.out.print("1. 정수를 입력하세요 > ");
while (true) {
try {
num1 = Integer.parseInt(scan.nextLine());
break;
} catch (Exception e) {
System.out.print("\t정수만 입력하세요 > ");
}
}
// 연산자 입력
System.out.print("2. 연산자를 입력하세요(+, -, *, /) > ");
while (true) {
op = scan.nextLine().toCharArray()[0];
if (op == '+' || op == '-' || op == '*' || op == '/') {
break;
}
System.out.print("\t+, -, *, / 중 하나를 입력하세요 > ");
}
// 숫자2 입력
System.out.print("3. 정수를 입력하세요 > ");
while (true) {
try {
num2 = Integer.parseInt(scan.nextLine());
// 나눗셈인데 분모가 0일 경우 강제 에러 트리거
if (op == '/' && num2 == 0) {
throw new Exception("0으로 나눌 수 없습니다.");
}
break;
} catch (NumberFormatException e1) {
System.out.print("\t정수만 입력하세요 > ");
} catch(Exception e2) {
System.out.print("\t" + e2.getMessage() + " 다시 입력하세요 > ");
}
}
// 연산자에 따라 계산
int result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
System.out.println("## 결과 : " + result);
System.out.print("계속 하시겠습니까? 끝내려면 'Q'를 입력하세요. > ");
String quite = scan.nextLine();
if (quite.equals("Q")) {
System.out.println("============== 계산기 종료 ==============");
break;
}
} // END while
} // END main
'Language > JAVA' 카테고리의 다른 글
[JAVA] Thread(스레드)와 State(상태) (1) | 2024.04.05 |
---|---|
[JAVA] Memory Structure(메모리 구조)와 Wrapper Class (24) | 2024.04.04 |
[JAVA] method Overloading vs. Overriding(메소드 오버로딩 vs. 오버라이딩) (1) | 2024.04.02 |
[JAVA] Class Inheritance 클래스 상속 (27) | 2024.04.01 |
[JAVA] 변수 유효 범위, this와 접근 제어자(public, protected, private) (12) | 2024.03.31 |