계산기 만들기 Lv2

김채원·2025년 2월 26일
0

계산기 만들기

목록 보기
2/2

1. 가이드

Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기

  • 사칙연산을 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
    • 사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
    • 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
    • 1) 양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(➕,➖,✖️,➗) 기능을 수행한 후 2) 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
    • 예시 코드
      public class Calculator {
          /* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
      
          public 반환타입 calculate(...매개변수) {
              /* 위 요구사항에 맞게 구현 */
              /* return 연산 결과 */
          }
      }
  • Lv 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 입력 시 종료)");
                  ...
              /* 반복문 종료 */
          }
      }
  • 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 입력 시 종료)");
                  ...
              /* 반복문 종료 */
          }
      }
  • 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 입력 시 종료)");
                  ...
              /* 반복문 종료 */
          }
      }

2. 코드 짜기

우선 Calculator 클래스를 생성해준다
그 후에 가장 먼저 저장된 데이터를 삭제할 수 있는 컬렉션 타입 필드를 생성해주어야하므로
순서가 있는 List를 생성해준다

public class Calculator {
List<Integer> resultList = new ArrayList<>();
}

변수 이름은 결과값을 넣어줄 리스트이므로 resultList라고 지었다

그 다음 사칙연산을 수행하고 결과값을 반환하는 메서드를 만들어 준다


	private int result;

    public int calculate(int num1, int num2, char operate) {
        if (operate == '+') {
            result =  num1 + num2;
        } else if (operate == '-') {
            result =  num1 - num2;
        } else if (operate == '*') {
            result =  num1 * num2;
        } else if (operate == '/') {
            result =  num1 / num2;
        }

        return result;
    }

반환된 결과값을 받을 수 있는 변수 result도 만들어주었다
외부에서 result의 값을 함부로 변경할 수 없게 접근제어자를 사용해 막아주었다.
계산 코드는 Lv1 메인코드에 있는걸 가져왔다

public class Calculator {
private List<Integer> resultList = new ArrayList<>();
private int result;

    public int calculate(int num1, int num2, char operate) {
        if (operate == '+') {
            result =  num1 + num2;
        } else if (operate == '-') {
            result =  num1 - num2;
        } else if (operate == '*') {
            result =  num1 * num2;
        } else if (operate == '/') {
            result =  num1 / num2;
        }

        return result;
    }
}

다음으로 App클래스의 메인 메서드에서 Calcualator 클래스의 리스트에 접근하지 못하도록 private 접근제어자를 통해 막아주었다

    public void getResult() {
        System.out.println("계산 결과: " + resultList.get(resultList.size() - 1));
    }

    public void setResult(int num) {
        resultList.add(num);
    }

    public List<Integer> getResultList() {
        return resultList;
    }
    public void removeResult() {
        resultList.remove(0);
    }

Calculatore 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현해줬다

            /**연산 후 결과 반환**/
            int result = calculator.calculate(num1, num2, operator);
            calculator.setResult(result);
            calculator.getResult();
            sc.nextLine();

            /**리스트의 크기가 5보다 커지면 가장 먼저 저장된 데이터 삭제**/
            if (calculator.getResultList().size() > 5) {
                calculator.removeResult();
            }

그리고 데이터를 삭제하는 기능을 메인에 넣어주기 위해 리스트의 크기가 5보다 커지면
맨 앞의 데이터를 삭제해주는 기능을 만들었다

public boolean isNum(int num) {
        if (num < 0) {
            System.out.println("잘못된 숫자입니다.");
            return false;
        }
        return true;
    }

마지막으로 양의 정수가 아니라면 숫자를 다시 입력받을 수 있도록
검증 로직을 만들어 메인에 하나 추가해주었다

            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1 = sc.nextInt();
            if (!calculator.isNum(num1)) {
                continue;
            }

완성본

https://github.com/chaewon9999/Calculator/tree/master/src/level2

3.트러블 슈팅 및 후기

- 트러블 슈팅

  • getResult 메서드에서 resultList.get안에 인덱스의 값을 넣어줘야하는데 size값을 넣어줘 IndexOutOfBoundsException 발생
    => size에서 하나를 빼주는식으로 수정

- 후기

주어진 조건을 전부 활용해 코드를 짜는건 너무 어려웠다. 정말 많이 고민한게 get set remove를 메인에서 어떻게 사용하게 해주지? 였다. 원래 calculate의 반환타입을 List로해서 직접 add해주려고 했는데 그렇게하면 main에서 get과 set을 넣어주기가 애매한거같아 int형으로 값만 반환하게 되었다. remove는 .. 어떻게 써야될지를 진짜 모르겠어서 없는 조건을 하나 만들어주었다.
그동안 남이 적어놓은 코드만 보다가 내가 직접 무언갈 생각해서 코드를 짜다보니 확실히 실력이 엄청 늘어난 것 같다. 여러 기능을 추가해 코드를 만들었지만 메인 코드가 더 깔끔해졌나를 생각해보면 그건 아닌거 같아서 조금 아쉽다.

profile
김채원 판교간다

0개의 댓글