프로그래밍 2주차 ) 계산기 과제 Lv2 / TIL - day 12

하리비·2025년 3월 6일
4

📝 TIL

목록 보기
5/11
post-thumbnail

1️⃣개요

- 시스템 환경

Java: 17
JDK: 17.0.1
IDE: IntelliJ

- Lv2 ) 요구사항

사칙연산 수행 ,결과 저장Calculator 활용캡슐화 적용오래된 연산 결과 삭제 기능
Calculator에서 연산 수행 후 결과 반환 + 컬렉션에 저장연산 수행을 Calculator 클래스가 담당하게 할 것Calculator의 결과 필드에 직접 접근 금지 ( Getter/Setter )가장 오래된 연산 결과를 삭제하는 메서드 구현 & 활용 가능하도록 수정

- Git Hub 링크 & ReadMe



2️⃣ 구현한 기능

* 누적연산

  • 매번 새로운 연산을 수행할 때마다 결과를 초기화하는 방식이 아니라
    실제 계산기처럼 이전 연산 결과를 유지 + 이어서 연산할 수 있도록 설계했다.

* 연산 히스토리

  • 연산을 수행할 때마다 현재까지 입력한 수식과 결과값을 한 번에 출력했다

* 초기화 ( all clear ), 최근 연산 삭제 ( clear )

  • 모든 연산 기록과 결과를 한 번에 삭제할 수 있도록 했다.
  • 실수로 잘못 입력했을 때 활용할 수 있도록 마지막 입력한 숫자 + 연산 기호를 지울 수 있도록 했다.


3️⃣ 고민했던 부분

- 누적 연산 vs 1회 연산

  • 처음엔 1회 연산 방식으로 만들려 했지만, 이전 값을 유지하면서 연산을 이어가도록 구현했다.
    → 연산을 반복할 때 효율성이 좋아졌다.

- "가장 오래된 값 삭제" 기능 필요성

  • 누적 계산기이다 보니 가장 오래된 결과를 삭제하는 게 의미가 없었다.
    → 대신 clear entry (CE) 기능을 추가하기로 했다.
    → 또한 초기화(ac) 시 연산 기록을 지우도록 했다.

- 코드 가독성

  • 중복 코드가 많았고, 거의 모든 메서드에서 첫 연산을 구분하다보니
    조건문이 반복적으로 사용되면서 코드가 지저분했다.
    boolean firstCal 을 추가하면서 코드가 더 깔끔해졌다.*

→ 첫 연산 vs 이후 연산을 쉽게 구분할 수 있어서 흐름이 자연스러워졌다.

- 콘솔 출력 가독성

  • 숫자/연산 기호 입력 & 결과 출력 형식을 통일했다.
  • 구분선 길이를 맞추고, 아이콘(📜, ✅, 🔹)을 활용하면서 가독성이 좋아졌다.
    → 기존보다 정돈된 느낌이 들었다.


4️⃣ 트러블 슈팅

(이라고 말하기도 민망한,, 내가 어렵게 느꼈던 점들)

1. GitHub 사용 미숙

  • 문제
    실수로 GitHub 레포지토리를 삭제하면서, 레벨1 계산기 코드가 전부 사라졌다.
  • 해결
    레포지토리 삭제 전에 혹시 몰라 clone을 다운로드 해뒀었다. 덕분에 코드를 복구할 수 있었다.
  • 💡 배운 점
    ✔ GitHub에서 실수로 삭제할 가능성을 대비해 자주 백업을 해두자.

2. 클래스 분리

  • 문제

    • 클래스를 나눠서 메서드를 호출해야 하는데, 객체를 다루는 데 미숙했다.
      또한 기능 추가를 반복하다 보니, 초기에 지정했던 역할들이 명확하지 않고 경계가 모호해졌다.
    • 단순 객체를 생성하는 것이 아니라 특정 클래스를 참조하고, 또 다른 클래스로 받아다 준다는 개념이 어려웠다.
  • 해결

    • 해결이라고 하긴 그렇지만, 각 클래스의 역할과 관계를 그림으로 그려보는 것이 도움이 됐던것같다.
    • Main에서 Calculator를 생성한 뒤, InputCal을 만들 때 Manager에도 Calculator를 전달하여 연결했다. (나의 경우 manager를 통해 calculator를 기록 초기화 등 관리해야 하기 때문)

      📌 객체 관계 정리

      Main  
       ├── Calculator (연산 + 기록)
       ├── InputCal (입력)
             ├── Manager (계산기 초기화 및 종료) <----- 여기는 calculator를 참조해야한다!

