새소식

TIL

[TIL] 240429 <자바> 계산기 예외 처리

  • -
 

[TIL] 240426 <자바> 계산기 만들기

계산기 만들기 Step1. 더하기,빼기,나누기,곱하기,나머지 연산 수행하는 Calculator 클래스 생성  Calculator.javapackage week03.homework3;public class Calculator { public double calculate (String operator, int num1, int num2) {

enjoydev.tistory.com

 

*변경됨*

Calculator.java

package week04.homework4;
// 변경됨
public class Calculator {

    // AddOperation,SubstractOperation,MultiplyOperation,DivideOperation클래스들은
    // AbstractOperation 추상클래스를 상속함!

    //Calculator클래스는 4개의 연산클래스들이 상속받고있는 AbstractOperation 클래스만 포함!!!
    private AbstractOperation operation;

    //추가됨
    private int firstNumber;
    private int secondNumber;



    // Calculator 생성자
    public Calculator(AbstractOperation operation){
        this.operation = operation;
    }
    
    // 추가됨
    public Calculator(){
    }

    // setter
    public void setOperation (AbstractOperation operation){
        this.operation = operation;
    }
    
    //추가됨
    public void setFirstNumber(int firstNumber) {
        this.firstNumber = firstNumber;
    }

    public void setSecondNumber(int secondNumber) {
        this.secondNumber = secondNumber;
    }



    //더 이상 연산자 타입을 받아 구분할 필요가 없어짐
    //public double calculate (int num1, int num2) {
    //변경됨
    public double calculate() {
        double result = 0;

        //result = operation.operate(num1,num2);
        //변경됨
        result = operation.operate(this.firstNumber, this.secondNumber);

        return result;
    }
}

 

 

*추가됨*

BadInputException.java

package week04.homework4;

// 예외 클래스
public class BadInputException extends Exception {
    public BadInputException(String type) {
        super("잘못된 입력입니다! " + type + "을 입력해주세요!");
    }
}

 

 

+)

 

Step1.
CalculatorApp을 사용하여 Main 클래스 작성

 

CalculatorApp.java

package week04.homework4;

import java.util.Scanner;

public class CalculatorApp {  //계산기를 실행시켜줌

    public static boolean start() throws Exception{  //위험하다는 flag
        Parser parser = new Parser();  //Parser 인스턴스
        Scanner scanner = new Scanner(System.in);

        //유저입력을 String으로만 받기 때문에 파싱과정 필요!!
        System.out.println("첫번째 숫자를 입력해주세요!");
        String firstInput = scanner.nextLine();
        parser.parseFirstNum(firstInput);  //문자입력받아서 첫번째숫자로 변환

        System.out.println("연산자를 입력해주세요!");
        String operator = scanner.nextLine();
        parser.parseOperator(operator);  //문자입력받아서 오퍼레이터로 변환

        System.out.println("두번째 숫자를 입력해주세요!");
        String secondInput = scanner.nextLine();
        parser.parseSecondNum(secondInput);  //문자입력받아서 두번째숫자로 변환

        System.out.println("연산 결과 : " + parser.executeCalculator());
        return true;
    }

}

 

 

Main.java : try-catch 사용하여 예외처리

package week04.homework4;
// 변경됨
public class Main {
    public static void main(String[] args) {
        boolean calculateEnded = false;

        while(!calculateEnded){
            try{
                calculateEnded = CalculatorApp.start();
                //start() 실행 후 calculateEnded값이 true가 되면 !calculateEnded가 false이므로
                // 다음 while문 실행되지 않음

            } catch(Exception e){  //예외 발생 시 메시지
                System.out.println(e.getMessage());
            }
        }


    }
}

 

 


 

Step2.
CalculatorApp에서 문자열을 입력받아 int 혹은 operator로 파싱할때 사용하는 Parser.java 코드 작성

 

Parser.java

  • Pattern.matches(String 정규식, CharSequence 비교할값) : 정규식과 값을 비교하여 boolean값을 반환
  • Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
package week04.homework4;

import java.util.regex.Pattern;  //matches(정규식,비교할값) 사용 위함

public class Parser {

    // 정규식
    private static final String OPERATION_REG = "[+\\-*/]";  //오퍼레이터
    private static final String NUMBER_REG = "^[0-9]*$";  //숫자

    private final Calculator calculator = new Calculator();  //Calculator 인스턴스 사용할 것임


    public Parser parseFirstNum(String firstInput) throws Exception{

        // Pattern.matches(String 정규식, CharSequence 비교할값)
        if (!Pattern.matches(NUMBER_REG, firstInput)) {  //숫자정규식과 값이 매치하지 않을 시
            throw new BadInputException("정수값");  //예외처리
        }

        // Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
        this.calculator.setFirstNumber(Integer.parseInt(firstInput));  //calculator의 setter 사용

        return this;  //Parser 반환
    }


    public Parser parseSecondNum(String secondInput) throws Exception {

        // Pattern.matches(String 정규식, CharSequence 비교할값)
        if (!Pattern.matches(NUMBER_REG, secondInput)) {  //숫자정규식과 값이 매치하지 않을 시
            throw new BadInputException("정수값");  //예외처리
        }

        // Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
        this.calculator.setSecondNumber(Integer.parseInt(secondInput));  //calculator의 setter 사용

        return this;  //Parser 반환
    }



    public Parser parseOperator(String operationInput) throws Exception {

        // Pattern.matches(String 정규식, CharSequence 비교할값)
        if (!Pattern.matches(OPERATION_REG, operationInput)) {  //오퍼레이터 정규식과 값이 매치하지 않을 시
            throw new BadInputException("사칙 연산의 연산자");  //예외처리
        }

        switch (operationInput) {  //calculator의 setter 사용
            case "+" -> this.calculator.setOperation(new AddOperation());
            case "-" -> this.calculator.setOperation(new SubstractOperation());
            case "*" -> this.calculator.setOperation(new MultiplyOperation());
            case "/" -> this.calculator.setOperation(new DivideOperation());
        }

        return this;  //Parser 반환
    }



    public double executeCalculator() {
        return calculator.calculate();
    }
}

 

 


실행 결과

'TIL' 카테고리의 다른 글

[TIL] 240501 <자바> 쓰레드  (1) 2024.05.01
[TIL] 240430 <자바> 제네릭  (0) 2024.04.30
[TIL] 240428 <자바> 예외처리  (0) 2024.04.29
[TIL] 240426 <자바> 계산기 만들기  (0) 2024.04.26
[TIL] 240425 <자바> 상속,인터페이스  (1) 2024.04.25
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.