✅ 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기
1. 사칙연산 수행 후 결과값을 반환하는 메서드를 구현, 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스 생성하기
2. Lv1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정하기
3. App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정하기
4. Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드 구현하기
package Lv2;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Lv2App {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.setResultSave(new ArrayList<>());
Scanner scanner = new Scanner(System.in);
int num1 = 0;
int num2 = 0;
// break;로 빠져나오기 전까지 계속 반복
while (true) {
while (true) { // 정수 이외의 것을 입력 했을 시 첫 번째 숫자부터 다시 입력 받게 반복
try {
System.out.print("첫 번째 숫자를 입력하세요: ");
num1 = scanner.nextInt(); // 첫 번째 숫자 입력
System.out.print("두 번째 숫자를 입력하세요: ");
num2 = scanner.nextInt(); // 두 번째 숫자 입력
break;
} catch (InputMismatchException e) {
System.out.println("정수만 입력 가능합니다. 다시 입력해주세요.");
scanner.nextLine(); // nextLine()을 써줘야 버퍼에 남아있는 값을 없애기 때문에 사용
}
}
System.out.print("사칙연산 기호를 입력하세요('+, -, *, /'): ");
char operator = scanner.next().charAt(0); // 사칙연산 기호 입력
// 사칙연산 이외의 값 입력시 실행
if(operator!='+' &&operator!='-' &&operator!='*' &&operator!='/'){
System.out.print("사칙연산 기호만 입력 가능합니다. 다시 입력해주세요. : ");
operator = scanner.next().charAt(0);
}
// 두 정수 연산
if (num2 == 0 && operator == '/') {
System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
// 두 번째 숫자가 0 이고 사칙연산 기호가 / 일 때 계산할 수 없으므로 '입력 될 수 없다'을 출력
} else {
int result = calculator.calculate(num1, num2, operator);
System.out.println("결과: " + result); // 연산 결과 출력
calculator.getResultSave().add(result);
}
// 저장된 연산 결과 값을 보여주고 "yes"을 작성시 가장 먼저 저장된 값 삭제
System.out.println("저장된 연산 결과 " + calculator.getResultSave());
try {
calculator.removeResult();
} catch (IndexOutOfBoundsException e) {
System.out.println("저장된 연산 결과가 없습니다.");
}
System.out.print("더 계산하시겠습니까? (exit 입력 시 종료): ");
String stop = scanner.next();
if (stop.equals("exit")) {
break; // exit 입력 시 연산 종료
}
}
}
}
package Lv2;
import java.util.List;
import java.util.Scanner;
public class Calculator {
// 1. 속성
// 연산 결과를 저장하는 변수 생성
private List<Integer> resultSave;
// 2. 생성자
// 기본 생성자
// 3. 기능(메서드)
// 연산 기능 메서드
public int calculate(int num1, int num2, char operator) {
int result = 0;
if(operator=='+'){
result = num1 + num2;
} else if(operator == '-'){
result = num1 - num2;
} else if(operator == '*'){
result = num1 * num2;
} else if(operator == '/'){
result = num1 / num2;
}
return result;
}
// 게터 메서드
public List<Integer> getResultSave() {
return resultSave;
}
// 세터 메서드
public void setResultSave(List<Integer> resultSave) {
this.resultSave = resultSave;
}
// "yes"을 작성하면 가장 먼저 저장된 값을 지우는 메서드
public void removeResult(){
System.out.print("가장 먼저 저장된 연산 결과를 지우시겠습니까? (yes 입력 시 삭제): ");
Scanner scanner = new Scanner(System.in);
String answer = scanner.next();
if(answer.equals("yes")){
getResultSave().remove(0);
}
}
}
연산 결과를 저장할 때
setter를 사용해야 하는 상황인데 실수로getter을 사용하였고 자바의Collection에 대한 개념이 부족했기 때문입니다.
Calculator 클래스에 resultSave에 접근할 수 있는 getter 메서드을 만들고 메인 클래스에서 calculator.getResultSave().add(result);를 사용해 연산 결과를 올바르게 저장하도록 수정하였고 컬렉션 관련 내용을 학습하고 문제 상황에 맞게 List를 선택하여 적용하였다.
이번 문제를 통해 단순히 메서드를 호출하는 것뿐만 아니라 해당 메서드가 어떤 역할을 하는지 정확히 이해하고 사용해야 한다는 점을 알게 되었다.
getter와setter의 기능을 혼동하면서 생긴 문제였지만 이를 계기로 클래스의 캡슐화 개념과 메서드의 개념을 확실히 알게 되었다. 앞으로는 메서드를 사용할 때 기능을 명확히 파악하고 그에 맞게 코드를 작성하는 습관을 들여야겠다고 느꼈다.
또한 컬렉션 타입을 처음 접했을 때는 어떤 자료구조를 선택해야 할지 막막했지만List와Set,Map의 차이점을 비교하며 개념을 이해할 수 있었다. 이번 경험을 통해 상황에 따라 적절한 컬렉션을 선택하는 것이 코드의 효율성과 구조에 큰 영향을 준다는 점을 알게되었다.