24.04.29 월 TIL(Today I Learned)

신민금·2024년 4월 29일
0
post-thumbnail

TIL(Today I Learned)

: 매일 저녁, 하루를 마무리하며 작성 !
: ⭕ 지식 위주, 학습한 것을 노트 정리한다고 생각하고 작성하면서 머리 속 흩어져있는 지식들을 정리 !

Java 개인 프로젝트

계산기 Level 1 요구사항

  1. Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있습니다.
  • 양의 정수는 각각 하나씩 전달 받습니다.
  • 양의 정수는 적합한 타입으로 선언한 변수에 저장합니다.
  1. Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있습니다.
    • 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다. (charAt(0))
  1. 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력합니다.
  • 사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행합니다.
  • 입력받은 연산 기호를 구분하기 위해 제어문을 사용합니다. (e.g.if, switch)
  • 산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력합니다. ( e.g. “나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다. “)
  1. 반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정합니다.
  • 반복문을 사용합니다. (e.g. for, while …)
  1. 연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다.
  • 연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다.
  • 연산의 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count 합니다.
  1. 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정합니다.
  • 현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고 새로운 결과 값이 마지막 index에 저장될 수 있도록 구현합니다. ( Hint : 결과 값들이 한칸씩 앞으로 이동되면 되지 않을까? )
  1. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
  • JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)
  • “remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.
  1. “inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
  • foreach(향상된 for문)을 활용하여 구현 해봅니다
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        // 1.  Scanner 를 사용하여 양의 정수
        // 2개(0 포함)를 전달 받을 수 있습니다.
        // 양의 정수는 각각 하나씩 전달 받습니다.
        // 양의 정수는 적합한 타입으로 선언한 변수에 저장합니다.

        int result = 0;
        String order = "";
        // int[] intArray = new int[10]; // 초기값 {0,0,0 ... }
        int index = 0; // 배열 인덱스를 나타내는 변수
        // 7. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
        // - JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)

        List<Integer> resultList = new ArrayList<>();




        do {

            System.out.print("첫 번째 숫자를 입력하세요: ");
            // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
            int Number1 = Integer.parseInt(sc.nextLine());
            System.out.print("두 번째 숫자를 입력하세요: ");
            // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
            int Number2 = Integer.parseInt(sc.nextLine());

            // 2. Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있습니다.
            System.out.print("사칙연산 기호를 입력하세요: ");
            // 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다
            char operator = sc.nextLine().charAt(0);

//        3. 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력합니다.
//        - 사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행합니다.
//        - 입력받은 연산 기호를 구분하기 위해 제어문을 사용합니다. (e.g.if, switch)
//        - 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력합니다.
//        - e.g. “나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다. “


            /* 제어문을 활용하여 위 요구사항을 만족할 수 있게 구현합니다.*/
            if (Number1 <= 0 && Number2 <= 0) {
                System.out.println("두 정수가 모두 0 이상이어야 합니다.");
            } else {
                switch (operator) {
                    case '+':
                        result = Number1 + Number2;
                        break;
                    case '-':
                        result = Number1 - Number2;
                        break;
                    case '*':
                        result = Number1 * Number2;
                        break;
                    case '/':
                        if (Number2 == 0) {
                            System.out.println("0으로 나눌 수 없습니다.");
                            continue;
                        }
                        result = Number1 / Number2;
                        break;
                    case '%':
                        result = Number1 % Number2;
                        break;
                    default:
                        System.out.println("올바르지 않은 연산자입니다.");
                        continue;
                }
            }

            System.out.println("결과: " + result);

            // 5. 연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다.
            // 연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다
            // 연산의 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count 합니다.
            // 연산 결과가 10개를 초과하는 경우
            // 배열에 결과 값을 추가하고, 10개를 초과하는 경우 가장 처음에 들어온 결과 값을 제거합니다.
//            if (index >= intArray.length) {
//                for (int i = 0; i < intArray.length - 1; i++) {
//                    intArray[i] = intArray[i + 1];
//                }
//                intArray[intArray.length - 1] = result; // 새로운 결과 값을 맨 뒤에 추가합니다.
//            } else {
//                intArray[index] = result; // 현재 인덱스에 결과 값을 추가합니다.
//                index++;
//            }
            //6. 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정합니다.
            // - 현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고 새로운 결과 값이 마지막 index에 저장될 수 있도록 구현합니다.
            // - Hint : 결과 값들이 한칸씩 앞으로 이동되면 되지 않을까?
            //7. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
            // - JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)
            // - “remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.

            System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
            order = sc.nextLine();
            if (order.equals("remove")) {
                // 첫 번째 결과를 삭제합니다.
                resultList.remove(0);
                // 새로운 결과 값을 맨 뒤에 추가합니다.
                resultList.add(result);
            } else {
                // 결과 값을 추가합니다.
                resultList.add(result);
                }

            // 8. “inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
            // - foreach(향상된 for문)을 활용하여 구현 해봅니다.

            System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            order = sc.nextLine();
            if (order.equals("inquiry")) {
                // 배열에 저장된 연산 결과를 출력합니다.
                for (int number : resultList) {
                    System.out.print(number + " ");
                }
            }


            System.out.print("더 계산하시겠습니까? (exit 입력 시 종료) ");
            order = sc.nextLine();

            // 4. 반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지
            // 무한으로 계산을 진행할 수 있도록 소스 코드를 수정합니다.
        } while (!order.equals("exit"));


        sc.close();
    }
}

