[우테코 7기] 모바일 프리코스 3주차 회고록

[3주차] 로또

 

🚀 보유 금액만큼 로또를 자동 구매하고 당첨 번호를 입력받은 뒤 당첨 통계와 수익률을 출력

  • 로또 번호의 숫자 범위는 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]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
    • Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.
  •  

실행 결과 예시

구입금액을 입력해 주세요.
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%입니다.

 

3주차 과제 구현 리포지토리

 

GitHub - medAndro/kotlin-lotto-7: 로또 미션 저장소

로또 미션 저장소. Contribute to medAndro/kotlin-lotto-7 development by creating an account on GitHub.

github.com

 

2주차 공통 피드백

이전 기수와의 공통 피드백을 미리 본 입장에서 차이점은 메타인지에 관한 내용이 추가된 정도였다고 생각한다. 대체 이것을 왜 써야하는지  현재 상황에서 이러이러한 기술을 왜 써야하는지 단점은 없는지 이런 내용들을 끊임없이 생각하며 과제에 임했던 것 같다.

 

2주차 코드리뷰 지적받은 부분

  • 상수값 대신 by lazy 선언을 하는것에 대한 조언
    • 메모리 누수의 가능성이 있다고 언급해 주셨지만 const val로 선언한 상수는 컴파일 타임에 값이 결정되어 메모리에 따로 할당 되지 않으니 그냥 상수를 쓰는것이 맞다고 생각하였다. (3주차에선 서로 관련있는 상수의 집합인 enum을 사용하였다.)
  • 클래스 내의 companion object의 위치
    • 코딩 컨벤션에 관한 내용으로 "프로퍼티, init 블록, 부 생성자, 메서드, 동반 객체" 순서로 작성해야 된다는 것을 알게 되었다. 단순히 가독성이 좋아보여서 위로 올렸는데 그러지 말아야겠다.
  • car 모델을 데이터 클래스로 사용한 이유
    • 모델을 데이터 클래스를 사용하면 외부에서 직접 속성을 변경할 수 있어 캡슐화가 깨지는 문제가 발생하였다. 가령 car.distance = 999와 같이 이동 거리 조작이 어디서나 쉽게 가능하다는 문제를 알게되었다.
  • 프로퍼티 값에 의존하는 메서드
    • 메서드 동작중 값이 변경될 가능성이 존재하므로 지양하기로 하였다.

 

3주차 과제 첫인상

2주차 자동차 경주 과제의 확장판 같은 느낌이었다. 2주차 과제를 해결했다면 무난하게 해결이 가능하지만 조금 신경써야 할 부분이 늘었다고 생각했다. 1,2주차를 진행하면서 저번 기수에 로또 과제를 이미 해보고 회고로 올렸던 글 들이 심심치찮게 보여서 로또 과제의 존재도 미리 알고는 있었다 (자세히 보지는 않았지만)

아직 공개되지는 않았지만 7기 4주차도 크리스마스 프로모션 과제의 재탕이 아닐까 싶다...

 

꿩 대신 닭 TDD대신 RAD


(다들 TDD로 개발한다고 나도 고집할 필요가 있나...? 이게 메타인지 아닐까...)

지난주에 TDD를 써서 개발을 시도해보았고  TDD의 한계인 테스트 코드 작성의 어려움 생산성이 현저하게 낮아지는걸 피부로 느꼈다.

이번주에 아무 값이나 반환시키도록 빈 메소드를 일단 만들고 구현하는 TDD접근법을 시도해보고자 하였는데 이게 과연 현재 과제에 올바른 구현 방향일까 의구심이 들었다. 그래서 다른 적합한 개발방법론은 없을까 고민하며 찾아보다가 요구사항에 단위테스트를 작성하랬지 TDD로 개발하라고 한것도 아닌데 TDD를 고집할 필요가 있을까? 라는 생각에 RAD (Rapid Application Development) 개발 방법론이 나에게 적합할 것 같아.적용해 보았다.

