1주차 – 문자열 덧셈 계산기

Github 주소
GitHub – java-calculator-precourse

우아한테크코스 7기 프리코스의 첫 번째 미션이 도착했다.

처음에 메일이 오지 않아 지원서가 누락됐거나 메일 주소를 잘못 작성했을까 봐 걱정했지만, 다행히 스팸함에 안전하게 있었다. 그래서 프로젝트를 하루 늦게 시작하게 되었다.

미션 내용

학습목표

  • Git, GitHub, IDE 등 실제 개발을 위한 환경에 익숙해진다.
  • 교육 분야에 맞는 프로그래밍 언어를 사용하여 간단한 문제를 해결한다.

과제 진행 요구 사항

  • 미션은 문자열 덧셈 계산기 저장소를 포크하고 클론하는 것으로 시작한다.
  • 기능을 구현하기 전 README.md에 구현할 기능 목록을 정리해 추가한다.
  • Git의 커밋 단위는 앞 단계에서 README.md에 정리한 기능 목록 단위로 추가한다.
  • 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다.

기능 요구 사항

입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.

  • 쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.
    • 예: “” => 0, “1,2” => 3, “1,2,3” => 6, “1,2:3” => 6
  • 앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 “//”와 “\n” 사이에 위치하는 문자를 커스텀 구분자로 사용한다.
    • 예를 들어 “//;\n1;2;3″과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결과 값은 6이 반환되어야 한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

프로그래밍 요구 사항

  • JDK 21 버전에서 실행 가능해야 한다.
  • 프로그램 실행의 시작점은 Application의 main()이다.
  • build.gradle 파일은 변경할 수 없으며, 제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.
  • 프로그램 종료 시 System.exit()를 호출하지 않는다.
  • 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.

라이브러리

  • camp.nextstep.edu.missionutils에서 제공하는 Console API를 사용하여 구현해야 한다.
    • 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.

입출력 요구 사항

입력

  • 구분자와 양수로 구성된 문자열

출력

  • 덧셈 결과
결과 : 6

실행 결과 예시

덧셈할 문자열을 입력해 주세요.
1,2:3
결과 : 6

구현 내용

학습 목표 확인

프로젝트 시작 전 학습 목표를 확인한다.

학습 목표

  • Git, GitHub, IDE 등 실제 개발을 위한 환경에 익숙해진다.
  • 교육 분야에 맞는 프로그래밍 언어를 사용하여 간단한 문제를 해결한다.

이번 학습 목표는 Git에 중점을 두는 듯 보였다. 따라서 이번 프로젝트는 Git과 관련된 부분에 집중해 보려고 한다.

요구 사항 분석

과제 요구 사항 분석

이번 과제의 핵심은 기능을 구현하기 전에 README.md에 기능 목록을 정리한 후, 해당 기능 단위로 commit하는 것이다.
AngularJS Git Commit Message 규칙을 이해하는 것이 필수적이라 판단했고, 이를 학습했다.

AngularJS Git Commit Message 규칙 정리

입출력 요구 사항 분석

입출력 요구 사항을 정리하면 다음과 같다.

  • 입력 가능 문자
    • 구분자: 모든 문자가 구분자로 사용될 수 있다. 단, 커스텀 구분자는 “//”와 “\n” 사이에 지정해야 한다.
    • 숫자: 입력 값은 양수로 제한되며, 음수와 0은 포함되지 않는다.
    • 조건: n > 0
  • 출력 형식
    • 출력은 “결과 : ” 뒤에 덧셈 결과를 표시한다.

기능 요구 사항 분석

각각의 기능을 단순화하여 세부 기능을 작성한다.

  1. 문자열 파싱

1.1 쉼표 또는 콜론 구분자로 분리

입력 문자열에서 쉼표(,)와 콜론(:)을 기준으로 숫자를 추출한다.
구분자가 혼합된 경우에도 이를 처리할 수 있어야 한다.
공백이 입력되더라도 정상 작동해야 한다.
예시: "1,2,3"{1, 2, 3}, "1,2:3"{1, 2, 3}, ""{}

1.2 커스텀 구분자 처리

문자열이 “//”와 “\n”으로 시작하면, 그 사이의 문자를 커스텀 구분자로 인식한다.
예시: "//;\n1;2;3" → 커스텀 구분자 ;를 사용하여 [1, 2, 3]을 추출

  1. 숫자 합산 기능

2.1 숫자 합산

파싱된 숫자들을 더한 결과를 반환한다.
입력이 빈 배열일 경우 결과는 0이어야 한다.
숫자가 하나일 경우, 그 숫자를 그대로 반환한다.
예시: {1,2,3} → 6, {1} → 1, {} → 0

  1. 예외 처리

3.1 잘못된 입력 처리

