로또
## ✏ 구현 기능 목록
### 1. 로또 구입 금액을 입력 받는다.
- 1000원 단위로 입력 받는다. : "구입금액을 입력해 주세요."
- **예외: 1000원으로 나누어떨어지지 않는 경우(100,10,1의 자리가 1이상일 경우)
- **예외:IllegalArgumentException를 발생시키고, "[ERROR] 1000원 단위의 금액을 입력해 주세요." 문구를 출력 후 종료
- '입력금액 / 1000' 개의 로또를 발행한다.
- "n개를 구매했습니다." 메시지를 출력한다.
### 2. 발행한 로또 번호를 출력한다.
- n개의 리스트를 출력한다.
- 각 리스트는 1~45 사이의 중복되지 않는 6개의 숫자가 오름차순으로 정렬되어 있다.
### 3. 당첨 번호와 보너스 번호를 입력 받는다.
- 당첨 번호는 쉼표를 기준으로 구분하여 1~45 사이의 중복되지 않는 숫자 6개를 입력 받는다. : "당첨 번호를 입력해 주세요."
- 보너스 번호는 1~45 사이의 중복되지 않는 숫자 1개를 입력받는다. : "보너스 번호를 입력해 주세요."
- **예외: "[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."- **예외: "[ERROR] 당첨 번호 6개를 입력해 주세요."
### 4. 사용자의 당첨 내역을 계산한다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
### 5. 사용자의 수익률을 계산한다.
- 수익률: 총 수익 / 구입금액 * 100 (소수점 둘째 자리에서 반올림하여 소수 첫째 자리까지 나타낸다.)
### 6. 사용자의 당첨 내역과 수익률을 출력한다.
- "당첨 통계"
- "3개 일치 (5,000원) - n개"
- "4개 일치 (50,000원) - n개"
- "5개 일치 (1,500,000원) - n개"
- "5개 일치, 보너스 볼 일치 (30,000,000원) - n개"
- "6개 일치 (2,000,000,000원) - n개"
- "총 수익률은 nn.n%입니다."
이번 주 기능 요구사항 중 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력한 후 종료하는 것이 있었다. 처음에는 throw new IllegalArgumentException("[ERROR] ..."); 형식으로 처리했다. 그런데 테스트를 돌릴 때 ‘BUILD FAILED’가 나왔다.이것저것 시도해보다가 테스트 통과는 시켰으나 실행이 매끄럽지 않았다. ‘try~ catch...’를 이용해서 에러 메시지를 출력하도록 했더니 출력은 되는데 바로 종료되지 않고 다음 구문을 실행하게 됐다. ‘System.exit()’를 이용하면 바로 종료할 수 있지만 사용하지 않는 조건이 있었다. 다른 방안으로 return값을 활용해서 함수를 빠져나오도록 해보려고 시도했는데 결국 성공하지는 못했다. 코드를 다 짠 후 테스트를 진행할 것이 아니라 구현 후 바로바로 테스트를 진행해야겠다고 깨달았다. 그래야 오류가 생겼을 때 수정이 용이할 것 같다. 다 끝난 후 수정하려고 하니 정말 다 뜯어고쳐야 하는 상황이 발생했다.. 그래서 결국 수정하지 못하고 제출할 수밖에 없었던 ㅠㅠ..
완전히 해결하지 못한 에러가 있다면, 해결한 에러도 있었다!! 이것 역시 테스트를 실행할 때 발견한 에러였다. 테스트는 분명 도움이 되는 것 맞지만 날 너무너무 힘들게 한다. 기능 테스트에서 java.lang.UnsupportedOperationException 가 뜨면서 오류가 났다. List.of 와 관련된 문제인 듯하여 찾아보았더니 List를 초기화하지 않고 생성하였을 때 주로 발생한다고 하였다. 설마 내가 중첩 리스트를 사용해서 그런가 심장이 덜컥 내려앉았다. 그걸 수정해야 한다면 정말 처음부터 다시 짜야 하는 상황이었다... 최후의 보루로 남겨두고 우선 for문 밖으로 리스트를 빼보고 다른 리스트에 잠시 보관하기도 하고 이것저것 시도해봤다. 최종적으로는 new Arraylist<>()로 초기화를 해주었다. 그리고 add가 아닌 addAll 메서드로 numbers 리스트에 담아주었더니 해결됐다. newArraylist<>()로 초기화 했을 때 '와 됐다!!' 했다가 add 메서드에 빨간줄이 그어졌을 때 또다시 좌절했다..... 그러다가 addAll 메서드를 찾아서 해결했을 때 세상 행복했다.ㅎㅎ 리스트를 ArrayList로 초기화 하지 않은 상태로 값을 담으니 실행할 땐 이상이 없었지만 test에서는 오류가 발생할 수밖에!! 테스트는 역시 너무 꼼꼼하다.
지난 주에 이어 이번 주 미션을 시작하기 전에 객체 지향 언어 7강을 마저 정리했다.(이 부분은 따로 포스팅 했다.) 아직도 많이 부족하지만 일단 다시 정리하고 나니 훨씬 더 이해하면서 해결할 수 있었다. static을 사용하여 객체를 생성하지 않고 바로 메서드를 사용하는 방법도 활용해보고자 했다. 이론과 적용이 동시에 이루어지니 더 확실히 이해가 되었다. 비록 이번 미션은 해결하지 못한 부분도 있어 아쉬움도 많이 남지만, 더 많은 것을 익히고 적용할 수 있어서 뿌듯했다. 4주 차 프리코스 미션을 하기 전에는 테스트 코드를 조금 더 공부하려고 한다. 신기하고 재미있기는 한데 아직은 너무너무너무 어렵다. 테스트 코드는 이론으로 익히려고 하지 않고 예시를 최대한 많이 볼 예정이다.
이제 정말 마지막 하나의 미션만 남았다. 조금만 파이팅!!!!!!!!!!
https://github.com/sorrel012/java-lotto/tree/sorrel012
'IT 인사이트' 카테고리의 다른 글
[우아한테크코스 5기] 프리코스 4주차 미션 회고(마지막 미션) (0) | 2022.11.23 |
---|---|
[우아한테크코스 5기] 프리코스 2주차 미션 회고 (0) | 2022.11.09 |
[우아한테크코스 5기] 프리코스 1주차 미션 회고 (0) | 2022.11.02 |
KMF & KME 2022(K-Metaverse Festival & K-Metaverse Expo) 메타버스 박람회 방문기 (1) | 2022.10.17 |
2022 메타버스 코리아 박람회 방문기(KES 2022) (1) | 2022.10.08 |