계산기 Level 2 요구사항

  1. 양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(+,-,*,/) 기능을 수행한 후 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
  • 나눗셈에서 분모에 0이 들어오거나 연산자 기호가 잘 못 들어온 경우 적합한 Exception 클래스를 생성하여 throw 합니다. (매개변수로 해당 오류 내용을 전달합니다.)
  1. Level 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정합니다.
  • 연산 수행 역할은 Calculator 클래스가 담당합니다. 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장됩니다.
  • 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다.
  1. App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정합니다. (캡슐화)
  • 간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현합니다. (Getter 메서드)
  • 간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현합니다. (Setter 메서드)
  • 위 요구사항을 모두 구현 했다면 App 클래스의 main 메서드에서 위에서 구현한 메서드를 활용 해봅니다.
  1. Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정합니다.
  1. Calculator 클래스에 저장된 연산 결과들을 조회하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 조회 메서드가 활용될 수 있도록 수정합니다.
  1. Calculator 인스턴스를 생성(new)할 때 생성자를 통해 연산 결과를 저장하고 있는 컬렉션 필드가 초기화 되도록 수정합니다.
  1. Calculator 클래스에 반지름을 매개변수로 전달받아 원의 넓이를 계산하여 반환해주는 메서드를 구현합니다.
  • APP 클래스의 main 메서드에 Scanner를 활용하여 사칙연산을 진행할지 원의 넓이를 구할지 명령어를 입력 받은 후 원의 넓이를 구하는 것을 선택했을 때 원의 반지름을 입력 받아 원의 넓이를 구한 후 출력되도록 구현합니다. (기존에 구현되어있던 사칙연산 기능은 수정 후에도 반드시 이전과 동일하게 동작해야합니다.)
  • 이때, static, final 키워드를 활용할 수 있는지 고민한 후 활용 해봅니다. (반드시 static, final 키워드에 대한 설명과 활용한 이유에 대해 주석으로 작성합니다.)
  • 원의 넓이 결과를 저장하는 컬렉션 타입의 필드 선언 및 생성
    • 계산된 원의 넓이를 저장합니다.
    • 생성자로 초기화됩니다.
    • 외부에서 직접 접근할 수 없습니다.
    • Getter, Setter 메서드를 구현합니다.
    • 원의 넓이 결과값들을 조회하는 메서드를 구현합니다.
  1. 사칙연산을 수행하는 계산기 ArithmeticCalculator 클래스와 원과 관련된 연산을 수행하는 계산기 CircleCalculator 클래스 2개를 구현합니다.
  • 기존에 만들어둔 Calculator 클래스를 수정합니다.
  • 수정한 Calculator 클래스를 활용하여 ArithmeticCalculator, CircleCalculator 클래스를 구현 해봅니다. (상속)
  • 위 요구사항을 구현하게되면 App 클래스의 main 메서드에 오류가 발생할 겁니다.
    • 구현한 클래스들을 활용하여 오류가 발생하지 않고 활용될 수 있도록 수정 해보세요!
    • 기존에 사칙연산을 저장하던 컬렉션 필드의 타입을 Double로 변경해도 괜찮습니다.
    • 필드의 접근 제어자를 변경해도 괜찮습니다.
  1. ArithmeticCalculator 클래스의 연산 메서드에 책임(역할)이 많아 보입니다. 사칙연산 각각의 기능을 담당하는 AddOperator, SubtractOperator, MultiplyOperator, DivideOperator 클래스를 만들어 연산 메서드의 책임을 분리 해봅니다. (SRP)
  • Calculator 클래스에 사칙연산 클래스들을 어떻게 활용할 수 있을지 고민 해봅니다. (포함 관계)
  • 활용 방법을 찾아 적용했을 때 사칙연산 클래스들을 초기화 해야하는데 이때, 반드시 생성자를 활용해 봅니다.
  • 마찬가지로 ArithmeticCalculator 클래스의 연산 메서드를 수정 하더라도 이전과 똑같이 동작해야합니다.
  1. ArithmeticCalculator 클래스에 추가로 나머지 연산(%) 기능을 추가하기 위해 ModOperator 클래스를 만들어 추가합니다.
  • 추가하려고 하니 앞으로 계속 기능이 추가되면 여러 부분의 소스코드를 수정해야 한다는 생각이 들었고 “현재 비효율적인 구조가 아닌가?” 라는 의구심이 들었습니다. (따라서 소스 코드의 변경은 최소화하면서 기능을 쉽게 추가(확장)할 수 있는 방법을 고민 해봅니다. (OCP))
  • 방법을 고민 및 학습하여 적용했을 때 전체적인 소스 코드와 구조의 변경이 발생 했을 겁니다.
    • 최대한 생각한 방법으로 구현 해보세요. 틀린 답은 없습니다. 컴파일에 문제가 없고 기능이 정상적으로 동작 하면 모두 정답입니다.
    • 포기하는 것 보다 본인이 생각한데로 구현해보고 다른 개발자들과 공유 하면서 여러 가지 방법들을 확인 했을 때 실력이 가장 많이 향상됩니다.
  • 마찬가지로 수정 후에도 이전과 똑같이 동작해야합니다.

