유미의 기록들

[개인 과제 -Java] 계산기 프로그램 (Level 1) 본문

대외활동 기록/내일배움캠프

[개인 과제 -Java] 계산기 프로그램 (Level 1)

지유미 2024. 7. 31. 15:10
728x90
반응형

 Java언어로 총 3단계로 이루어진 계산기 프로그램 과제를 수행하면서 궁금한 점이나 문제를 해결한 점에 대해 기록해보려고 한다

 

📌 요구사항

1. 양의 정수 2개와 사칙연산 기호 입력

     - 적합한 타입으로 선언한 변수에 저장

2. 연산을 진행한 후 결과 값을 출력한다

     - 연산 오류가 발생할 경우 해당 오류에 대한 예외처리

3. 무한으로 계산을 진행할 수 있도록 구현

      - "exit" 문자열 입력 시 종료

4. 연산 결과 10개를 저장할 수 있는 배열 생성하고 결과를 저장

      - 연산결과가 10개를 초과하는 경우, 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장되도록 구현

5. 연산결과가 무한이 저장될 수 있도록 수정 - JCF 사용

      - "remove" 문자열 입력 시 가장 먼저 저장된 결과 삭제

      - "inquiry" 문자열 입력 시 저장된 연산 결과 전부 출력 - forEach 사용

 

 

⚠️ 문제 해결 과정

배열 10개 초과하는 경우 먼저 저장된 결과를 삭제, 새로운 연산 결과 저장 어떻게 구현해야 할까

1. 배열 공간을 10칸으로 설정하고 index를 0으로 초기화

2. 전체 while문 안에 입력이 반복될 때마다 index번째에 저장하고 index++

3. 만약 index가 9가 넘어가면 index 1번째 부터 9번째까지 반복하면서 결과값들이 한 칸씩 이동하도록 구현

4. 새로운 결과값은 마지막 index에 저장

int n=10;
int results[]=new int[n];
int index=0;
if(index>n-1){
    for(int i=1;i<index;i++) {
        results[i -1] = results[i];
    }
    results[n-1]=result;
}else{
    results[index]=result;
    index++;
}

 

forEach

java 반복문에는 기본적으로 for, while문이 있다. for문에는 기본 for문, 개선된 for문, Java8에서 추가된 forEach()가 있다

//기본 for문
for(int i=0;i<list.size();i++){
	System.out.println(list.get(i);
}

//개선 된 for문
for(String str:list){
	System.out.println(str);
}
//forEach()
list.forEach(str -> System.out.println(str));

 

 

forEach() 메서드는 Java8에서 추가된 Interable인터페이스의 기본 메서드이다

https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html

 

Iterable (Java Platform SE 8 )

forEach default void forEach(Consumer  action) Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception. Unless otherwise specified by the implementing class, actions are perform

docs.oracle.com

 

forEach()는 Consumer라는 인터페이스를 전달받아 내부적으로 accept()라는 메서드를 실행하도록 구조가 되어 있다

//ArrayList 출력
System.out.print("ArrayList: ");
list.forEach(data-> System.out.print(data+" "));

 

 

📝  궁금한 점

함수 매개변수로 변수를 넘겨주는 방식 vs 전역 변수 사용하는 방식

입력받은 정수num1,num2와 연산자operator를 가지고 연산을 하는 기능을 하는 calculation()메소드를 구현하려는데 전역변수로 사용하는 것이 좋은지, 함수 매개변수로 넘겨주는 방식이 좋은 지 고민하다가 찾아보았다

함수 매개변수로 변수를 넘겨주는 방식
장점)
캡슐화: 함수가 독립적으로 동작하며, 외부 상태에 의존하지 않습니다. 이는 함수의 재사용성을 높여줍니다.
가독성: 함수 호출 시 어떤 값이 사용되는지 명확하게 알 수 있습니다.
디버깅 용이: 함수 내부에서만 값을 다루기 때문에 디버깅이 쉬워집니다.

단점)
복잡도 증가: 함수가 너무 많은 매개변수를 받게 되면 코드가 복잡해질 수 있습니다. 
부가 작업 증가: 동일한 값을 여러 함수에 전달해야 할 때 반복적인 코드가 생길 수 있습니다.

