[BE]우테코 프리코스 3주차 회고

Amyhds·2022년 11월 16일
0

📎PR 링크

3주차_로또

📝문제 풀이

문제 링크

  • controller
    • LottoController
      start : 아래 메서드 호출, 예외 발생 시 return
      buyLotto : 사용자에게서 금액 입력 받고 Price 인스턴스 생성
      showTicket : 구입한 로또 개수 출력, Lottos 인스턴스 생성, 구입한 로또 번호 출력
      pickLuckySix : 사용자에게서 당첨 번호 6개 입력 받고 LuckySix 인스턴스 생성
      PickLuckyBonus : 사용자에게서 보너스 번호 입력 받고 LuckyBonus 인스턴스 생성
      showWinningResult : WinningResult 인스턴스 생성, 당첨 결과 출력
      showProfit : Profit 인스턴스 생성, 수익률 출력
  • model
    • enums
      • ErrorMessage : 에러 메시지 클래스
      • GameMessage : 게임 내 사용하는 메시지 클래스
      • Prize : 당첨금 클래스
    • Price
      Price : 금액 검증 및 정수 필드 price초기
      validateDigit : 금액 입력이 정수인지 확인
      validateUnderPrice : 금액이 1000원 미만인지 확인
      validateDivision : 금액이 1000단위인지 확인
      convertPriceType : stringint로 변환
      calculateCount : 로또 티켓 개수 반환
    • Lotto
      Lotto : 6자리 숫자를 검증 후 정수 리스트 필드 numbers 초기화
      validateLength : 로또 번호가 6개인지 확인
      validateRange : 로또 번호가 1~45 사이인지 확인
      validateDuplicate : 로또 번호끼리 중복되는지 확인
      printLotto : 로또 번호 출력
      isIncludeBonus : 보너스 번호를 포함하는지 판별
      hasSameElement : 다른 로또 번호와 같은 번호가 몇 개 있는지 확인
    • Lottos
      Lottos : 로또 티켓 개수 입력받고 generateNumber 메서드 호출
      generateNumber : 티켓 개수만큼 번호 생성, Randoms.pickUniqueNumbersInRange 활용
    • LuckySix
      LuckySix : 당첨 번호 검증 및 변환 후 로또 필드 luckySix초기화
      validateInvalidInput : 잘못된 입력(쉼표가 두번 들어간 경우)인지 확인
      validateSixNumber : 6개의 숫자가 들어왔는지 확인
      convertLuckySixType : stringList<Integer>로 변환
    • LuckyBonus
      LuckyBonus : 보너스 번호 검증 및 변환 후 정수 필드 luckyBonus초기화
      validateBonusDigit : 보너스 번호가 숫자인지 확인
      validateBonusRange : 보너스 번호가 1~45 사이인지 확인
      validateBonusInclude : 보너스 번호가 당첨 번호 6개와 겹치는지 확인
      convertBonusType : stringint로 변환
    • WinningResult
      WinningResult : 티켓 수, 로또 번호, 당첨 번호, 보너스 번호를 받아서 checkWinning 호출
      checkWinning : LottoisIncludeBonushasSameElement를 호출하여 5개가 같고 보너스가 포함된 경우를 먼저 빼주고, 같은 번호가 3개 이상인 경우를 처리
      "3, 4, 5, 5보너스, 6"의 개수를 담는 winningResult 정수 리스트에 결과 저장
    • Profit
      Profit : 구입 금액, 당첨 결과 리스트 받아서 calculateProfit 호출
      calculateProfit : 당첨 금액 리스트와 결과 리스트의 요소들을 하나씩 곱해서 총 수익을 계산 후 구입금액을 나눠서 수익률 계산
  • view
    • InputView
      getPrice : 사용자에게서 구입 금액 입력 받기
      getLuckySix : 사용자에게서 당첨 번호 6개 입력 받음
      getLukcyBonus : 사용자에게서 보너스 번호 입력 받음
    • OutputView
      showTicketAmount : 구입 로또 티켓 개수 출력
      showDrawNumber : 구입한 개수만큼 생성된 추첨번호 출력
      showWinningResult : 당첨 결과 출력
      printProfitRate : 수익률 출력
  • Application
    main : LottoController 객체 생성 후 start 메서드 호출

📓배운 것

1. MVC 패턴

