우아한테크코스 5기 프리코스 3주차 회고

yeolyeol·2022년 11월 21일

woowa-precours-5th

목록 보기
3/3
post-thumbnail

✨요약

  • 점점 우테코 프리코스에 적응하는 것 같아, 기분이 좋아진 나

📖미션

  • 다들 로또 하나쯤은 사봤을 것이다. 바로 그 로또를 구매하고 당첨이 됐는지 확인하는 로직을 구현하는 것이 미션이다.
    로또도 역시 매우 잘 알려진 문제이다. 우테코 프리코스에서 언급한 요구사항을 잘 정리하고 꼼꼼하게 구현하면 될 것 같다는 생각이 들었다.

로또의 설명

  • 로또 번호의 숫자 범위는 1~45까지이다.
  • 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
  • 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
  • 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
    • 1등: 6개 번호 일치 / 2,000,000,000원
    • 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
    • 3등: 5개 번호 일치 / 1,500,000원
    • 4등: 4개 번호 일치 / 50,000원
    • 5등: 3개 번호 일치 / 5,000원
  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
  • 로또 1장의 가격은 1,000원이다.
  • 당첨 번호와 보너스 번호를 입력받는다.
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다.

전형적인 로또 방식이다. 현실과 조금 다른 점이 있다면, 나는 수익을 계산하지 않는다. 이유는...o(TヘTo) 추가로, 예외가 발생하면 [ERROR]로 시작하는 에러 메시지를 출력 후 종료하는 것이 추가되었다.


📃요구사항

