TIL

TIL - 2024/05/09

기석김 2024. 5. 10. 17:49

배운 내용 🏃

 

 

개인과제 계산기 level 2를 진행했다.

요구사항 2-1

양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(+,-,*,/) 기능을

수행한 후 결과 값을 반환하는 메서드와 연산 결과를 저장하는

컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다

 

나눗셈에서 분모에 0이 들어오거나 연산자 기호가 잘 못 들어온 경우

적합한 Exception 클래스를 생성하여 throw 합니다.

(매개변수로 해당 오류 내용을 전달합니다.)

 

요구사항 참고

public class Calculator {
    /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */

    public 반환타입 calculate(...매개변수) {
        /* 위 요구사항에 맞게 구현 */
        /* return 연산 결과 */
    }
}

구현 코드

적합한 Exception 클래스를 생성하여 throw 했다

public class InvalidCalculationException extends Exception {
    public InvalidCalculationException(String message) {
        super(message);
    }
}
public class Calculator {
    private List<Integer> results; // 연산 결과를 저장하는 리스트

    public Calculator() {
        results = new ArrayList<>();
    }
    // 사칙연산 메서드
    public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
        int result = 0;
        switch (operator) {
            case '+':
                result = firstNumber + secondNumber;
                break;
            case '-':
                result = firstNumber - secondNumber;
                break;
            case '*':
                result = firstNumber * secondNumber;
                break;
            case '/':
                if (secondNumber == 0) {
                    throw new InvalidCalculationException("계산불가");
                }
                result = firstNumber / secondNumber;
                break;
            default:
                throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
        }
        results.add(result);
        return result;
    }
    public List<Integer> getResults() {
        return results;
    }
}

요구사항 2-2

Level 1에서 구현한 App 클래스의 main 메서드에

Calculator 클래스가 활용될 수 있도록 수정합니다.

 

연산 수행 역할은 Calculator 클래스가 담당합니다.

연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장됩니다

소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다

 

요구사항 참고

public class App {
    public static void main(String[] args) {
        /* Calculator 인스턴스 생성 */

        Scanner sc = new Scanner(System.in);

        /* 반복문 시작 */
            System.out.print("첫 번째 숫자를 입력하세요:");
            int num1 = sc.nextInt();
            System.out.print("두 번째 숫자를 입력하세요:");
            int num2 = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            /* 위 요구사항에 맞게 소스 코드 수정 */

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            ...
        /* 반복문 종료 */
    }
}

구현코드

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Calculator calc = new Calculator(); // Calculator 인스턴스 생성

        while (true) {
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int firstNumber = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            System.out.print("두 번째 숫자를 입력하세요: ");
            int secondNumber = sc.nextInt();

            try {
                int result = calc.calculate(firstNumber, secondNumber, operator);
                System.out.println("결과: " + result);
            } catch (InvalidCalculationException e) {
                System.out.println(e.getMessage());
            }

            System.out.println("현재 저장된 결과의 수: " + calc.getResults().size() + " " + calc.getResults());

            System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
            String removeCmd = sc.next();
            if (removeCmd.equalsIgnoreCase("remove")) {
                if (!calc.getResults().isEmpty()) {
                    calc.getResults().remove(0);
                    System.out.println("첫 번째 결과가 삭제되었습니다.");
                } else {
                    System.out.println("삭제할 결과가 없습니다.");
                }
            }
            System.out.println("저장된 연산 결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            String inquiryLook = sc.next();
            if (inquiryLook.equalsIgnoreCase("inquiry")) {
                if (!calc.getResults().isEmpty()) {
                    System.out.println("저장된 모든 결과:");
                    for (int res : calc.getResults()) {
                        System.out.println(res);
                    }
                } else {
                    System.out.println("저장된 결과가 없습니다.");
                }
            }
            System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
            String input = sc.next();
            if (input.equalsIgnoreCase("exit")) {
                break;
            }
        }
        // 종료 시 최종 저장된 결과 출력
        System.out.println("최종 저장된 결과:");
        for (int res : calc.getResults()) {
            System.out.println(res);
        }

        sc.close();
    }
}

요구사항 2-3

App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는

컬렉션 필드에 직접 접근하지 못하도록 수정합니다. (캡슐화)

 

간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현합니다. (Getter 메서드)

간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현합니다. (Setter 메서드)

위 요구사항을 모두 구현 했다면 App 클래스의 main 메서드에서 위에서 구현한 메서드를 활용 해보자

 

요구사항 참고

public class Calculator {
		/* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
		
    public 반환타입 calculate(...매개변수) {
        ...
    }
    
    /* Getter 메서드 구현 */
    /* Setter 메서드 구현 */
}

public class App {
    public static void main(String[] args) {
        /* Calculator 인스턴스 생성 */

        Scanner sc = new Scanner(System.in);

        /* 반복문 시작 */
            System.out.print("첫 번째 숫자를 입력하세요:");
            int num1 = sc.nextInt();
            System.out.print("두 번째 숫자를 입력하세요:");
            int num2 = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            /* 위 요구사항에 맞게 소스 코드 수정 */

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            ...
        /* 반복문 종료 */
    }
}

