Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기
- Lv2.java
package Lv2;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Lv2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Calculator calculator = new Calculator();
while (true) {
int num1 = 0;
int num2 = 0;
boolean validInput = false;
// 양의 정수 입력받기
while (!validInput) {
try {
System.out.print("양의 정수를 입력해주세요(1/2):");
num1 = scanner.nextInt(); // 첫 번째 정수 입력
if (num1 < 0) {
System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
} else {
validInput = true; // 유효한 입력
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
scanner.next();
}
}
validInput = false; // 루프용 boolean 초기화
while (!validInput) {
try {
System.out.print("양의 정수를 입력해주세요(2/2):");
num2 = scanner.nextInt(); // 두 번째 정수 입력
if (num2 < 0) {
System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
} else {
validInput = true; // 유효한 입력
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
scanner.next();
}
}
validInput = false; // 루프용 boolean 초기화
scanner.nextLine(); // 남아있는 줄바꿈 제거
// 사칙연산 기호 입력받기
while (!validInput) {
System.out.print("사칙연산 기호를 입력해주세요(+-*/):");
String operator = scanner.nextLine();
// 확인 후 연산하기
if (operator.equals("+") || operator.equals("-") || operator.equals("*")) {
calculator.calculate(operator, num1, num2); // calculator 클래스 활용
validInput = true;
break;
} else if (operator.equals("/")) {
if (num2 == 0) {
System.out.println("0으로 나눌 수 없습니다. 다시 입력해주세요.");
} else {
calculator.calculate(operator, num1, num2);
validInput = true;
}
} else {
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
// 결과 출력하기
calculator.getAnswer();
// exit 입력시 루프 탈출
System.out.print("계속 하시겠습니까?(종료:exit):");
String exit = scanner.nextLine();
if (exit.equalsIgnoreCase("exit")) { // 대소문자 구분 없이 처리
System.out.println("프로그램을 종료합니다. 감사합니다!");
break;
}
}
scanner.close();
}
}
- Calculator.java
package Lv2;
import java.util.LinkedList;
import java.util.Queue;
public class Calculator {
// 연산 결과 저장
private int num1 = 0;
private int num2 = 0;
String operator = "";
private double answer = 0;
private Queue<Double> data = new LinkedList<>();
// 연산 수행
public void calculate(String operator, int num1, int num2) {
this.operator = operator;
this.num1 = num1;
this.num2 = num2;
if (operator.equals("+")) {
plus();
} else if (operator.equals("-")) {
minus();
} else if (operator.equals("*")) {
mul();
} else {
div();
}
}
private void plus() {
answer = num1 + num2;
}
private void minus() {
answer = num1 - num2;
}
private void mul() {
answer = num1 * num2;
}
private void div() {
answer = num1 / num2;
}
// 연산 출력
public void getAnswer() {
if (data.isEmpty()) { // 큐 데이터
System.out.println("결과:" + answer);
data.add(answer); // 비어있으면 값 추가함
} else {
data.remove(); // 비어있지 않으면 값 제거함
}
}
}
Lv 2. 의 과제는 연산을 수행하고, 결과를 컬렉션에 저장하고, 반환하는 메서드가 있는 Calculator 클래스를 구현하는 것입니다. 사실상 Lv 1. 과제에 연산하는 부분만 Calculator 클래스로 옮기고 결과를 컬렉션에 저장 및 제거하기만 하는 기능을 추가하는 거라 크게 어렵지 않았습니다. 다만 Getter, Setter 메서드를 제대로 활용하지 못한 것 같습니다.
Getter, Setter
두 메서드를 사용하면 Lv2 클래스에 입력한 값을 Caclulator 클래스로 가져가고, 이를 통해 계산을 할 수 있습니다. 근데 사칙연산 기호를 입력받은 후 연산할 때 클래스에 인자를 직접 가져갑니다. calculate(operator, num1, num2)로 가져가서 사실상 Calculator 클래스에 num1과 num2를 Setter로 가져가도 활용할 수가 없습니다.
Getter은 calculate 메서드를 통해 저장된 answer 값을 Lv2 클래스로 가져가 결과를 출력할 수 있습니다. 하지만 굳이 이것도 Lv2 클래스에서 수정하게 두고싶지 않아 Calculator 클래스 내에서 해결하도록 만들었습니다.
Queue
Queue 클래스는 데이터 컬렉션 타입 중 하나로, 선입후출의 특징을 가지고 있습니다. 과제의 요구사항인 가장 먼저 저장된 데이터를 삭제하는 기능은 Queue를 사용하는 것이 좋습니다. 여기에서는 그냥 간단하게 getAnswer 메서드를 통해 값을 출력할 때 단순하게 비어있으면 값을 추가하고, 비어있지 않으면 값을 제거하도록 만들었습니다. 이에 대한 활용 방안은 더 있었지만(ex. 값 나열, 추가할지 말지 선택) 불의의 사고로 Lv2. 과제를 세 번 만들게 되어 Lv3. 과제에 좀 더 힘을 주기로 했습니다.
'Sparta' 카테고리의 다른 글
Ch2 키오스크 과제 트러블 슈팅 (0) | 2024.11.28 |
---|---|
Ch2 계산기 과제 Lv3. (0) | 2024.11.18 |
Ch2 계산기 과제 Lv1. (0) | 2024.11.18 |
TIL(Today I Learned)_24.11.04.mon (0) | 2024.11.04 |
TIL(Today I Learned)_24.11.02.Sat (0) | 2024.11.02 |