3. 누적 연산 구현

  • 문제
    누적 연산이 가능하도록 구현을 하다보니 첫 번째 입력값을 어떻게 처리할지 애매했다.
    firstNum은 1회차 연산에만 사용되고 이후에는 필요없는 값이었다.
    1회차 연산이 끝나면 첫 숫자를 다시 입력할 필요없이 '1회차 연산 결과 값'에다 다음 연산을 해야했다.

  • 해결
    firstNum secondNum => currentNum calNum으로 변경하고
    반복문의 마지막에 currentNum = result;로 재할당해서, 다음 연산이 이전 값 기준으로 진행되도록 했다.


4. 연산 히스토리 저장

  • 문제
    실제 계산기 처럼 연산 히스토리까지 함께 출력하고 싶은데 어려웠다.

  • 해결
    stringbuiler라는 메서드를 알게 됐고 .append() 로 문자열을 이어 붙일 수 있었다.
    연산 결과를 보여줄 때마다 연산 식이 히스토리처럼 같이 보이게 구현했다.

  • 💡 배운 점
    StringBuilder.append()의 사용법


5. 기능 추가 후 저장 방식 변경

  • 문제
    연산결과를 Stringbuilder로 이어 붙였었고, 이 기록이 String 타입으로 저장되어 있다 보니 split()으로 잘라서 구분해야 하는데, 너무 어려웠다.

  • 해결
    어차피 연산 히스토리를 나중에 통으로 삭제해야 하니 List 형태로 저장하는게 적절했다
    StringBuilder 대신 List<String>을 사용하여 연산 내역을 저장하도록 변경했다.
    💡+ 이때 만든 List를 clear, allclear 기능을 만들때도 활용할 수 있었다!


6.첫 연산 여부를 구분하기

  • 문제
    누적 연산을 구현하다보니 자꾸만 첫 연산일 경우, 아닐경우를 분리해야 했다.
    main에서 반복문 안에 반복문을 넣어야 한다던지, 히스토리 출력 코드가 중복된다던지..
    코드가 지저분해지는 일들이 있었다

  • 해결
    튜터님께 피드백을 받고, 첫 연산인지 여부를 판단하는 boolean 변수를 추가했다.
    ✔ 첫 연산이라면: 처음 입력값을 받고, 연산 수행
    ✔ 이후 연산이라면: 연산 기호부터 입력받고, 바로 연산 수행
    또한 히스토리 출력할때, 최근 기록을 삭제할 때, 초기화시 등등 아주 유용하게 사용할 수 있었다.
    이 논리식 하나로 코드가 얼마나 깔끔해졌는지 모른다..!

  • 💡 배운 점
    boolean 변수를 활용해서 불필요한 구문들의 중복을 줄이고 가독성을 높일 수 있었다!
    (나는 처음부터 [첫 연산인 경우 vs n번째 연산인 경우]를 기준으로 코드를 작성하고 있었는데도,
    따로 변수를 추가해서 사용할 생각은 하지 못했었다..)

7. 에러 메시지

  • 문제
    코딩이 처음이다 보니 빨간 밑줄(에러 메시지)이 뜨는 것이 무서웠다.
    게다가 1번에 썼듯 github도 한번 날려먹었고, TIL도 사실 다 작성했었는데,
    하필 그날 !! 벨로그 서버가 터져서 글이 다 날아갔다...

  • 해결
    에러 메시지를 읽고 원인을 분석하는 습관을 들이려고 노력 중이다
    결국 날아간 글은 다시 쓰는중... 😇

  • 💡 배운 점
    ✔ 에러 메시지는 해결을 위한 힌트를 함께 보여준다!
    차분하게 분석하면 문제를 해결하는 데 오히려 도움이 된다.



5️⃣ 회고

클래스를 분리하면서부터 각 클래스의 역할과 메서드들을 구조적으로 잘 파악하는 것이 중요하다.
시간이 지나면서 어떤 기능을 어디서 수행했는지 경계가 모호해지고 역할이 섞여버린다.

커밋메세지도 일관되고 명료하게 작성하면 좋을 것 같다. 혼자하는 작업이었는데도 어디까지 했는지, 어떤 항목이 남았는지 헷갈렸다.

튜터님께 피드백 받는 걸 부끄러워 하지말자..! 모르는 부분이 많은데다가 튜터님들께는 사소할거라 생각해서 혼자 해결해보려 노력했는데, 피드백을 받고 나니 명쾌하게 해결돼서 고민했던 시간이 아까워졌었다

또한 TIL은 짧게라도 꾸준히 작성해야겠다. 분명 다 이해한 부분이라고 생각했는데도
해당 부분을 다시 응용하거나 수정할때 전에 쓴 코드를 계속 분석해야 했다..
내 언어로 쓰여진 정리본이 필요하다는걸 한번 더 느꼈다


0개의 댓글