RAD는 짧은 주기의 신속한 개발이 필요하며 규모가 작을때 빛을 발하는 모델로서 일주일간의 과제에 사용하기에 적합하다고 생각했다. 일단 주어진 요구사항을 빠르게 분석하고 MVC같은 디자인 패턴을 어떻게 적용할 지 설계한 후 빠르게 개발하고 테스트를 진행하고 문제점을 조정하는 방식으로 TDD보다 실익이 높다고 생각했다. 하지만 빠르게 개발하는 만큼 위함 분석이 어렵다는 문제가 있어 개발에 신중함이 요구된다고 한다.

 

템플릿 MVC 프로젝트 작성

2주차에서는 평소 하던대로 개발하다가 MVC로 리팩터링 하는 과정을 통해 개발했다면 3주차는 2주차의 MVC구조를 기반으로 처음부터 MVC 패턴으로 개발하기 시작했다. 곧바로 MVC 패턴을 적용하여 개발하는것은  익숙하진 않았지만 2주차에서 골머리를 싸매가며 만들었던 구조를 통해 큰 어려움은 없이 개발을 진행할 수 있었다. 
2주차 자동차 경주를 기반으로 다음에도 써먹을 수 있도록  숫자를 입력받아 합을 출력하는 간단한 템플릿 프로젝트를 만들게 되었고 아마 4주차에서도 활용하지 않을까 싶다.

 

이번 과제를 통해 알게된 코틀린

  • enum클래스
    • 과제 요구사항에도 Enum 클래스를 적용하라고 했다. 이걸 어떻게 써먹으면 좋을까 하다가. const val로 선언하던 메시지 상수들을 enum 열거형으로 전환하였다.
    • 멤버 함수를 이용해 ERROR와 같은 접두어를 붙여서 출력하는게 가능하다는걸 알았다.
  • vararg와 spread operator
    • vararg는 메서드가 인자을 여러개 가변적으로 받게 해주며 spread operator는 배열을 펼쳐서 vararg에 전달하기 위해 사용한다.
    • 이번 과제에서는 로또 번호를 맞춘 횟수를 리스트에서 배열로, 배열에서 spread operator를 통해 String.format에 전달하여 당첨 통계를 출력하는데 활용하였다.
  • 제네릭
    • 문자열을 읽어서 검증을 한 뒤 이상이 없으면 parse하고 돌려받는 작업의 코드가 세군데 반복되는 상황에서 적용하였다.
    • 비슷한 작업을 하지만 반환 타입이 다른 세군데의 read 코드를 제네릭을 활용해 다형성을 구현하여 하나로 통합할 수 있었다..
  • 후행 람다
    • 제네릭으로 리팩터링하면서 같이 사용했다. 메서드의 마지막 인자가 함수꼴일때 괄호 바깥으로 빼낼 수 있다. 중괄호인 람다식을 그냥 괄호 안에 인자로 담아도 동일한 작업을 하지만 읽기 편하라고 후행 람다를 사용하는것 같다.

Pull Request와 과제 제출

지난주와 마찬가지로 인 CoReA의 코드 리뷰 가이드를 참고해서 PR을 작성했다.

 

 

4주차의 공부할거리

  • 공통 피드백, 코드리뷰 개선사항을 적용할것. 그리고 코드리뷰를 하며 괜찮은 부분을 배울것.
    • CoReA를 통해 6기 크루님에게 받은 리뷰가 많은 도움이 되었다.
    • 4주차에도 CoReA를 활용할 계획이지만 매칭된 다른 분들이 아직도 네분이나 리뷰를 안달아주시네... 
  • 요구사항을 꼼꼼하게 분석할 것.
    • 3주차부터 신경써야 할 요구사항이 늘어난 것이 체감된다. 4주차는 더 늘어날것 같은데 요구사항을 꼼꼼하게 그리고 빠르게 누락없이  체크하는것이 중요할 것 같다.
  • 코틀린 문법과 자바를 더 공부할것.
    • 아직도 갈길이 먼 것 같다. 이번에 제네릭을 리팩터링하며 공부하고 사용해 보았는데 사실 자바에도 존재하는 부분이다. 실전에서 사용해본적이 적어 까맣게 잊고 있었지만.