본문 바로가기

과제를하면서 트러블슈팅

계산기 만들기 Lv2-3,4

반응형
SMALL

네안녕하세요 오늘도계산기를 마저 만들어봣습니다

위의 조건이였는데요 솔직히 어제 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까지만 해봣습니다

일주일의 시간으론 아직 힘들더라고요...

아쉬웟지만 그래도 강의만들을땐 이게 무슨소리지?

하다가 이렇게 직접 실습을 해보니 아 이런거였구나 하면서

만들게 되는 시간이였습니다.

봐주셔서 감사합니다

반응형
LIST

'과제를하면서 트러블슈팅' 카테고리의 다른 글

키오스크 만들기 Lv3  (0) 2025.01.16
키오스크 만들기  (3) 2025.01.15
클래스 구현실습  (4) 2025.01.14
계산기 만들기 Lv2  (0) 2025.01.09
계산기 만들기  (2) 2025.01.03