우아한 테크코스 3주차
2022/12/23
7 min read
RETROSPECT
3주차 프리코스의 문제는 로또였습니다
기능 요구사항은 다음과 같습니다.
- 로또 번호의 숫자 범위는 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장의 가격은 1000원이다
- 당첨 번호와 보너스 번호를 받는다
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
- 사용자가 잘못된 값을 입력할 경우 throw문을 사용해 예외를 발생시키고, "[ERROR]"로 시작하는 에러 메세지를 출력 후 종료한다.
실행결과 예시
구입금액을 입력해 주세요. 8000 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] 당첨 번호를 입력해 주세요. 1,2,3,4,5,6 보너스 번호를 입력해 주세요. 7 당첨 통계 ㅡㅡㅡ 3개 일치 (5,000원) - 1개 4개 일치 (50,000원) - 0개 5개 일치 (1,500,000원) - 0개 5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 6개 일치 (2,000,000,000원) - 0개 총 수익률은 62.5%입니다.
eslint,prettier
저번 주차에 적용하지 못 했던 eslint와prettier를 적용하여 진행해보았습니다. 컨벤션을 지키지 않았을 떄 오류가 떠서 바로바로 수정이 가능하였고 prettier를 사용해서 자동적으로 formatting을 해주어 정말 편하게 작성할 수 있었다👏🏻
어려웠던 점
이 번 주차에서는 저번 주차와는 다르게 메서드의 길이 제한이 추가되었습니다 최대 15라인이였습니다 매서드 선언부까지 포함을 하니 메인로직은 13줄안에 끝내야만 해서 로직을 분리하는데 시간이 걸렸습니다 매서드의 길이제한이 15줄이였기 때문에 매서드 하나하나 고심해가며 작성을하였습니다 이렇게 작성을 해 보니 함수별로 무엇을 하는 것 인지 알기쉬워져 가독성이 많이 올라갔다라는 것을 알게되었습니다. 코드의 양을 줄이기위해 for문을 사용하지않고 고차함수들을 많이 사용하였습니다 (forEach,map,reduce...)
추가적으로 Lotto라는 만들어진 클래스를 사용해서 구현을 해야만했습니다.
파일구조는 이처럼 구성하였습니다 크게는 Controller,View,Model(Lotto,WinningNumber)이였습니다Lotto 클래스를 어떻게 사용할까 고민하다가 저는 Lotto라는 클래스를 로또 한 장이라고 생각하고 진행하였습니다 저번주차에 MVC패턴을 사용하여 풀었던 분들이 많으셔서 저 또한 MVC패턴을 적용하여 풀어보려고 했습니다.
MVC를 적용하면서 잘못된 부분이 많았던 것 같습니다 view가 controller를 의존한다던지 Model은 비지니스 로직을 수행할 수 없다는지 Controller에서 다른 클래스를 인스턴스할때 this를 넘겨주어 의존성을 주입하는 방식 등 많은 부분들이 이게 맞나? 이렇 게 해도 되는건가? 라는 의구심이 많이 들었습니다. MVC라는 패턴을 처음 접하기도하고 객체지향적으로 작성하는 것이 아직 익숙치가 않아 부족함이 많이 보여 공부가 많이 필요하다라는 것을 느끼게 되었습니다.
private
처음에 주어진 Lotto라는 클래스에 #이 붙어있는 프로퍼티가 눈에 띄었다. 구글에 검색해보니 은닉화로 자바스크립트의 단점인 캡슐화와 은닉화를 보완하고자 나왔다고 한다 private를 필요한 곳에 적절히 사용하지 못해 아쉬웠다 다음 번에는 필요한 부분에 꼭 사용하기를 바란다✊🏻