// AbstractOperation class -----------------
public abstract class AbstractOperation {
    public abstract int operate(int Number1, int Number2);
}



// AddOperator class -----------------
public class AddOperator extends AbstractOperation {
    public int answer;
    public AddOperator(){
        answer = 0;
    }

    public int operate(int Number1, int Number2) {

        answer = Number1 + Number2;

        return answer;
    }
}



// SubtractOperator class -----------------
public class SubtractOperator extends AbstractOperation{
    public int answer;

    public SubtractOperator(){
        answer = 0;
    }

    @Override
    public int operate(int Number1, int Number2) {

        answer = Number1 - Number2;

        return answer;
    }
}



// MultiplyOperator class -----------------
public class MultiplyOperator extends AbstractOperation{
    public int answer;
    public MultiplyOperator(){
        answer = 0;
    }

    @Override
    public int operate(int Number1, int Number2) {

        answer = Number1 * Number2;

        return answer;
    }
}



// DivideOperator class -----------------
public class DivideOperator extends AbstractOperation{
    public int answer;
    public DivideOperator(){
        answer = 0;
    }

    @Override
    public int operate(int Number1, int Number2) {

        answer = Number1 / Number2;

        return answer;
    }
}



// ModOperator class -----------------
public class ModOperator extends AbstractOperation{
    public int answer;

    public ModOperator(){
        answer = 0;
    }

    @Override
    public int operate(int Number1, int Number2) {

        answer = Number1 % Number2;

        return answer;
    }
}



// Calculator class -----------------
import java.util.ArrayList;
import java.util.List;

public class Calculator {
    /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
    /* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
    private static int total = 0;
    private static List<Integer> resultList;

    // 원의 넓이를 구하는 필드와 메서드 선언과 구현 ----------------------------

    /* 원의 넓이 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
    /* 원의 넓이 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
    private static double AreaTotal = 0;
    private static List<Double> AreaResultList;
    /* 원주율은 pi 이기에 상수로 생성*/
    private static final double PI = 3.141592;

    /* Calculator 기본 생성자 구현 */
    public Calculator() {
        resultList = new ArrayList<>(); // 생성자에서 컬렉션 필드 초기화
        AreaResultList = new ArrayList<>();
    }