구현코드

public class Calculator {
    private List<Integer> results;

    public Calculator() {
        results = new ArrayList<>();
    }
    
    public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
        int result = 0;
        switch (operator) {
            case '+':
                result = firstNumber + secondNumber;
                break;
            case '-':
                result = firstNumber - secondNumber;
                break;
            case '*':
                result = firstNumber * secondNumber;
                break;
            case '/':
                if (secondNumber == 0) {
                    throw new InvalidCalculationException("계산불가");
                }
                result = firstNumber / secondNumber;
                break;
            default:
                throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
        }
        addResult(result); // 결과 추가
        return result;
    }

    public List<Integer> getResults() {
        return new ArrayList<>(results);
    }

    public void setResults(List<Integer> newResults) {
        this.results = new ArrayList<>(newResults);
    }

    public void addResult(int result) {
        results.add(result);
    }

    public void removeFirstResult() {
        if (!results.isEmpty()) {
            results.remove(0);
        }
    }
}

요구사항 2-4&5

Calculator 클래스에 저장된 연산 결과들 중 가장 먼저

저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후

App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정합니다.

 

Calculator 클래스에 저장된 연산 결과들을 조회하는 기능을 가진 메서드를 구현한 후

App 클래스의 main 메서드에 조회 메서드가 활용될 수 있도록 수정합니다.

 

요구사항 참고

public class Calculator {
		/* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
		
    public 반환타입 calculate(...매개변수) {
        ...
    }
    
    ...
    
    public void removeResult() {
        /* 구현 */
    }
}

public class App {
    public static void main(String[] args) {
        /* Calculator 인스턴스 생성 */

        Scanner sc = new Scanner(System.in);

        /* 반복문 시작 */
            System.out.print("첫 번째 숫자를 입력하세요:");
            int num1 = sc.nextInt();
            System.out.print("두 번째 숫자를 입력하세요:");
            int num2 = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            /* 위 요구사항에 맞게 소스 코드 수정 */

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            ...
        /* 반복문 종료 */
    }
}

구현코드

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Calculator calc = new Calculator();

        while (true) {
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int firstNumber = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            System.out.print("두 번째 숫자를 입력하세요: ");
            int secondNumber = sc.nextInt();

            try {
                int result = calc.calculate(firstNumber, secondNumber, operator);
                System.out.println("결과: " + result);
            } catch (InvalidCalculationException e) {
                System.out.println(e.getMessage());
            }

            System.out.println("현재 저장된 결과의 수: " + calc.getResults().size() + " " + calc.getResults());

            System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
            String removeCmd = sc.next();
            if (removeCmd.equalsIgnoreCase("remove")) {
                calc.removeFirstResult();
                System.out.println("첫 번째 결과가 삭제되었습니다.");
            }

            System.out.println("저장된 연산 결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            String inquiryLook = sc.next();
            if (inquiryLook.equalsIgnoreCase("inquiry")) {
                calc.inquiryResults(); // 변경
            }

            System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
            String input = sc.next();
            if (input.equalsIgnoreCase("exit")) {
                break;
            }
        }
        // 종료 시 최종 저장된 결과 출력
        System.out.println("최종 저장된 결과:");
        for (int res : calc.getResults()) {
            System.out.println(res);
        }
        sc.close();
    }
}

 

public class Calculator {
    private List<Integer> results;

    public Calculator() {
        results = new ArrayList<>();
    }

    public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
        int result = 0;
        switch (operator) {
            case '+':
                result = firstNumber + secondNumber;
                break;
            case '-':
                result = firstNumber - secondNumber;
                break;
            case '*':
                result = firstNumber * secondNumber;
                break;
            case '/':
                if (secondNumber == 0) {
                    throw new InvalidCalculationException("계산불가");
                }
                result = firstNumber / secondNumber;
                break;
            default:
                throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
        }
        addResult(result); // 결과 추가
        return result;
    }

    public List<Integer> getResults() {
        return new ArrayList<>(results);
    }

    public void setResults(List<Integer> newResults) {
        this.results = new ArrayList<>(newResults);
    }

    public void addResult(int result) {
        results.add(result);
    }

    public void removeFirstResult() {
        if (!results.isEmpty()) {
            results.remove(0);
        }
    }
    public void inquiryResults() { //추가
        if (!results.isEmpty()) {
            System.out.println("저장된 모든 결과:");
            for (int res : results) {
                System.out.println(res);
            }
        } else {
            System.out.println("저장된 결과가 없습니다.");
        }
    }

}

마무리🔥

개인과제에서 계산기 level 2-10 까지 있다

2-5까지는 쉬웠지만 그 이후부터는 어려울거 같다

어찌저찌 잘 마무리 하고 

해설과 튜터님의 피드백을 보며 코드를 바꿔야겠다

 

5월9일에 블로그를 쓰고 10일에 수정하고 발행일을 잠깐 만졌는데

10일로 쓴걸로 됐다 ㅠㅠ 블로그를 잘 보고 고쳐야겠다..