네안녕하세요 오늘도계산기를 마저 만들어봣습니다
위의 조건이였는데요 솔직히 어제 Lv2-1과 -2 보다 훨씬 간단하고 쉬웠습니다.
처음에 Cal1 클래스에
연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정을 하기위한 코드를
만들어줫는데요 (캡슐화)죠?
private List<String> calcapsule = new ArrayList<>();
위의 코드를 이용해줫습니다. 기존에 있던코드에 = ArrayList<>();를써준것이죠
그리고나서 기본생성자인
public Cal1() {
//초기화
calculation = new ArrayList<>();
}
이코드를 지워줫습니다
그러고난뒤
//사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
public double calculate(double num1, double num2, char oper) {
double result;
switch (oper) {
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으로 나눌수없습니다.");
return Double.NaN; // 에러 상황 시 NaN 반환
}
break;
case '%':
if (num2 != 0) {
result = num1 % num2;
} else {
System.out.println("0으로 나눌수없습니다.");
return Double.NaN; // 에서 상황 시 NaN 반환
}
break;
default:
System.out.println("사칙연산으로 입력해주세요");
return Double.NaN; // 잘못된 연산자 입력 시 NaN 반환
}
//캡슐화된 결과기록저장
calcapsule.add(num1 + "" + oper + "" + num2 + "=" + result);
return result;
}
기존에있던코드에
calculation을 calcapsule 로 바꿔줫으니
맨아래쪽 결과기록저장부분도 바꿔줍니다
그후
// Getter 메서드
public List<String> getCalcapsule() {
return calcapsule;
}
// Setter 메서드 (수정)
public void setCalcapsule(List<String> calcapsule) {
this.calcapsule = calcapsule;
}
}
Getter과 setter 메서드를 넣어줫습니다.
그리고 app클래스로 넘어와서
기존에있던 연산결과 받는부분도 바꿔줫습니다
//Cal클래스의 연산결과 받기
double result = cal1.calculate(inputfir,inputsec,option);
이렇게말이죠
그후
//계산 기록 출력
System.out.println("연산 기록:");
for (String record : cal1.getCalcapsule()) {
System.out.println(record);
}
이것을
맨아래부분에 넣어줫는데
여기서 문제가생겻습니다.
아무리 실행을해서 해봐도 계산기록 출력이 안되는것입니다.
그래서 왜그런가했더니
반복문안에 넣어줘야되는데 밖에넣어준것이죠
다행히 오류는 안났긴하지만
그래도 이런 실수는 안하게끔해야될거같습니다.
package com.example.calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//Cal1 인스턴스 생성
Cal1 cal1 = new Cal1();
//첫번째 정수를입력
System.out.println("양의 첫번째정수를 입력해주세요.");
double inputfir = sc.nextDouble();
String messege = "";
//do-while 반복문 시작
do {
System.out.println("양의 두번째정수를 입력해주세요.");
double inputsec = sc.nextDouble();
System.out.println("사칙연산 기호를 입력해주세요.");
char option = sc.next().charAt(0);
//Cal클래스의 연산결과 받기
double result = cal1.calculate(inputfir,inputsec,option);
// 결과가 NaN이면 두 번째 숫자를 다시 입력받기
if (Double.isNaN(result)) {
continue; // 반복문 처음으로 돌아감
}
result=Math.round(result*100.0)/100.0; //100을곱하고 반올림 후 100으로 나눠서 소수점 2자리까지 반올림
System.out.println("결과"+result);
inputfir=result; //반복문으로 계산을 더할시 결과값을 inputfir로만든후 계산
//계산 기록 출력
System.out.println("연산 기록:");
for (String record : cal1.getCalcapsule()) {
System.out.println(record);
}
//계산을 더할지 물어보기
System.out.println("더 계산하시겟습니까?(exit 입력시 종료)");
messege = sc.next();
}while (!messege.equals("exit"));//messege가 exit가아닐경우 반복
}
}
그래서 Lv2-3의 App클래스는 이렇게끝났습니다.
이제 Lv2-4를보시겟습니다
솔직히 여기선 어떻게해야하는지 내용은 짧은데 이게 무슨소리지? 하고 이해하는데 시간이 오래걸렸습니다.
그러다가 아 저번에 배운 Stack부분에서 쌓고 뽑을때 값을 삭제하는 기능이 있엇지? 라는
생각이들엇습니다 그래서 위와같은조건으로
Lv2-3부분 맨아래에 우선 public void removeResult 코드를써주고
이제 어떻게 할까 하는데
저번에 Stack에서 while을이용해 다지워질때까지 출력을했었던게
기억이났습니다.
그런데 while은문제가머냐 다지워질떄까지 전부출력한다는것이죠
그래서저는 if문으로 대체해봣습니다
//저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현
public void removeResult(){
if (!calcapsule.isEmpty()){
System.out.println("삭제된 기록="+calcapsule.remove(0));
}else{
System.out.println("삭제할 기록이 없습니다");
}
}
이렇게 말이죠
이렇게 만든후 App클래스로가서 코드를 수정해줫는데요?
솔직히 아주 간단했습니다.
우리가 Cal1에 이미 삭제기능을 구현해놧으니 뽑아서 쓰기만하는되는거엿는데요
//자동으로 연산 기록 삭제
cal1.removeResult();
이코드죠 그런데
//계산 기록 출력
System.out.println("연산 기록:");
for (String record : cal1.getCalcapsule()) {
System.out.println(record);
}
이코드 위에 쓰니 계산기록이 안보이는겁니다
아생각해보니 연산기록을 삭제했는데 어떻게 계산기록이 출력이되나 라는 생각을했습니다
당연한것인데 이런걸놓친거죠
그래서 고쳐준후
package com.example.calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//Cal1 인스턴스 생성
Cal1 cal1 = new Cal1();
//첫번째 정수를입력
System.out.println("양의 첫번째정수를 입력해주세요.");
double inputfir = sc.nextDouble();
String messege = "";
//do-while 반복문 시작
do {
System.out.println("양의 두번째정수를 입력해주세요.");
double inputsec = sc.nextDouble();
System.out.println("사칙연산 기호를 입력해주세요.");
char option = sc.next().charAt(0);
//Cal클래스의 연산결과 받기
double result = cal1.calculate(inputfir,inputsec,option);
// 결과가 NaN이면 두 번째 숫자를 다시 입력받기
if (Double.isNaN(result)) {
continue; // 반복문 처음으로 돌아감
}
result=Math.round(result*100.0)/100.0; //100을곱하고 반올림 후 100으로 나눠서 소수점 2자리까지 반올림
System.out.println("결과"+result);
inputfir=result; //반복문으로 계산을 더할시 결과값을 inputfir로만든후 계산
//계산 기록 출력
System.out.println("연산 기록:");
for (String record : cal1.getCalcapsule()) {
System.out.println(record);
}
//자동으로 연산 기록 삭제
cal1.removeResult();
//계산을 더할지 물어보기
System.out.println("더 계산하시겟습니까?(exit 입력시 종료)");
messege = sc.next();
}while (!messege.equals("exit"));//messege가 exit가아닐경우 반복
}
}
App코드를 이렇게해주고
잘되는것을 보실수있으십니다.
솔직히 이번에 계산기 과제를 Lv3 심화과정을
해보고싶었는데..
이게 Java언어 강의들으면서 이해하는데도 시간이 오래걸렷습니다
사실 한 70프로만 이해했고 강의내용 안보고 혼자 적용하기는 못하는상태죠
그래서 Lv3을하는거보다 여태배운내용을 다시 뒤돌아 보자 하고
Lv2까지만 해봣습니다
일주일의 시간으론 아직 힘들더라고요...
아쉬웟지만 그래도 강의만들을땐 이게 무슨소리지?
하다가 이렇게 직접 실습을 해보니 아 이런거였구나 하면서
만들게 되는 시간이였습니다.
봐주셔서 감사합니다
'과제를하면서 트러블슈팅' 카테고리의 다른 글
키오스크 만들기 Lv3 (0) | 2025.01.16 |
---|---|
키오스크 만들기 (3) | 2025.01.15 |
클래스 구현실습 (4) | 2025.01.14 |
계산기 만들기 Lv2 (0) | 2025.01.09 |
계산기 만들기 (2) | 2025.01.03 |