입출력 요구사항

  • 입력

    • 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다.

      14000

    • 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.

      1,2,3,4,5,6

      -보너스 번호를 입력 받는다.

      7

  • 출력

    • 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.

      8개를 구매했습니다.
      [8, 21, 23, 41, 42, 43][3, 5, 11, 16, 32, 38]
      [7, 11, 16, 35, 36, 44][1, 8, 11, 31, 41, 42]
      [13, 14, 16, 38, 42, 45][7, 11, 30, 40, 42, 43]
      [2, 13, 22, 32, 38, 45][1, 3, 5, 14, 22, 45]

    • 당첨 내역을 출력한다.

      3개 일치 (5,000원) - 1개
      4개 일치 (50,000원) - 0개
      5개 일치 (1,500,000원) - 0개
      5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
      6개 일치 (2,000,000,000원) - 0개

    • 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)

      총 수익률은 62.5%입니다.

    • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.

      [ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.


📜추가된 요구사항

1주차와 2주차 프리코스에 이어서 코드를 구체화 하고 간단하게 하는 요구사항이 추가되었다.

  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다

    • 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.

    한 메서드에 15라인 넘지 말라는 요구사항에 '15라인이면 충분하지 않을까?'라는 안일한 생각을 했다. 실제로 구현하니 나도 모르게 15라인을 넘어버리면서 다시 리팩토링을 진행했다.

  • else 예약어를 쓰지 않는다.

    • 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
    • else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.
      이번 추가된 요구사항 중 가장 반가운 녀석이었다. 나는 코드 컨벤션을 보거나 다른 코더한테 코드리뷰를 받아본 적도 없다. 즉, 내 마음대로 코드를 작성했었다. 그래서 프리코스를 하면서 많이 고치고 있지만 else 예약어를 사용하지 않는다는 요구사항은 사실 내가 즐겨 사용했던 방식이었다. 그래서 이번 요구사항은 크게 어렵지 않았다.
  • Java Enum을 적용한다.
    예전에 인프런 강의에서 JPA 수업을 듣다가 처음 접한 녀석이다. enum의 간편함을 알게된 후로 종종 사이드 프로젝트를 하면서 사용하는데 이번 프리코스에도 사용하니 약간 반가웠다. 하지만 이렇게 무겁게(?) 사용한 적은 이번이 처음이었다.

  • 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.

    • 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
    • 단위 테스트 작성이 익숙하지 않다면 test/java/lotto/LottoTest를 참고하여 학습한 후 테스트를 구현한다.

    테스트 도구를 사용하는 것은 여전히 어려운 것 같다. 하지만 이번 기회에 자주 접하면서 적응할 예정이다.


docs/README.md

🎰로또

우아한테크코스 5기 - 프리코스 3주차 미션

📑구현 기능 목록

1. 로또 번호 생성기(COM)

  • 생성
    • 사용자가 지불한 금액만큼 로또 번호 생성
    • 로또 번호는 1에서 45사이의 수
    • 한 게임에 총 6개의 로또 번호로 구성
  • 입력
    • 로또 당첨 번호
    • 로또 보너스 번호
  • 출력
    • 당첨 통계
      • 3개부터 6개까지 일치한 게임의 수
      • 총 수익률

2. 로또 번호를 사는 사람(USER)

  • 입력
    • 로또를 구매할 개수만큼의 금액

3. 예외

  • COM
    • [ERROR] 로또 번호는 1에서 45사이의 수 입니다.

      • 입력한 로또 번호가 해당 범위를 벗어났을 경우
    • [ERROR] 로또 번호는 중복되지 않습니다.

      • 입력한 로또 번호에 중복인 값이 있을 경우
    • [ERROR] 로또 번호는 총 6개의 숫자로 구성되어 있습니다.

      • 입력한 로또 번호가 6개의 숫자가 아닐 경우
    • [ERROR] 보너스 번호는 1개 입니다.

      • 입력한 보너스 번호가 1개가 아닌 다른 값을 입력했을 경우
    • [ERROR] 로또 번호를 쉽표(,)로 구분해서 입력해주세요.

      • 6가지 로또 번호를 쉼표가 아닌 다른 방식으로 구분했을 경우
    • [ERROR]matchingCount는 유효하지 않은 값입니다.

      • 로도 당첨 경우의 수에서 벗어났을 경우

  • USER
    • [ERROR] 로또 최소 구매 금액은 1,000원 입니다.

      • 사용자가 1,000원 이하의 금액을 입력했을 경우
    • [ERROR] 로또는 1회 최대 100,000원까지 구매 가능합니다.

      • 사용자가 100,000원 넘게 구매했을 경우
    • [ERROR] 저희 복권 판매점은 거슬러 주지 않습니다.

      • 사용자가 1,000원이하의 단위로 복권을 구매했을 경우
    • [ERROR] 숫자만 입력 가능합니다.

      • 사용자가 숫자가 아닌 값을 입력했을 경우

4. 복권 판매 및 당/낙첨 진행

  • 게임 진행
    • 사용자가 구매할 로또 금액 입력
      • 입력한 금액 검증
    • 구매한 로또 개수만큼 로또 번호 생성(출력)
    • 로또 당첨 번호와 보너스 번호 입력
      • 입력한 번호 검증
    • 당첨 내역 출력
      • 예시
      3개 일치 (5,000원) - 1개
      4개 일치 (50,000원) - 0개
      5개 일치 (1,500,000원) - 0개
      5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
      6개 일치 (2,000,000,000원) - 0개

흐름도

로또 흐름도


✏️3주차를 마친 소감

1주차와 2주차에 이어 로또 문제가 나왔다. 학부생 알고리즘 수업에서 했던 문제라 반가웠다. 그 당시엔 로또 문제를 구현하는 것이 그렇게 어려웠는데, 지금 보면 매우 쉽게 구현할 수 있었다. 알고리즘 구현만 30분이면 구현하게 된 성장한 나의 모습을 보고 새삼 대견하다는 생각이 들었다.

그런 생각도 잠시, 추가된 요구사항을 확인하면서 아직 갈 길이 멀었다는 것을 알게되었다. 특히, 메서드를 15라인 이하로 작성하는 것. 가장 만만해게 봤는데 생각보다 복병이었다. 하지만 1주차와 2주차에 했던 프리코스 덕분인지 금방 메서드로 분리해서 코드를 작성할 수 있었다.

또한, README에 구현 기능 목록을 작성하는 것도 나름 능숙해졌다. 물론, 부족한 것은 많겠지만 구현 기능 목록을 작성하기 위해 필요한 요소를 찾고 작성하며, 이를 토대로 기능을 구현하게 되었다. 아직 4주차가 남아있지만 3주차까지 진행한 프리코스로도 많은 것을 배울 수 있었고 체감할 수 있었다. 마지막 4주차까지 즐겁게 프리코스를 마치고 우아한테크코스에 합격하는 모습을 보여주고 싶다.

마지막까지 화이팅

profile
한 걸음씩 꾸준히

0개의 댓글