항상 궁금했지만 이번에 처음 배웠다. 요구사항이 핵심 로직와 UI 코드를 분리하는 것이라서 알아봤다. 그래도 아무것도 모르고 겁먹었던 것 치고는 막상 배워보니 쉬운 구조였다(아마도?)
물론 본격적으로 깊게 들어가야하겠지만 그래도 시도했다는 것에 의의를!

2. 접근 제어자

지난 주차에 고민했던 접근 제어자 부분..! 사실 아직은 뭐가 좋은지는 모르겠지만 그래도 최대한 모든 객체의 접근성을 통일시켜주려고 했다.
Lotto 클래스의 numbers가 private라서 꽤 고전했지만...ㅠㅜㅠ

3. 예외 처리

와우 이번엔 예외 처리할 것이 너무 많았다. 그리고 applicationtest의 예외 테스트에서 계속 틀리는 바람에 try-catch 문에 대해 더 잘 알게 되었다. 혼자 강의로 들을 때는 잘 이해를 못했는데 역시 직접 몸으로 느껴야 잘 흡수할 수 있는 것 같다.

4. 객체 설계

MVC 패턴을 배우면서 자연스럽게 고민하게 되었다. 이 객체에는 어떤 기능이 들어가야할까? 너무 무거운게 아닐까? 많은 생각을 했다.

📌고칠 것

1. 기능마다 커밋하기

자꾸 와라락! 구현해놓고 커밋안해버리는 실수를...
나중에는 힘이 빠져서 리팩토링하면 걍 다 묶어서 커밋해버렷다;;;;;

2. 처음부터 완벽하게 하려 하지 않기

1, 2주차에 비해 유독 구현에 시간이 많이 걸렸다. 처음부터 클래스와 함수를 완벽히 나누려고 해서 그런 것 같다.

3. validator, converter

나름 많이 나눴다고 생각했지만 여전히 더 나눠야 할 것!
검증 메서드들이 많아서 이름 짓기도 어렵고.. 좀 더 간소화 할 수 있었을 텐데 아쉽다.

4. 네이밍 통일성

코드 짜면서 자꾸 새로 생기는 변수나 메서드들이 많아서 이름에 통일성을 주기 힘들었다. 코드를 전체적으로 바라보는 능력이 필요할 듯!

5. 인스턴스 변수 private로!

자꾸 다른 클래스에서 사용해야하니까 public으로 했었는데...좀 더 고민해서 private으로도 값을 활용할 수 있게 만들어야겠다.

6. 당첨 개수와 상금을 묶어서 enum으로

이렇게 좋은 방법이 있었다니! 일일이 검사하느라 복잡해졌었는데 앞으로는 연관된 것은 묶는 걸로~!

7. e.getMessage() 사용하기

굳이 출력해줄 필요가 없이 그냥 getMessage를 사용하면 되는 것 같다. 4주차부터 적용해봐야겠다.

8. 패키지 이동 주의하기

프로그래밍 요구사항에 분명히

프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.

라고 적혀있었는데...아무 생각 없이 Lotto.java를 model 패키지로 옮겨버리고 말았다...이런 실수 없어야 할 것...

❗느낀 것

와...1,2주차에 비해 정말 힘들게 성공했고 그만큼 배운게 많은 3주차였다.
우선 핵심 로직과 UI 분리하기..정말 쉽지 않았다. 하지만 시도해서 다음 미션에서 더 수월하게 할 수 있을 듯!
날 계속 괴롭히던 예외 테스트...왜 "[ERROR]"를 추가했는데 오류가 뜨지? 계속 고민했다. 결국 해결 못할 거라 생각하고 그냥 냈는데, 고민한 시간이 아까워서(그리고 나와 같은 문제를 다들 겪는 것 같아서ㅎㅎ) 자바의 예외처리를 다시 조사해봤고 실마리를 찾았다. 마침내 예제가 다 돌아갈 때의 기쁨이란..!
그리고 요구사항을 꼼꼼히 읽는 것 정말 몇번을 강조해도 모자라다. 출력 형식을 고쳐서 정말 다행이었다. 다시 컴퓨터를 키고 보지 않았더라면 못고쳤을 두가지 문제...끝날 때까지 끝난 게 아니다!!!!
4주차는 그래도 더 잘할 수 있지 않을까...?(과연) 3주차 피드백이 너무 알차고 내 실수를 저격한 것 같아 좋다(?) 더 배울 수 있는 거니까...마지막 주차도 화이팅!!!!!

profile
배우는 중입니다

1개의 댓글

comment-user-thumbnail
2022년 11월 16일

잘보고갑니다!

답글 달기