우아한테크코스

우아한테크코스 - 프리코스 3주차 회고

aoaa 2022. 11. 16. 21:44

 프리코스 3주차의 미션은 로또 입니다.  구현코드

 

GitHub - Voyager003/java-lotto: 로또 미션을 진행하는 저장소

로또 미션을 진행하는 저장소. Contribute to Voyager003/java-lotto development by creating an account on GitHub.

github.com

 


1. 프로그램 설계

 기능 구현은 크게 4가지로 구분하였고, 로또 구입과 번호 생성, 당첨 번호 입력과 통계 출력으로 구분했습니다. 

exception 클래스와 상수를 나타내는 enum 같은 경우 포스트에서 따로 설명하지는 않겠습니다. 

 


2. 로또 구입

2.1 LottoPurchase

 먼저 구현목록 순서에 따라 로또를 구입하는 기능부터 구현했습니다. Console.readLine()으로 금액을 입력하여 로또를 구매하도록 했는데, 이 때 Exception에서 두 가지를 검증하도록 했습니다. 

 

 첫 번째는 isNumber로 입력한 값이 숫자인지 검증하는 메서드를 만들었습니다. 사실 작성 순서로는 첫 번째이지만 구현은 가장 마지막에 했던 것 같습니다. 왜냐하면 ApplicationTest에서 "1000j"를 입력받게되면 에러 메시지와 함께 예외를 발생시켜야 하는데 이 입력에 대해서 문자열에 대한 입력을 고려하지 않고 설계했기 때문입니다. 

 더구나 입력이 "1000j"라는 입력이 들어오는데 Integer.parseint를 사용하게 되면 NumberFormatException 발생하게 되어 try-catch로 예외 처리하는 로직을 가장 마지막에 구현했습니다. 

 

 검증을 통과하면 이 입력값이 1000으로 나눠서 나머지가 0이 아니라면 1000원 단위가 아니라고 판단하고, 구매 개수를 출력하고 로또를 구입한 금액을 반환하도록 설계했습니다.


3. 로또 번호 생성

3.1 LottoGenerator

 로또 번호를 생성하는 클래스로 주어진 라이브러리로 주어진 범위에 따른 난수를 생성하고, 정렬하고 반환했습니다.


4. 당첨, 보너스 번호 입력

4.1 WinningNumberInput

 당첨 번호를 입력받는 클래스입니다. 이제와서 느끼지만 한 클래스 안에서 당첨번호와 보너스 번호를 모두 생성하게 하여 한 클래스에 책임이 너무 많아짐을 알 수 있었습니다. (무슨 생각으로 짠건지) 아무래도 객체에 대한 이해가 너무 없었던 것 같습니다.

 

 메서드는 크게 3가지로 1) 로또 번호를 입력받고 2) ','를 기준으로 입력받고 3) 이를 int형으로 리스트에 넣는 과정을 거치고 반환하도록 했습니다. 이 때 예외 검증은 로또 번호의 입력 사이즈(6)와 다를 때, 중복된 번호를 받았을 때, 로또 번호의 숫자가 1~45의 수가 아닐 때 예외를 발생시키도록 했습니다.

 

보너스 번호도 마찬가지로 입력을 받고, 당첨 번호와 중복되지 않는지 검증 후 반환하도록 했습니다.


5. 당첨 통계

5.1 WinningResult

생성한 로또와 로또, 보너스 번호를 인자로 받아, Map의 Key에는 등수, Value에는 일치 개수를 받아 반환했습니다.

 

5.2 Rank

  반환받은 map과 로또를 구매한 가격을 입력받고, 수익률을 구하고 반환하도록 했습니다.


6. Controller의 로직 처리

 Controller에서는 게임의 전반적인 흐름이 진행되도록 설계했는데, getpurchaseLotto를 통해 로또를 생성하도록하고 Rank에서 생성한 결과를 showStatistic에서 출력하도록 했습니다.

 

 


7. 마치며

 3주차 미션을 마치고 다른 지원자들의 작성한 코드를 봤는데 참 부끄러워졌습니다. 객체 지향의 장점을 살린 여러 코드를 볼 수 있었는데, 제 코드는 전체적으로 매우 난잡하고 그저 패러미터 인자를 받고, 객체 생성 후 반환정도로 그쳤기 때문에 부족함을 많이 느꼈는데 여기서 코딩은 백문이 불어일타라는 것을 다시 한번 체감했습니다. 4주차 미션에는 더 개선되고 보기 쉬운 코드를 작성해야겠다는 의욕이 생겼습니다.