Post

(회고) 우아한 프리코스 3주차

Woowahan tech course, First step to mobile developer

(회고) 우아한 프리코스 3주차

우아한 프리코스 7기 3주차 회고

3주차 미션 내용을 보고 싶으신 분들은 가볍게 3주차 미션 챕터로 넘어가시면 되겠습니다. ㅎ

프리코스의 마지막으로 다가가면서, 점점 미션이 어려워졌다.
3주차 미션은 간단한 로또 발매기를 구현하는 것이었는데,
미션 요구 사항에서 Lotto 클래스를 사용해야 한다고 작성되어 있어 모든 기능을 꾸역꾸역 Lotto 클래스 내부에 두는 실수를 저질렀다.,,
이런 방식으로 기능을 구현하는게 이해가 되지 않았지만, 우선 요구 사항을 따르면서 문제점을 짚어 가는 방향으로 이번 미션에 임하였다.

학습 목표

이번 주차의 학습 목표도 지난 주차와 동일하게 함수를 기능별로 나누는 것과, 테스트 도구를 활용하는 것이었다.
추가적으로 2주차에 대한 공통 피드백은 아래와 같았다.

2주차 공통 피드백

아래 작성한 공통 피드백은 전체 내용에서 내가 중요하다고 생각하고, 이번 미션에서 염두해 두면서 구현을 해야겠다고 생각한 내용 위주로 정리했다.

  • 살아있는 README 파일 유지하기.
    README 파일은 프로젝트의 첫 인상이며, 프로젝트에 대한 주요 기능과 목적을 나타내는 곳이다. 따라서 README 파일을 상세히, 독자가 알고자 하는 것이 무엇인지 고려하여 작성하는 것이 필요하다.
    또한, README 파일을 관심있게 지켜보면서 살아있는 README로 유지하는 것이 중요하다.

  • 구현 순서도 코딩 규칙(coding convention)이다.
    코딩 규칙에는 변수 이름 작성 방법을 시작으로 상세한 규칙들이 있다. 클래스 내에서 상수, 프로퍼티, init 초기화 블록은 상단에 배치하고, 생성자와 관련된 로직은 초기화 블록과 함께 클래스 앞 부분에 위치시켜야 한다.
    이러한 규칙들이 강제되는 것은 아니지만, 코드를 통해 소통을 할 때 필요시 되는 것이다.

    코틀린 이렇게 작성하시면 됩니다. 블로그에서 코틀린 코딩 규칙에 대해 상세히 설명되어 있어 같이 첨부합니다.

  • 테스트를 작성하는 이유에 대해 본인의 경험을 토대로 정리해본다.

프리코스를 진행하면서, 가장 어려웠던 부분은 테스트 코드를 통해 예외를 처리하는 것이었다. 프리코스 참여자들의 디스코드 채널에서 미션이 끝날 때마다 예외 처리 방법, 프로그램 구현 방법 등에 대한 많은 정보를 공유한다. 나는 특히 참여자들의 예외를 어떻게 처리하였는가에 대해 많은 관심을 기울여 보게 된다. 이 중에는 많은 사람들이 합리적으로 생각하여 처리한 부분이 있기도 하지만, 남들과 다른 경험으로 예외를 처리한 경우들이 있었다. 따라서 이런 부분에 집중해보고 나도 그곳에서 경험을 쌓을 수 있도록 노력했다.
추가적으로, 발생할 수 있는 예외를 가정하고 처리하는 과정에서 코드의 전반적인 구조가 달라 질 수 있다고 개인적으로 생각한다.


3 주차 미션


3주차 미션은 간단한 로또 발매기를 구현하는 것이었다.

기능 요구 사항

  • 로또 번호의 숫자 범위는 1~45임.
  • 1개의 로또는 1,000원이며, 중복되지 않는 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원
  • 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료함.
  • 사용자가 잘못된 값을 입력할 경우IllegalArgumentException을 발생시킨 후 [ERROR]로 시작되는 에러 메세지 출력 후 그 부분부터 입력을 다시 받음.
    • Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.

프로그래밍 요구 사항

  • 들여쓰기 깊이(indent depth)를 3이 넘지 않도록 구현함.
  • 함수가 한 가지 일만 하도록 최대한 작게 만듦.
  • 함수의 길이가 15라인을 넘어가지 않도록 구현함.
  • if-else, when 문을 필요에 맞게 사용함.
  • Enum 클래스를 적용하여 프로그램을 구현함.
  • 제공된 Lotto 클래스를 사용하여 구현해야함.
    • Lotto 클래스에 numbers 이외의 필드(인스턴스 변수)를 추가할 수 없음.
    • numbers의 접근 제어자인 private는 변경할 수 없음. ```kotlin package lotto

    class Lotto(private val numbers: List) { init { require(numbers.size == 6) { "[ERROR] 로또 번호는 6개여야 합니다." } }

    1
    
    // TODO: 추가 기능 구현 } ```
    

입출력 요구 사항

입력

  • 로또 구입 금액: 1,000원 단위로 입력 받으며, 1,000원으로 나누어 떨어지지 않으면 예외 처리함.
    1
    
    14000
    
  • 당첨 번호: 번호는 ,를 기준으로 함.
    1
    
    1,2,3,4,5,6
    
  • 보너스 번호: 당첨 번호와 중복되지 않는 번호를 입력 받음.
    1
    
    7
    

출력

  • 발행한 로또 수량 및 번호를 출력함.
    • 로또 번호는 오름차순으로 정렬함.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      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
    
    3개 일치 (5,000원) - 1개
    4개 일치 (50,000원) - 0개
    5개 일치 (1,500,000원) - 0개
    5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
    6개 일치 (2,000,000,000원) - 0개
    
  • 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)
    1
    
    총 수익률은 62.5%입니다.
    
  • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 “[ERROR]”로 시작해야 한다.
    1
    
    [ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.
    

실행 결과 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
구입금액을 입력해 주세요.
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%입니다.

미션 수행 및 아쉬웠던 점

Lotto 클래스를 사용하여 프로그램을 구현해야하는 요구사항과 해당 클래스의 입력 파라미터를 추가 할 수 없는 요구사항이 있었는데, 이 부분에서 프로그램을 구현하는 데 어려움이 있었다.
Class에 대해서, Class란 객체의 속성 및 기능을 정의하는 것으로 객체의 가장 큰 단위로 생각하였던 점이 나의 실수였다.
Class에도 하위 Class를 둘 수 있고, 그 아해 함수들을 정의하면서 프로그램을 구현하였어야 했는데,
Class가 가장 큰 단위라고 생각하여, 해당 Lotto 클래스 안에 모든 속성과 기능을 억지로 넣어서 구현하였다. 인공지능 및 머신러닝 개발만 해왔던 본인은 이러한 프로그램 구조, CS, 알고리즘 구조에 대한 지식이 부족한 것을 많이 느꼈다.

따라서, 이제 마지막 4주차 과제에서는 이러한 부분들도 신경쓰면서 잘 마무리 해보고자 한다.

읽어주셔서 감사합니다. 😊


우아한 테크코스 미션 다시보기 👍

우아한 테크코스 1주차 미션

우아한 테크코스 2주차 미션

우아한 테크코스 3주차 미션

우아한 테크코스 4주차 미션

This post is licensed under CC BY 4.0 by the author.