기능 목록
- 로또를 1~45중 중복되지 않는 6개의 숫자로 로또를 발행하는 기능
- 오름차순으로 정렬하여 보여줄 것
- 구입 금액을 입력받는 기능
- 1000원으로 나누어 떨어지지 않는 경우는 예외처리하는 기능
- 해당하는 만큼 1000원짜리 로또를 발행하는 기능
- 발행한 로또 번호를 출력하는 기능
- 당첨 번호 6개를 입력 받는 기능
- 보너스 번호 1개를 입력 받는 기능
- 당첨 내역을 계산하는 기능
- 당첨 내역을 출력하는 기능
- 수익률을 계산하는 기능
-
Application
-
domain
- Lotto
-
service
- LottoIssueService
- LottoSortService
- LottoRankService
- LottoEarningService
-
view
- InputView
- OutputView
-
controller
- LottoController
-
util
- LottoConstant
- LottoError
- LottoPrint
변수 설명
| 변수명 | 타입 | 설명 | 기본값 |
|---|---|---|---|
numbers |
List<Integer> |
로또 번호 6개 | 없음 |
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
numbers |
List<Integer> |
로또 번호 6개 | 없음 |
- 반환값: 없음
- 설명: 6자리 숫자 리스트를 입력받아 검증을 거친 뒤 numbers 멤버에 주입
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
numbers |
List<Integer> |
로또 번호 6개 | 없음 |
- 반환값: 없음
- 설명: 6자리 숫자 리스트를 입력받아 검증
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
numbers |
List<Integer> |
로또 번호 6개 | 없음 |
- 반환값: 없음
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| 없음 | - |
- 반환값:
List<Integer>- 정렬된 번호 목록 - 설명: 멤버 변수 numbers 를 정렬한 새 리스트를 반환
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
winningNumbers |
List<Integer> |
당첨 번호 6개 | 없음 |
- 반환값:
int- 맞춘 숫자의 개수 - 설명:
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
countWin |
int |
맞춘 갯수 | 없음 |
bonusNumber |
int |
보너스 넘버 | 없음 |
- 반환값:
int- 로또 등수 - 설명: 맞춘 갯수를 입력받아 등수를 반환
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| 없음 | - |
- 반환값:
String- 로또 번호 문자열 - 설명: 로또 출력 형식 오버라이딩
변수 설명
| 변수명 | 타입 | 설명 | 기본값 / 예시 |
|---|---|---|---|
inputView |
InputView |
입력용 뷰 객체 | |
outputView |
OutputView |
출력용 뷰 객체 | |
lottoEarningService |
LottoEarningService |
수익률 계산 서비스 객체 | |
lottoIssueService |
LottoIssueService |
로또 발행 서비스 객체 | |
lottoRankService |
LottoRankService |
로또 등수 계산 서비스 객체 | |
lottoSortService |
LottoSortService |
로또 정렬 서비스 객체 |
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| 없음 | - |
- 반환값: 없음
- 설명: 생성자 - 각 멤버 객체 생성
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| 없음 | - |
- 반환값: 없음
- 설명: 로또 기능 실행
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
countRank |
int[] |
등수별 당첨 갯수 | 없음 |
- 반환값:
double- 수익률 - 설명: 등수별 당첨 갯수로 투자금과 당첨금을 계산해 수익률을 반환
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
countRank |
int[] |
등수별 당첨 갯수 | 없음 |
- 반환값:
int- 총 비용 - 설명: 총 투자 금액을 계산
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
countRank |
int[] |
등수별 당첨 갯수 | 없음 |
- 반환값:
int- 총 수익 - 설명: 총 당첨금을 계산
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
issueNumber |
int |
발행 갯수 | 없음 |
- 반환값:
List<Lotto>- 발행된 로또 목록 - 설명: 발행 갯수만큼의 로또를 발행
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| 없음 | - |
- 반환값:
Lotto- 발행된 하나의 로또 - 설명: 로또 한개를 발행
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
lottos |
List<Lotto> |
발행된 로또 목록 | 없음 |
winningNumbers |
List<Integer> |
당첨 번호 6개 | 없음 |
bonusNumber |
int |
보너스 번호 | 없음 |
- 반환값:
int[]- 각 당첨 등수별 개수 - 설명: 발행된 로또 목록과 당첨번호, 보너스 번호를 비교하여 당첨 등수별 갯수를 반환
함수 설명
| 매개변수 | 타입 | 설명 | 기본값 |
|---|---|---|---|
lottos |
List<Lotto> |
로또 번호 6개 | 없음 |
- 반환값:
List<List<Integer>>- 각 로또의 번호가 정렬된 리스트 - 설명: 로또 번호를 오름차순으로 정렬하여 리스트를 반환
상수 설명
| 상수명 | 타입 | 설명 | 값 |
|---|---|---|---|
THE_NUMBER_OF_LOTTO_NUMBER |
int |
한 로또 번호 조합의 숫자 개수 | 6 |
lottoNumberRangeStart |
int |
로또 번호의 범위 시작 | 1 |
lottoNumberRangeEnd |
int |
로또 번호의 범위 끝 | 45 |
A_LOTTO_PRICE |
int |
로또 한 장의 가격 | 1000 |
PRIZE_1st |
int |
1등 당첨 상금 | 2000000000 |
PRIZE_2nd |
int |
2등 당첨 상금 | 30000000 |
PRIZE_3rd |
int |
3등 당첨 상금 | 1500000 |
PRIZE_4th |
int |
4등 당첨 상금 | 50000 |
PRIZE_5th |
int |
5등 당첨 상금 | 5000 |
상수 설명
| 상수명 | 설명 | 메시지 |
|---|---|---|
NUMBER_COUNT_ERROR |
번호 개수 오류 | [ERROR] 형식 오류 : 로또 번호는 6개 입니다. |
NUMBER_FORMAT_ERROR |
숫자 형식 오류 | [ERROR] 형식 오류 : 숫자를 입력하세요. |
WINNING_NUMBER_INPUT_FORMAT_ERROR |
당첨 번호 형식 오류 | [ERROR] 형식 오류 : 양수 6개를 ,로 구분하여 입력하세요. |
DIVIDE_1000_ERROR |
금액 형식 오류 | [ERROR] 형식 오류 : 금액은 1000원 단위여야 합니다. |
NUMBER_RANGE_ERROR |
번호 범위 오류 | [ERROR] 범위 오류 : 번호는 1부터 45 사이의 숫자여야 합니다. |
PAYMENT_RANGE_ERROR |
지불 금액 범위 오류 | [ERROR] 범위 오류 : 지불 금액은 0보다 커야 합니다. |
NUMBER_DUPLICATED_ERROR |
중복 번호 오류 | [ERROR] 중복 오류 : 로또 번호는 중복될 수 없습니다. |
BONUS_DUPLICATED_ERROR |
중복 보너스 번호 오류 | [ERROR] 중복 오류 : 보너스 번호는 당첨 번호와 중복될 수 없습니다. |
상수 설명
| 상수명 | 설명 | 메시지 |
|---|---|---|
ASK_PAYMENT |
구입금액 입력 요청 | 구입금액을 입력해 주세요. |
ALERT_BUYING_NUMBER |
구매 개수 알림 | 개를 구매했습니다. |
ASK_WINNING_NUMBERS |
당첨 번호 입력 요청 | 당첨 번호를 입력해 주세요. |
ASK_BONUS_NUMBER |
보너스 번호 입력 요청 | 보너스 번호를 입력해 주세요. |
ALERT_START_STAT |
당첨 통계 시작 알림 | 당첨 통계\n--- |
STAT_PREFIX_1st |
1등 당첨 통계 메시지 | 6개 일치 (2,000,000,000원) - |
STAT_PREFIX_2nd |
2등 당첨 통계 메시지 | 5개 일치, 보너스 볼 일치 (30,000,000원) - |
STAT_PREFIX_3rd |
3등 당첨 통계 메시지 | 5개 일치 (1,500,000원) - |
STAT_PREFIX_4th |
4등 당첨 통계 메시지 | 4개 일치 (50,000원) - |
STAT_PREFIX_5th |
5등 당첨 통계 메시지 | 3개 일치 (5,000원) - |
STAT_SUFFIX |
통계 메시지 접미사 | 개 |
- 구입 금액 입력을 요구하는 안내 문구가 출력된다.
구입금액을 입력해 주세요.
- 로또 구입 금액을 입력한다.
- 로또 1장의 가격은 1000이다. 구입 금액만큼의 로또를 구입한다.
- 구입 금액은 양의 정수만 허용한다.
- 구입 금액은 1,000 단위만 허용한다.
8000
- 발행한 로또 수량 및 번호가 출력된다.
8개를 구매했습니다.
[4, 5, 11, 20, 44, 45]
[1, 6, 10, 25, 29, 39]
[10, 28, 34, 37, 38, 40]
[2, 19, 24, 29, 33, 38]
[6, 8, 12, 26, 30, 43]
[3, 11, 18, 21, 24, 27]
[3, 5, 6, 7, 13, 25]
[22, 26, 30, 35, 42, 45]
- 당첨 번호를 입력한다.
- 각 당첨 번호는 1부터 45사이의 양의 정수만 허용한다.
- 당첨 번호 입력은 ,를 기준으로 나누어진 6개의 양의 정수만 허용한다.
- 당첨 번호는 중복을 허용하지 않는다.
1,2,3,4,5,6
- 보너스 번호를 입력한다.
- 보너스 번호는 1부터 45사이의 양의 정수만 허용한다.
- 보너스 번호는 당첨 번호와 중복을 허용하지 않는다.
7
- 발행한 로또 번호와 당첨 번호 및 보너스 번호를 비교해 당첨 여부를 산출한다.
- 등수별 당첨 내역과 총 수익률이 출력된다.
- 수익률은 소수점 둘째 자리에서 반올림된다. (ex. 100.0%, 51.5%, 1,000,000.0%)
당첨 통계
---
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%입니다.
프로그램을 종료한다.
Process finished with exit code 0
-
view
InputView
- 지불액이 1000단위가 아닐 경우
- 지불액이 음수인경우
- 당첨 번호 형식
- 당첨 번호 6개 초과
- 당첨 번호 6개 미달
- 당첨 번호 범위
- 보너스 번호 형식
- 보너스 번호 범위
- 보너스 번호 당첨 번호와 중복
-
domain
Lotto
- 로또 번호가 중복되는 경우
- 로또 번호 6개 초과
- 로또 번호 6개 미달
-
service
- LottoIssueService
- 로또 발행 갯수
- LottoSortService
- 로또 번호 정렬
- LottoRankService
- 로또 등수 집계
- LottoEarningService
- 수익률 집계
- LottoIssueService
-
controller
LottoController
- 로또 일반 기능 테스트
- 당첨 테스트
- 비당첨 테스트
1, 2주차 공통 피드백
- 요구 사항을 정확하게 준수한다.
- 기본적인 Git 명령어를 숙지한다.
- Git으로 관리할 자원을 고려한다.
- 커밋 메시지를 의미 있게 작성한다.
- 커밋 메시지에 이슈 또는 풀 리퀘스트 번호를 포함하지 않는다.
- 풀 리퀘스트를 만든 후에는 닫지 말고 추가 커밋을 한다.
- 오류를 찾을 때 출력 함수 대신 디버거를 사용한다.
- 이름을 통해 의도를 드러낸다.
- 변수, 클래스, 메서드 이름을 축약하지 않는다.
- 공백을 의미 있게 사용하고, 스페이스와 탭을 혼용하지 않는다.
- 의미 없는 주석을 달지 않는다.
- 코드 포매팅을 사용한다.
- Java에서 제공하는 API를 적극 활용한다.
- 배열 대신 컬렉션을 사용한다.
- README.md를 상세히 작성한다.
- 기능 목록을 재검토하고 업데이트한다.
- 값을 하드 코딩하지 않는다.
- 구현 순서를 상수, 멤버 변수, 생성자, 메서드 순으로 한다.
- 변수 이름에 자료형을 포함하지 않는다.
- 한 메서드가 한 가지 기능만 담당하게 한다.
- 메서드가 한 가지 기능을 하는지 확인하는 기준을 세운다.
- 테스트를 작성하는 이유를 정리한다.
- 처음부터 큰 단위의 테스트를 만들지 않는다.
README.me
- 입력값에 대한 상세한 조건을 추가적으로 기록하였는가?
- 사용방법을 상세하게 명시하였는가?
- 프로젝트의 전체적 구조를 명시하였는가?
- 구체적인 테스트 케이스를 명시하였는가?
-
<details>,<summary>를 통해 토글 형식을 사용하였는가? - 이모티콘을 사용해 이쁘게 꾸몄는가?
리팩토링(주석)
- given/when/then 주석을 사용하였는가?
- 불필요한 주석없이 함수명으로 기능을 알 수 있는가?
리팩토링(분류)
- 메인 비즈니스 로직이 여러 개일 경우 service 모듈을 도입하였는가?
- View도 Input, Output 구분하였는가?
- yes
- 에러 메시지를 enum 또는 클래스로 관리하였는가?
- 테스트 코드를 클래스를 나누어 관리하였는가?
- 테스트 코드를 모듈별로 작성하였는가?
리팩토링(디테일)
- 최대한 세밀하게 함수화 하였는가?
- 안내문(print) 등을 상수로 표현하여 내부 enum으로 관리하였는가?
- 매직넘버를 모두 상수화하였는가?
BE 세션
- 각 변수와 함수들의 스펙을 사전 형식으로 명시하였는가?
- Getter Setter를 지양하였는가?
- 개발 과정에서 패키지를 적절히 분할하였는가?