우아한 테크코스[5기] 프리코스 3주차

지종권(JiJongKwon)·2022년 11월 17일

🚀 기능 요구 사항

로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다.

- 로또 번호의 숫자 범위는 1~45까지이다.
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
- 당첨은 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원
  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
  • 로또 1장의 가격은 1,000원이다.
  • 당첨 번호와 보너스 번호를 입력받는다.
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다.

실행 결과 예시

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

8개를 구매했습니다.
[8, 21, 23, 41, 42, 43] 
[3, 5, 11, 16, 32, 38] 
[7, 11, 16, 35, 36, 44] 
[1, 8, 11, 31, 41, 42] 
[13, 14, 16, 38, 42, 45] 
[7, 11, 30, 40, 42, 43] 
[2, 13, 22, 32, 38, 45] 
[1, 3, 5, 14, 22, 45]

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

⚾ 회고

README.md

📜 기능 목록

정상기능

  • 가격에 따라 로또의 개수를 구매한다.
  • 1부터 45까지 임의의 서로 다른 수 6개를 생성한다.
  • 당첨번호 + 보너스 번호와 발행한 로또 번호와 비교할 수 있다.
    • 몇 개의 번호가 일치하는 지 알 수 있다.
    • 보너스 번호가 일치하는 지 알 수 있다.
    • 일치하는 번호의 개수에 따라 당첨금액을 알 수 있다.
  • 당첨금액에 따른 수익률을 계산할 수 있다.

예외외적인 상황

  • 구입 금액이 1000원으로 나누어 떨어지지 않는 경우 예외처리한다.
  • 사용자가 잘못된 값을 입력하는 경우 IllegalArgumentException 을 발생시키고 error 메시지를 출력한다.
    • 로또 개수의 범위(1~45) 초과를 알 수 있다.
    • 로또 번호의 중복을 확인할 수 있다.
    • 로또 개수가 6개임을 확인할 수 있다.

우선 저번 피드백을 반영하여 정상기능과 예외적인 상황을 나누어 기능목록을 작성해 보았다. 저번 2주차 때 보다 깔끔해졌다. 하지만 예외상황을 자세히 작성하지 못했다.
예를들어

  1. 보너스 번호와 로또 번호가 중복되는 경우
  2. 금액이 1000원 이하인 경우

좀 더 생각하고 기능을 정리할 필요성을 느꼈다.


함수라인

받은 피드백은 함수라인이 15라인이 넘기면 안된다는 요구사항이 있었는데, main 문도 함수인데 신경쓰지 않고 길게 작성했다.

main(){
init()
startGame()
endGame()
}

이런식으로 로직을 짜면 훨씬 깔끔하고 좋을 거 같다.


비즈니스 로직과 UI 로직을 분리한다

나의 코드를 보면 application클래스에 비즈니스 로직과 UI 로직이 같이 들어있다.
비즈니스 로직과 UI 로직을 구분하는게 유지보수 하는데 용이해 보인다.


객체는 객체스럽게 사용한다

모든 멤버변수에 getter를 생성해 놓고 상태값을 꺼내 그 값으로 객체 외부에서 로직을 수행한다면, 객체가 로직(행동)을 갖고 있는 형태가 아니고 메시지를 주고 받는 형태도 아니게 된다. 또한, 객체 스스로 상태값을 변경하는 것이 아니고, 외부에서 상태값을 변경할 수 있는 위험성도 생길 수 있다.

데이터를 꺼내지(get) 말고 메시지를 던지도록 구조를 바꿔 데이터를 가지는 객체가 일하도록 한다.

🐟 느낀점

이번 공통 피드백 중 객체는 객체스럽게 사용한다가 가장 좋았던 거 같다. 객체를 사용하는데 객체의 특성을 고려하지 않고 사용했다고 생각이 들었다. 남은 주차도 피드백을 반영해 더욱 발전해 나아가겠다.

1개의 댓글

comment-user-thumbnail
2022년 11월 20일

잘보고갑니다!

답글 달기