오늘 '로또 미션' 2단계를 진행하였는데요. 너무 안 풀리는 하루였습니다. 음.. 어떻게 설계하면 좋을지 잘 모르겠더라구요. 오늘 진행한 부분과 막혔던 부분을 기록해두려 합니다.
우선 로또 2단계에서 구현할 부분은 다음과 같았습니다.
- 2등을 위한 보너스볼 하나 더 추첨, 당첨 통계에 2등 추가(기능 요구사항)
- enum 적용(프로그래밍 요구사항)
이외 제가 좀 더 구현해보고 싶었던 부분은 아래와 같습니다.
예외처리
- 입력개수 6개
- 값이 범위(1 ~ 45) 안에 들도록 할 것 →
Lotto
, 보너스 번호 모두 해당 - 같은 값이 있는지 조사
- 보너스 번호가 로또 번호 6개랑 중복되지 않도록 할 것
- 상속 관계 적용
- Lotto 클래스 만들어
List<List<Integer>>
구조 벗어나기
결과적으로 제가 좀 더 구현해보고 싶었던 부분은 비교적 막힘없이 쉽게 구현이 가능했습니다. 하나하나씩 뜯어서 살펴보면 다음과 같습니다.
Lotto 클래스 만들어
List<List<Integer>>
구조 벗어나기로또는
WinningLotto
나 랜덤으로 생성한 로또나 같은 성질인데 왜 따로 클래스가 필요할까?- 음.. 이런 고민을 해봤는데요. 결국은 필요하더라구요. 왜냐하면 보너스 숫자를 체크하려면
WinningLotto
에서 값이 더해져야 하는데 만약 없었더라도Lotto
가 보너스가 어쩔땐 있고 어쩔땐 없어야 하여서 역할이 불분명해지기 때문입니다. - 이렇게
WinningLotto
가 필요하게 되면서 상속 구조를 적용하는 것도 비교적 자연스럽게 해결가능했습니다.
- 음.. 이런 고민을 해봤는데요. 결국은 필요하더라구요. 왜냐하면 보너스 숫자를 체크하려면
예외처리
- 예외처리가 여러개인 만큼 클래스를 따로 만들어 불러오는 방식을 사용하였습니다. 처음엔
Lotto
에서 상속을 받는 방식을 고려하여 짰었습니다. - 하지만 상속의 기본적인 개념인 'is a'관계, 'is a kind of'관계라기 보다는 'has a'관계에 가깝다고 생각하여 조합을 이용하여
Lotto
나WinningLotto
생성자 안에서 예외처리를 하였습니다.
- 예외처리가 여러개인 만큼 클래스를 따로 만들어 불러오는 방식을 사용하였습니다. 처음엔
가장 많은 시간을 보내고 고민되었던 부분은 실제 2단계에서의 요구사항이었습니다. 2등을 어떻게 담아야할지 고민이 많이 되었는데요. 이전엔 일치된 숫자 개수에 따라 Map
에 넣어 ResultDto
로 보냈었습니다. '그럼 보너스 번호까지 맞은 2등은 일치된 숫자를 Map
에 넣을 때 5.5로 해야하나?' 와 같은 이상한 생각도 하곤 하였습니다. 또 7번째에 넣거나 또 6개 일치와 5개 일치 사이에 끼워넣는 것이 코드의 가독성과 이해도를 떨어뜨릴 수 있다고 생각하여 이 방법은 최대한 피하려했습니다.
그리고 전체적인 도메인의 Controller역할을 관장하는 LottoGame
클래스에서 로또 숫자 체크하는 부분은 LottoChecker
로 이관할 수 있게 설계를 해보려고 했는데요. 이 또한 LottoChecker
의 역할과 범위를 명확히 파악하지 못해서 차라리 없앨지 LottoGame
에 있는 일부 상태변수들을 가져와 여기에서 처리하고 보낼지에 대해 고민을 하였습니다.
마지막으로 enum
에 대해서도 어떻게 활용해야할지 감이 안 잡히더라구요. 나름 이해했다고 생각했는데 활용하는건 또 다른 문제이더라구요. 그래도 다행히 저녁을 먹구와 같은 백엔드 과정의 멤버들로부터 enum
수업자료 마지막에 로또 구현과 관련된 중요한 힌트가 있다는 정보를 얻어 이를 적용해보려 합니다.
이제 저도 상담 받을 때가 된 것 같습니다. 그냥 큰 고민없이 하루하루 배운거 적용하고 정리해왔는데 이렇게 마음 먹은대로 안되고 좌절을 겪으니 자존감이 한순간에 무너지는 것 같습니다. 우선 내일도 좀 더 도전해봐야겠습니다. 오늘 도전에 실패한 알고리즘 문제도요!!
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-10-25) (0) | 2018.10.25 |
---|---|
Today's Dev Notes(2018-10-24) (6) | 2018.10.24 |
Today's Dev Notes(2018-10-19) (0) | 2018.10.20 |
Today's Dev Notes(2018-10-18) (0) | 2018.10.19 |
Today's Dev Notes(2018-10-16) (0) | 2018.10.16 |