입출력 요구 사항에서 양수만 입력 받는다고 정의했으므로, 음수나 숫자가 아닌 문자가 포함된 경우 IllegalArgumentException을 발생시킨다.
예외 발생 시 애플리케이션은 종료된다.
예시: "-1,2,3"IllegalArgumentException 발생
예시: "1,a,3"IllegalArgumentException 발생

프로그래밍 요구 사항 분석

프로그래밍 요구 사항을 요약하면 다음과 같다.

  • JDK 21 버전 사용
    • IntelliJ의 경우 Project Structure에서 확인할 수 있다.
  • 프로그램의 시작점은 Applicationmain()이다.
  • 프로그램 종료 시 System.exit()를 호출하지 않는다.
  • Java Style Guide를 준수한다.
  • 입력은 camp.nextstep.edu.missionutils.ConsolereadLine()을 활용한다.

기능 목록 작성

과제 요구 사항에서 기능 목록을 구현 전에 작성하는 것을 요구했기 때문에 기능 목록부터 작성했다. 위에서 작성한 요구 사항 분석을 토대로 기능 목록을 작성한다.

v0.1 – 과제 분석

  • 프로젝트의 기능 목록을 작성한다.
    • readme.md에 요구사항 분석
    • 프로젝트 기능 목록 작성

v0.2 – 쉼표 또는 콜론 구분자 분리 기능 구현

  • 입력 문자열에서 쉼표(,)와 콜론(:)을 기준으로 숫자를 분리하는 기능을 구현한다.
    • 사용자로부터 입력 문자열을 받는다.
    • 빈 문자열을 입력 받으면 빈 배열로 반환한다.
    • 입력 문자열을 쉼표(,) 또는 콜론(:)으로 분리한다.
    • 공백이 포함된 경우에도 숫자만 추출한다.
    • 추출한 숫자를 리스트나 배열로 반환한다.

v0.3 – 커스텀 구분자 분리 기능 구현

  • 커스텀 구분자를 처리하는 기능을 구현한다.
    • 입력 문자열이 “//”와 “\n”으로 시작하는지 확인한다.
    • 커스텀 구분자를 추출하고 이를 사용하여 숫자를 분리한다.
    • 커스텀 구분자가 여러 개인 경우에도 처리할 수 있도록 구현한다.

v0.4 – 숫자 합산 기능 구현

  • 추출한 숫자 리스트나 배열을 모두 더해 합하는 기능을 구현한다
    • 숫자 배열을 입력 받아 모두 더한 값을 반환한다.
    • 빈 배열일 경우 0을 반환한다.

v0.5 – 예외 처리 기능 구현

  • 잘못된 입력에 대해 IllegalArgumentException을 발생시키는 예외 처리 기능을 구현한다.
    • 입력된 숫자가 양수가 아닐 경우 예외 발생
    • 숫자가 아닌 문자가 포함된 경우 예외 발생
    • 구분자가 두개 연속으로 입력되 경우 오류를 발생
    • 커스텀 구분자가 없을 경우 오류 발생
    • 커스텀 구분자를 받을 때 “//”(여는 문자)문자만 입력 받은 경우 오류 발생
    • 예외 발생 시 사용자에게 적절한 오류 메시지를 출력한다.

v0.6 – 테스트 케이스 추가

  • 다양한 입력에 대한 테스트 케이스를 작성하여 기능을 검증한다.
    • 정상 입력에 대한 테스트 케이스
    • 커스텀 구분자 사용 시의 테스트 케이스
    • 예외 상황에 대한 테스트 케이스
    • 경계값 입력(예: 공백 문자열, 단일 숫자 등)에 대한 테스트 케이스

v1.0 – 최종 구현 및 문서화

  • 프로그램의 모든 기능을 최종적으로 구현하고 문서화한다.
    • 각 기능에 대한 주석 및 문서 작성
    • 사용법 및 예제 추가
    • README 파일 업데이트 및 배포 준비

제출

회고 및 느낀 점

이번 미션을 두 번이나 새로 시작했다. 뭔가 완벽하게 하고 싶다는 마음이 컸던 것 같다. 하지만 이 미션은 배우는 과정이라는 것을 상기하며, 앞으로는 더 많은 것을 배우는 데 집중하려고 한다.

AngularJS Git Commit Message Conventions을 익히는 데 가장 많은 시간을 들였다. 이 규칙을 처음 접했기에 깊이 이해하려고 노력했다. 학생이자 보조 연구원으로서 활동을 했지만, 현업에서 쓰이는 규칙을 직접 경험하는 것은 쉽지 않고 생각할 기회가 없었던 것 같다. 이번 기회를 통해 Git 커밋 메시지가 협업에서 중요한 소통 수단임을 깨달았다.

또한, 팀 프로젝트에서 커밋 간격을 정하는 것이 어렵다는 점도 느꼈다. 기능 목록을 먼저 작성하고 이를 바탕으로 커밋하니 보다 효율적으로 문제를 해결할 수 있었다.

이번 경험을 통해 협업 시 중요한 소통 방법을 배웠다고 생각한다.

위로 스크롤