    /* 사칙연산 저장 리스트 Getter 구현 */
    public List<Integer> getResultList() {
        return resultList;
    }

    /* 사칙연산 결과 Getter 구현 */
    public int getTotal() {
        return total;
    }

    /* 사칙연산 결과 Setter 구현 */
    public void setTotal(int total) {
        this.total = total;
    }

    /* 원의 넓이 저장 필드 Getter, Setter, 조회 메서드 구현 */
    /* 원의 넓이 결과 저장 리스트 Getter 구현 */
    public List<Double> getAreaResultList() {
        return AreaResultList;
    }

    /* 원의 넓이 결과 Getter 구현 */
    public double getAreaTotal() {
        return AreaTotal;
    }

    /* 원의 넓이 결과 Setter 구현 */
    public void setAreaTotal(double AreaTotal) {
        this.AreaTotal = AreaTotal;
    }



    public int calculate(int Number1, int Number2, char operator) throws CalculatorException {
        throw new UnsupportedOperationException("ArithmeticCalculator 또는 CircleCalculator의 calculate 메서드를 사용하세요.");
    }

    /* 원의 넓이를 구하는 메서드 선언*/
    public double calculateCircleArea(int r) throws CalculatorException {
        throw new UnsupportedOperationException("CircleCalculator의 calculateCircleArea 메서드를 사용하세요.");
    }

    // removeResult 메서드 구현
    public void removeResult() {
        //if (!resultList.isEmpty()) {
           // resultList.remove(0);
        //}
        // 첫 번째 결과 삭제 오버라이딩으로 하단에서 구현
        throw new UnsupportedOperationException("ArithmeticCalculator 또는 CircleCalculator의 removeResult 메서드를 사용하세요.");
    }

    // inquiryResults 메서드 구현
    public void inquiryResults() {

        //for (int number : resultList) {
            //System.out.print(number + " ");
        //}
        //System.out.println();

        // 배열에 저장된 연산 결과를 출력합니다.
        // 오버라이딩으로 하단에서 구현
        throw new UnsupportedOperationException("ArithmeticCalculator 또는 CircleCalculator의 inquiryResults 메서드를 사용하세요.");
    }

    AddOperator addOperator = new AddOperator();
    SubtractOperator subtractOperator = new SubtractOperator();
    MultiplyOperator multiplyOperator = new MultiplyOperator();
    DivideOperator divideOperator = new DivideOperator();
    ModOperator modOperator = new ModOperator();

    public static class ArithmeticCalculator extends Calculator {

        public ArithmeticCalculator(){
        }

        @Override
        public int calculate(int Number1, int Number2, char operator) throws CalculatorException {
            int answer = 0;
            if (Number1 <= 0 && Number2 <= 0) {
                throw new CalculatorException("두 정수가 모두 0 이상이어야 합니다.");
            } else {
                switch (operator) {
                    case '+':
                        answer = addOperator.operate(Number1, Number2);
                        break;
                    case '-':
                        answer = subtractOperator.operate(Number1, Number2);
                        break;
                    case '*':
                        answer = multiplyOperator.operate(Number1, Number2);
                        break;
                    case '/':
                        if (Number2 == 0) {
                            throw new CalculatorException("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
                        }
                        answer = divideOperator.operate(Number1, Number2);
                        break;
                    case '%':
                        answer = modOperator.operate(Number1, Number2);
                        break;
                    default:
                        throw new CalculatorException("올바르지 않은 연산자입니다.");
                }
            }
            //getResultList().add(answer);

            return answer;
        }

        // 사칙 연산의 removeResult 메서드 오버라이딩
        @Override
        public void removeResult() {
            if (!resultList.isEmpty()) {
                resultList.remove(0); // 첫 번째 결과 삭제
            }
        }

        // 사칙 연산의 inquiryResults 메서드 오버라이딩
        @Override
        public void inquiryResults() {
            // 배열에 저장된 연산 결과를 출력합니다.
            for (int number : resultList) {
                System.out.print(number + " ");
            }
            System.out.println();
        }

    }

    public static class CircleCalculator extends Calculator {
        public CircleCalculator(){

        }

