[내일배움캠프 10일차] Calculator 과제 Level2 마무리, Level3 마무리

김현정·2025년 3월 4일
0

Level 2

Level2에서는 클래스활용을 이용하여 계산기를 만드는 과정을 하였습니다.
전체적인 흐름 :

  • 양의 정수 (0을 포함)를 두 개를 입력받는다.
  • 사칙연산 기호를 매개변수로 입력받아 Calculator클래스에서 기능을 수행한다
  • 결과 값을 Calculator에서 반환받아 출력한다
  • 결과 값을 컬렉션으로 저장하여 저장하고 값을 넣고 제거하는 방법을 활용한다.

여기에서 저는 양의 정수 두 개를 입력받는 과정에서 양의 정수가 아닌 다른 자료형이라던가, 음의 정수 등 다른 것을 입력받을 오류와, 사칙연산 기호를 입력받는 과정에서도 같은 오류가 발생할 것 같기에 클래스를 3개로 만들었습니다.

메인 메서드가 들어있는 App 클래스

계산기 역할을 해주는 Calculator 클래스

입력한 값을 관리해주는 InputManner

이렇게 코드를 구현하였습니다.
잘못된 값을 입력받더라도 다시 입력받을 수 있게 하였고,
기호에 따라 계산하여 결과값을 도출하고,
결과값을 저장한 뒤에 삭제 유무를 확인하는 등 여러가지 기능을 추가하였습니다.

여기서 트러블 슈팅이 일어난 곳은 여러 군데가 있었습니다.

첫 번째

InputMannger클래스에서 positiveInteger2()메소드에서
[두 번째 숫자를 입력하세요. : ]부분에서 값을 입력을 하면 엔터와 같이 출력이 되어서 다음 operatorAnswer() 메소드 부분인 사칙연산 기호를 입력받는 부분에서 엔터로 인해서 입력을 받지않고 그냥 넘어가서 오류가 발생하는 부분이 생겼습니다.

해결 방법 :
y = scanner.nextInt();부분 다음에 바로 scanner.nextLine();를 넣어주는 것 입니다.
이유 : 예를들어서 y값에 3을 입력하고 엔터를 누른다면 입력된 값은 3+엔터 이기에 scanner.nextLine();가 엔터(공백)을 없애주는 역할을 하여 버퍼를 없애주었습니다.

처음 격는 일이다보니 구글링을 통해서 방법을 찾기도하고 튜터님께 찾아가서 물어보기도 하였습니다.

두 번째

InputMannger클래스에서 operatorAnswer() 메소드에서 사칙연산 기호를 입력받는 과정에서 다시 입력을 받는 부분을 어떻게 코드를 구현할까 고민을 하였습니다.
처음에는 try- catch문을 사용하여 예외를 처리하여 다시 작동하게 하는 것을 하고싶었습니다.
하지만 while문과 try문을 배치가 어려웠습니다. 그리하여 튜터님께 찾아가 조문을 구하였습니다.

해결 방법 :
try-catch문을 구현할 필요가 없었습니다. 즉 예외처리를 하지않아도 되는 것은 int값에서 다른 형변환은 많이 이루어지기에 예외처리가 필요했지만 String은 자료형이 고정이기에 if문만 사용해도 된다고 하였습니다. (확실하지는 않습니다) 그리하여 while문에서 if문이 만족이 되면 break가 되는 코드를 구현하였습니다.

세 번째

InputMannger클래스에서 removeFirstIdxFromResultPrice() 메소드에서 값을 저장한 리스트에서 가장 앞에 있는 결과 값을 지우기 위한 코드를 구현하는 과정에서 결과 값을 컬렉션으로 바꾸고 값을 저장하는 과정에서 클래스에 여러 개다보니 스스로 어느 부분에서 수정해야하는지 감이 안잡혔습니다. Calculator 클래스에서도 형이 변환이 되고, InPutMannger에서도 수정 부분을 고치는 과정에서 햇갈리기도 했습니다. 또한, 결과값을 표현하는 변수명이 다 result여서 어느 result인지 어려워서 다시 변수값을 수정하기도 하였습니다.

해결 방법 : result 지역변수, 인스턴스 변수 구분을 위해서 변수이름 수정(디테일하게), int의 result를 List(Integer)값으로 변경 등 여러과정을 거쳤습니다.

깨달은 부분은 변수명을 자세히 기록해야지 햇갈리지 않고 잘 입력할 수 있다는 생각을 하였습니다.

Level 3

level3에서는 level2를 기반으로 Enum과 제네릭, 람다 & 스트림을 활용하여 계산기를 만드는 것이였습니다.
여기서는 클래스 명도 바꿔지기도 하여 새롭게 바꾸는 코드도 있고 그대로 유지하는 경우도 있었습니다.

메인 메서드가 들어있는 App 클래스

계산기 역할을 해주는 ArithmeticCalculator 클래스

입력한 값을 관리해주는 InputManner(변경 된 부분만 사진) 클래스

사칙연산 기호을 관리해주는 OperatorType enum

이렇게 코드를 수정하였습니다.
사칙연산 기호를 관리해주는 enum이 추가되었고, 제네릭을 사용하여 자유롭게 형변환이 일어날 수 있게 하였습니다. 또한 람다와 스트림을 활용하여 코드의 가독성과 유지보수성을 높였습니다.

여기서는 트러블슈팅이 일어난 부분은 전체적으로 있었던 것 같습니다.

일단 저는 enum을 잘 알지못하여 개인적으로 공부를 하였습니다.
enum은 어떻게 구현하고 어떻게 구성하는지 알아보았습니다.

enum을 작성하는 과정에서 Plus 속성을 지정하고 그에 맞는 람다표현식을 정의하여 입력하고 생성자 부분에서 기호들을 정의하는 과정에서 감이 안잡혀서 구글링을 많이하여 알아보고 입력해보고 하였습니다. 어찌저찌하여 코드를 구현을 하였을 때는 그 enum을 App 클래스에서도 Calculator클래스에서도 수정을 해야하는 과정에서 어느 부분을 바꿔야하지 제네릭을 활용해 바꾸는 과정도 쉽지않았습니다.

그렇기에 튜터님께 찾아가서 방향성을 잡고 하나하나 천천히 수정하였습니다.

아직은 제네릭, 람다, 스트림, enum등이 익숙하지는 않지만 스스로 다시 공부하고 찾아보면서 정리하려고합니다.

아직은 많이 부족한 첫 과제이지만 조금씩 발전해나아가려 합니다.

0개의 댓글