- 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 로직은 제외)
모듈화와 객체 간에 로직을 재사용하는 방법에 대해 고민한다.
- 로또 번호와 당첨 로또 번호의 유효성 검사시 발생하는 중복 코드를 제거해야 한다.
- 클래스(또는 객체)를 사용하는 경우, 프로퍼티를 외부에서 직접 꺼내지 않는다. 객체에 메시지를 보내도록 한다.
- getter를 무조건 금지하는 것이 아니라 말 그대로 프로퍼티 자체를 그대로 꺼내서 객체 바깥에서 직접 조작하는 등의 작업을 지양하자는 의미입니다. 객체 내부에서 알아서 할 수 있는 일은 객체가 스스로 할 수 있게 맡겨주세요.
- 클래스를 사용하는 경우, 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 구입 금액을 입력 받는다.
- 로또를 구입한다.
- 구매한 로또와 당첨번호를 비교한다.
- 당첨 결과를 반환하다.
- 당첨 통계를 출력한 뒤에는 재시작/종료 여부를 입력받는다.
- 구입 금액
- 숫자로 입력 되었는가?
- 양의 정수로 입력되었는가?
- 1000원 단위로 입력 되었는가?
- 로또
- 6개 인가?
- 중복되는 숫자가 없는가?
- 1 ~ 45 사이의 숫자인가?
- 보너스 번호
- 당첨 번호 6개와 중복되지 않는가?
- 1 ~ 45 사이의 숫자인가?
- 로또 발행
- 구입 금액에 따른 로또 장 수가 올바르게 계산되었는가?
- 구입 금액 만큼 발행한 로또가 출력되는가?
- 당첨 결과 계산
- 당첨 번호와 로또 번호 일치 수 계산
- 당첨 번호 6개가 일치 하면 1등
- 당첨 번호 5개와 보너스번호 일치 하면 2등
- 당첨 번호 5개가 일치 하면 3등
- 당첨 번호 4개가 일치 하면 4등
- 당첨 번호 3개가 일치 하면 5등
- 일치 수에 따른 당첨 금액 계산
- 당첨 번호와 로또 번호 일치 수 계산