Skip to content

goodsmell/javascript-lotto

 
 

Repository files navigation

📍 학습 목표

  • UI와 도메인 영역을 분리할 수 있는 설계를 고민해보고, 목적에 맞게 객체와 함수를 활용
  • 단위 테스트 기반으로 점진적인 리팩터링

🎯 기능 요구 사항

어느 평화로운 개발팀, 개발하다 한번씩 심심풀이로 돌려보는 용도로 간단한 콘솔 기반의 로또 게임을 만들어 보기로 한다.

  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
  • 로또 번호는 오름차순으로 정렬하여 보여준다.
  • 로또 1장의 가격은 1,000원이다.
  • 당첨 번호와 보너스 번호를 입력받는다.
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력한다.
  • 당첨은 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원
  • 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다.
    • 재시작할 경우 구입 금액 입력부터 게임을 다시 시작하고, 종료하는 경우 그대로 프로그램을 종료시킨다.
  • 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시키고, 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.

실행 결과 예시

> 구입금액을 입력해 주세요.8000

> 당첨 번호를 입력해 주세요. 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%입니다.

> 다시 시작하시겠습니까? (y/n)

✅ 프로그래밍 요구 사항

이전 미션의 프로그래밍 요구 사항은 기본으로 포함한다.

예측 가능하고, 실수를 방지할 수 있는 코드를 작성하기 위해 노력한다.

  • 변수 선언시 const 만 사용한다.
  • 함수(또는 메서드)의 들여쓰기 depth는 1단계까지만 허용한다.
  • 함수의 매개변수는 2개 이하여야 한다.
  • 함수에서 부수 효과를 분리하고, 가능한 순수 함수를 많이 활용한다.

테스트하기 쉬운 코드에 대해 고민하고, 문제를 작은 단위로 쪼개서 접근하는 방식을 연습한다.

  • 모든 기능을 TDD로 구현하는 것을 시도하여, 테스트 할 수 있는 도메인 로직에 대해서는 모두 단위 테스트가 존재해야 한다. (단, UI 로직은 제외)

1단계

모듈화와 객체 간에 로직을 재사용하는 방법에 대해 고민한다.

  • 로또 번호와 당첨 로또 번호의 유효성 검사시 발생하는 중복 코드를 제거해야 한다.
  • 클래스(또는 객체)를 사용하는 경우, 프로퍼티를 외부에서 직접 꺼내지 않는다. 객체에 메시지를 보내도록 한다.
    • getter를 무조건 금지하는 것이 아니라 말 그대로 프로퍼티 자체를 그대로 꺼내서 객체 바깥에서 직접 조작하는 등의 작업을 지양하자는 의미입니다. 객체 내부에서 알아서 할 수 있는 일은 객체가 스스로 할 수 있게 맡겨주세요.
  • 클래스를 사용하는 경우, 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

📝 과제 진행 요구 사항

✨ 구현 기능 목록

  • 구입 금액을 입력 받는다.
  • 로또를 구입한다.
  • 구매한 로또와 당첨번호를 비교한다.
  • 당첨 결과를 반환하다.
  • 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다.

📝 테스트 목록

  • 구입 금액
    • 숫자로 입력 되었는가?
    • 양의 정수로 입력되었는가?
    • 1000원 단위로 입력 되었는가?
  • 로또
    • 6개 인가?
    • 중복되는 숫자가 없는가?
    • 1 ~ 45 사이의 숫자인가?
  • 보너스 번호
    • 당첨 번호 6개와 중복되지 않는가?
    • 1 ~ 45 사이의 숫자인가?
  • 로또 발행
    • 구입 금액에 따른 로또 장 수가 올바르게 계산되었는가?
    • 구입 금액 만큼 발행한 로또가 출력되는가?
  • 당첨 결과 계산
    • 당첨 번호와 로또 번호 일치 수 계산
      • 당첨 번호 6개가 일치 하면 1등
      • 당첨 번호 5개와 보너스번호 일치 하면 2등
      • 당첨 번호 5개가 일치 하면 3등
      • 당첨 번호 4개가 일치 하면 4등
      • 당첨 번호 3개가 일치 하면 5등
    • 일치 수에 따른 당첨 금액 계산

About

자바스크립트로 구현하는 로또 어플리케이션

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • JavaScript 97.8%
  • HTML 2.2%