전역 변수를 사용하는 방식
장점)
단순성: 함수 간에 데이터를 공유하기 쉬워집니다.
편리함: 모든 함수에서 동일한 변수를 접근할 수 있습니다.

단점)
의존성 증가: 함수가 외부 상태에 의존하게 되어, 코드의 재사용성과 유지보수가 어려워질 수 있습니다.
디버깅 어려움: 전역 변수를 사용하는 함수가 많아질수록 어떤 함수에서 문제가 발생했는지 추적하기 어려워집니다.
예기치 않은 동작: 여러 함수가 전역 변수를 수정할 경우, 예상치 못한 버그가 발생할 가능성이 높아집니다.

 

일반적으로 코드의 가독성과 유지보수성을 높이기 위해 함수 매개변수를 사용하는 것이 좋으며, 전역변수는 반드시 필요한 경우에만 사용하고, 가능하나 범위를 최소화하는 것이 좋다는 것을 참고하여 함수 매개변수로 변수를 넘겨주는 방식을 선택했다

 

 

List와 ArrayList의 차이점

List는 인터페이스이고 ArrayList는 구현한 클래스이다

 

List의 구현클래스로는 ArrayList뿐만 아니라  위처럼 여러 클래스들이 있다

List로 선언을 한 경우 인스턴스를 ArrayList로 받을 수 있고 LinkedList로 받을 수 있다

List<Integer> list = new ArrayList<Integer>(); //유연성에서 효과
ArrayList<Integer> list = new ArrayList<Integer>();

 

두 코드는 같은 결과가 나오지만 List로 ArrayList를 생성하는 것은 유연성에 효과를 줄 수 있다. 구현체가 바뀌어도 호환이 가능하기 때문이다

 

쉽게 말해서 정사각형 (인스턴스) =new 정사각형() 보다 도형 (인스턴스) = new 정사각형() 으로 선언하면 구현체로 정사각형이나 삼각형으로 바뀌어도 호환가능 하다는 것이다 

 

더보기
package calculator;

import java.util.ArrayList;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int result=0;
        //연산 결과 저장 배열 생성
        int n=10;
        int results[]=new int[n];
        ArrayList<Integer> list=new ArrayList<>();
        int index=0;


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

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

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

            //3. 연산 후 결과값 출력 -> Calculator클래스
            try{
                Calculator calculator=new Calculator();
                result=calculator.calculate(num1,num2,operator);
                System.out.println("결과: "+result);
            }catch (ArithmeticException e){
                System.out.println("0으로 나눌 수 없습니다");
                continue;
            }catch(IllegalStateException e){
                System.out.println("연산자 형식이 맞지 않습니다");
                continue;
            }

            //6. 10개 초과하는 경우, 가장 먼저 저장된 결과 삭제, 새로운 연산 결과 저장
            if(index>n-1){
                for(int i=1;i<index;i++) {
                    results[i -1] = results[i];
                }
                results[n-1]=result;
            }
            //5.연산 결과 10개 저장할 수 있는 배열 생성 및 결과 저장
            else{
                results[index]=result;
                index++;
            }

            //7. 연산 결과 고정되지 않고 무한히 저장
            list.add(result);

            //remove입력 받으면 가장 먼저 저장된 결과 삭제
            System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
            String remove=sc.next();
            if(remove.equals("remove")){
                list.remove(0);
            }

            //8. 저장된 연산 결과 전부 출력
            System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            String inquiry=sc.next();
            if(inquiry.equals("inquiry")){
                // 배열 출력
                System.out.print("배열 : ");
                for(int num:results){
                    System.out.print(num+" ");
                }
                System.out.println();
                //ArrayList 출력
                System.out.print("ArrayList: ");
                list.forEach(data-> System.out.print(data+" "));
                System.out.println();
            }


            //4. 반복문 사용 (exit 입력 시 종료)
            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            String exit=sc.next();
            if(exit.equals("exit")) break;
        }



    }
}
728x90
반응형
Comments