        @Override
        public double calculateCircleArea(int r) throws CalculatorException {
            if (r <= 0) {
                throw new CalculatorException("반지름은 0보다 커야 합니다.");
            }
            double area = r * r * PI;
            //getAreaResultList().add(area);
            return area;
        }
        // 원의 넓이 구하기 inquiryResults 메서드 오버라이딩
        @Override
        public void inquiryResults() {
            // 배열에 저장된 연산 결과를 출력합니다.
            for (double number : AreaResultList) {
                System.out.print(number + " ");
            }
            System.out.println();
        }

    }

    // 예외 선언 !
    class CalculatorException extends Exception {
        public CalculatorException(String message) {
            super(message);
        }
    }

}




// Main ---------------------------------------------------
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        Calculator.ArithmeticCalculator arithmeticCalculator = new Calculator.ArithmeticCalculator();
        Calculator.CircleCalculator circleCalculator= new Calculator.CircleCalculator();

        // 1.  Scanner 를 사용하여 양의 정수

        int result = 0;
        String order = "";

        int index = 0; // 배열 인덱스를 나타내는 변수
        // 7. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.


        do {
            try {
                /* 사칙연산을 진행할지 원의 너비를 구할지 선택 구현 */
                System.out.print("원의 넓이 구하기 : 1. 사칙연산하기 : 2 ");
                int choose = Integer.parseInt(sc.nextLine());

                if (choose == 1) {
                    // 원의 넓이
                    /* 원의 넓이를 구하는 경우 반지름을 입력받아 원의 넓이를 구한 후 출력*/
                    System.out.print("반지름 입력: ");
                    int radius = Integer.parseInt(sc.nextLine());
                    double areaResult = circleCalculator.calculateCircleArea(radius);
                    System.out.println("원의 넓이: " + areaResult);
                    /* 원의 넓이 저장 */
                    circleCalculator.getAreaResultList().add(areaResult);
                    /* 원의 넓이 리스트 출력 */
                    circleCalculator.inquiryResults();


                } else if (choose == 2) {

                    System.out.print("첫 번째 숫자를 입력하세요: ");
                    // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
                    int Number1 = Integer.parseInt(sc.nextLine());
                    System.out.print("두 번째 숫자를 입력하세요: ");
                    // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
                    int Number2 = Integer.parseInt(sc.nextLine());

                    // 2. Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있습니다.
                    System.out.print("사칙연산 기호를 입력하세요: ");
                    // 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다
                    char operator = sc.nextLine().charAt(0);

                    // 3. 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력합니다.

                    result = arithmeticCalculator.calculate(Number1, Number2, operator);
                    //System.out.println("결과: " + result);


                    // 5. 연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다.

                    // 6. 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정합니다.

                    // 7. 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.

                    System.out.println(result);

                    System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
                    order = sc.nextLine();

                    if (order.equals("remove")) {
                        arithmeticCalculator.removeResult(); // 첫 번째 결과 삭제
                    }

                    arithmeticCalculator.getResultList().add(result);

                    // 8. “inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
                    // - foreach(향상된 for문)을 활용하여 구현 해봅니다.

                    System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
                    order = sc.nextLine();
                    if (order.equals("inquiry")) {
                        arithmeticCalculator.inquiryResults();
                    }
                }
            } catch (NumberFormatException e) {
                System.out.println("올바른 숫자를 입력하세요.");
            } catch (Calculator.CalculatorException e) {
                System.out.println("오류: " + e.getMessage());
            }

            System.out.print("더 계산하시겠습니까? (exit 입력 시 종료) ");
            order = sc.nextLine();

            // 4. 반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지
            // 무한으로 계산을 진행할 수 있도록 소스 코드를 수정합니다.

        } while (!order.equals("exit"));


        sc.close();
    }
}


알고리즘 코드카타

  • 문제 설명
    각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
    예각 : 0 < angle < 90
    직각 : angle = 90
    둔각 : 90 < angle < 180
    평각 : angle = 180
  • 제한사항
    0 < angle ≤ 180
    angle은 정수입니다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int angle) {
    
    int answer = 0;
            
    if ( 0<angle && angle<=180 ){
        if (0<angle && angle<90){
            answer = 1;
    }else if(angle == 90){
        answer = 2;
        
    }else if(90<angle && angle<180){
        answer = 3;
    }else if(angle==180){
        answer = 4;
    }else {
            answer = 0;
        }
    return answer;
}
    
}
profile
야옹

0개의 댓글