네안녕하세요 오늘은
계산기만들기를 저번에 연결해서 만들려고하는데
하면서 있던트러블과 그걸 해결한 방법들을보여드리겟습니다
하지만 난이도가 좀있었기에 Lv2-2까지밖에못했고
아마 내일중으로 2-4까지 구현해내지 않을까 싶습니다.
우선 Lv2-1입니다
저는 class를 Cal1으로 해줫습니다.
우린지금 처음에 사칙연산을 수행한후, 결과값을 반환 메서드를 구현및 연산결과를 저장하는 컬렉션 타입 필드를 가진Cal1 클래스를 생성해야됩니다.
우선 그러려면 연산결과를 저장하는 컬렛션 타입 필드를 선언 및 생성을 해야겟죠?
이제 저는 시작부터 문제를 얻습니다
저기에 어떤 접근 권한자를 써야하는가 였습니다.
고민을 하다가 몇일전에 배운것중에 private라는 접근 제어자를 생각했습니다.
private를 사용하면 외부에서 직접 수정하거나 접근하지 못하도록 막을수있기때문에
용이하다 생각햇습니다.
거기에 list를 이용해서 연산기록을 저장하고 ArrayList 로 초기화를 했습니다
// 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성
private List<String> calculation;
public Cal1() {
//초기화
calculation = new ArrayList<>();
}
이렇게 말이죠 그후
이부분을 만드는데 저번 Lv1을 만들때 저는 int가아니라 double을 사용했죠
그래서 저는 이번 반환타입도 double 을사용했습니다
//사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
public double calculate(double num1,double num2, char oper){
double result;
이렇게 말이죠 뒤에 매개변수는 num1 숫자 첫번째,num2 숫자두번째, char oper은 우리가 쓸 연산자를 나타내는 문자입니다.
그후
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 0;
}
break;
case '%' :
if (num2!=0){
result = num1%num2;
}else {
System.out.println("0으로 나눌수없습니다.");
return 0;
}
break;
default:
System.out.println("사칙연산으로 입력해주세요");
return 0;
}
발단:
switch 문을 이용해 저번 Lv1때했던식으로 바꿔줫는데
근데 다른점이 보이실겁니다.
그건 continue 가없다는거죠 저는 사실 continue를쓰고싶었는데
알고보니 continue는 반복문에서만 쓸수있다는것이죠
그래서 continue를 빼줫습니다
전개: 그랬더니 문제가생겼습니다. Lv1때는 1/0을하면 0으론 못나눕니다
하고 2번째 숫자를 다시입력하게 만들었는데 그걸 되게했던continue가 빠지게된것입니다.
1-1 위기 : 이걸 어떻게해야되나 하고있었는데요 아그럼 여기다말고 Lv1에서만든 class App에서 실행하고 결과값을받을때 반복문을 만들어주면되겟지? 하고
// 계산 결과가 0이면 두 번째 숫자를 다시 입력받게 함
if (result == 0) {
continue; // 반복문 처음으로 돌아감
}
이코드를 만들어줫습니다 계산결과가 0 이면 두번째숫자로 돌아가게하는것이죠
그랬더니 문제가 생겻습니다
1-1=0도 그냥 뒤로 돌려버리게된것이죠
1-2절정:
아 왜그런것일까 어떻게 해야될까 라고생각해봣습니다
그런데 continue가 잘돌아가는 상황을 이용해야될거같다는 느낌이 들었습니다
그럼 이오류가 왜나는 것이였을까를 생각해봣습니다
그래도 모르겟어서 구글링을해봣더니 그럴땐
Double.NaN을이용해서 Num2가 0일경우 에러상황으로 간주하고 반환하게 만들면
된다고 하더라고요
저는 그전에 return=0; 을하고있어 에러와 정상적인 계산구분이 힘들었던거라하더라고요
저는 여태 return= 숫자; 나 return; 만되는줄알았는데 하나배웟습니다.
1-3결말
그래서 저는 바로
//사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
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 반환
}
이렇게 코드를 바꿔줫습니다
이렇게되면 덧셈 뺄셈은 0이나오지만
/과%의 2번째 숫자가 0일경우 에러상황으로 간주하게 만든것이죠
이렇게 문제 하나를 해결한후
calculation.add(num1+""+oper+""+num2+"="+result);
return result;
}
을 이용해 10+10=20 이나오게해놧습니다
이렇게 결과를 반환해서 App클래스의 result 에 저장하게한것이죠
그리고 우리는 private를사용했으니 get이 필요하겟죠?
그래서
//연산 기록 반환 메서드
public List<String> getCalculation(){
return calculation;
}
}
위의 코드를 이용해서
연산기록을 반환하게 만들었습니다.
그후 LV2-2인
이것을 시행하였는데요
우선 Cal1클래스의 인스턴스를 생성해줫습니다
//Cal1 인스턴스 생성
Cal1 cal1 = new Cal1();
그런데 하다보니 어?
double inputfir= sc.nextint로되어있는것입니다
double이면 double로해줘야되는데
아니나다를까 그래서 2.2를해줫더니 오류가뜬것입니다.
그래서 바로
System.out.println("양의 첫번째정수를 입력해주세요.");
double inputfir = sc.nextDouble();
String messege = "";
이렇게바꿔주었습니다
그후
우리가 Cal1에 계산식을옮겨줫으니 우리가지난시간 만들어준 App의 계산식을 빼준후 Cal1에서 가져와야될시간입니다
//Cal클래스의 연산결과 받기
double result = cal1.calculate(inputfir,inputsec,option);
이렇게말이죠
그후 우리가 아까 만들어줫던 NaN을이용해서
// 결과가 NaN이면 두 번째 숫자를 다시 입력받기
if (Double.isNaN(result)) {
continue; // 반복문 처음으로 돌아감
}
위와같이해주고 NaN이뜨면 2번째로 돌아가게 만들었습니다.
그러고나서 해주니
2-1위기:
어? 계산을할때 소숫점이 무수히 많으면 어떡하지?라는
생각을 해보게되었습니다
그래서 이걸 어떻게 해볼까 고민을 계속해보았는데요
2-2절정:
아무리해도 안되길래 흠 소숫점 2자리까지 어떻게 못하나?
하다가 안되길래 튜터님께 질문을 드렷더니 round 라는 java언어가있다는것을 알게됫고
바로적용을해보았습니다.
2-3결말:
그랬더니 반올림을 해서 잘 나와주는걸 확인할수있었는데
result=Math.round(result*100.0)/100.0; //100을곱하고 반올림 후 100으로 나눠서 소수점 2자리까지 반올림
그게바로 위의 코드입니다.
System.out.println("결과"+result);
inputfir=result; //반복문으로 계산을 더할시 결과값을 inputfir로만든후 계산
//계산을 더할지 물어보기
System.out.println("더 계산하시겟습니까?(exit 입력시 종료)");
messege = sc.next();
}while (!messege.equals("exit"));//messege가 exit가아닐경우 반복
//계산 기록 출력
System.out.println("연산 기록:");
for (String record : cal1.getCalculation()) {
System.out.println(record);
}
그후 위와같이 저번에 만들어준코드와 맨아래 계산기록 출력부분을보면
Cal클래스에서 계산 기록을 가져와서 각기록을 한줄씩 출력하게 되는것이죠.
일단 오늘은 Lv2-2까지해보았구요 내일 마저 2-4까지 만든후 돌아오겟습니다.
'과제를하면서 트러블슈팅' 카테고리의 다른 글
키오스크 만들기 Lv3 (0) | 2025.01.16 |
---|---|
키오스크 만들기 (3) | 2025.01.15 |
클래스 구현실습 (4) | 2025.01.14 |
계산기 만들기 Lv2-3,4 (0) | 2025.01.10 |
계산기 만들기 (2) | 2025.01.03 |