Welcome! Everything is fine.
[AOS] 우아한테크코스 6기 프리코스 3주차 회고 : 로또 본문
📌 3주차 완주!
3주차 로또 미션까지 무사히 끝났다. 이번에는 공통 피드백과 더불어 코드리뷰 때 받은 피드백도 잘 반영해보려고 노력했다. 하지만 또 끝나고 나니 아쉬움이 남는건 어쩔 수 없다. 4주차까지 완주하는 것을 목표로 더 열심히 해보자!
📌 추가된 요구사항
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
- else를 지양한다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- 때로는 if/else, when문을 사용하는 것이 더 깔끔해 보일 수 있다. 어느 경우에 쓰는 것이 적절할지 스스로 고민해 본다.
- Enum 클래스를 적용해 프로그래밍을 구현한다.
- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다.
- 단위 테스트 작성이 익숙하지 않다면 test/kotlin/lotto/LottoTest를 참고하여 학습한 후 테스트를 구현한다.
📌 기능 목록
날이 갈수록 기능 목록이 길어지고 있다. 이번에는 예외처리를 꼼꼼하게 짜보려고 노력했는데, 끝나고 보니 못한 부분이 눈에 들어왔다..나름 꼼꼼하게 짰다고 생각했는데 경우의 수를 더 생각해봐야겠다. 프로그래밍 요구사항과 공통 피드백, 테스트 코드 작성 목록을 역시 더 세세하게 작성하려고 노력했다. 적어놓지 않으면 자꾸 잊어버리기에..👀 다른 사람들의 리드미를 구경해보니 상상도 하지 못했던 방식으로 화려(!)하게 만든 사람들이 많았다. 대체 어떻게 만든겁니까..따라하고싶어도 시간이 오래 걸릴 것 같아서 다 끝나고 따라해야할 것 같다..ㅋㅋㅋㅋ
📌 미션 과정
✅ 클래스를 분리하자
이번 미션의 목표는 크게 두 가지였다.
- 클래스(객체)를 분리하는 연습
- 도메인 로직에 대한 단위 테스트를 작성하는 연습
사실 패키지도 그렇고 클래스도 그렇고 어떻게 분리하는 것이 좋을지 굉장히 헷갈렸다. 의식해서 객체를 분리하는 연습을 한 것은 이번이 처음이니, 계속 연습하다보면 적절하게 분리할 수 있지 않을까? 그래도 저번 주보다는 (아주 조금) 나아지지 않았을까 하는 기대를 해본다. 아쉬운 것은 코드리뷰에서 피드백 받은 것처럼 로또의 결과를 저장하는 데이터 클래스를 만들어 활용했다면 더 좋았을 것 같다.
✅ 단위테스트가 뭘까?
'단위테스트'라는 것은 정처기 시험 공부할 때만 들어보고 실제로 해본 적은 없다. 작은 기능부터 테스트를 작성하는 연습이 필요한데, 여러 자료들을 찾아보다가 2주차 코드리뷰에서 어떤 분이 참고하라고 하신 테코톡 영상이 기억나서 찾아보았다. 10분 정도의 짧은 영상인데, 단위테스트와 그에 대한 꿀팁이 알차게 들어있어 유용했다. 테코톡으로 올라온 영상들 모두 유익하니 시간날 때 한 개씩 보는 것을 추천한다.
✅ 6개의 숫자로 이루어진, 그러나 중복되지 않는 자료구조가 필요한데..
이번 미션에서는 제공된 Lotto 클래스를 이용해 구현해야했다. 우테코 디스코드에서 주워들은 '일급컬렉션'에 대해 검색해보니 좀 더 쉽게 이해할 수 있었다. 사실 지금보니 이 클래스를 잘 활용하지 못한 것 같아 신경이 쓰인다. 다른 사람들의 코드를 보니 Lotto를 검증하거나 String으로 만드는 등의 작업을 해당 클래스에서 수행하고 있었다.
package lotto
class Lotto(private val numbers: List<Int>) {
init {
require(numbers.size == 6)
}
// TODO: 추가 기능 구현
}
✅ enum 클래스로 간편하게 관리하기
이번에는 enum 클래스를 적용해 구현하는 것도 추가된 요구 사항의 한 부분이었다. enum 클래스 역시 이번 미션을 통해 처음 사용해봤다. enum 클래스는 열거형 클래스라고도 불리며 연관성이 있는 상수를 모아놓는 클래스다. 예를 들면, 내가 적용한 enum 클래스는 다음과 같다. 당첨 번호에 대한 상수들을 모아 enum 클래스로 만들어봤다. 모든 상수를 하나의 파일에 넣어 관리하는 것보다 enum 클래스로 묶어 관리하니 가독성도 좋아지고 편리했다! enum 클래스를 100% 활용할 수 있는 방법이 더 있을 것 같아서 한 번 알아봐야겠다.
enum class Winning(val message: String, val match: Int, val prize: Int) {
THREE("3개 일치 (5,000원) - ", 3, 5000),
FOUR("4개 일치 (50,000원) - ", 4, 50000),
FIVE("5개 일치 (1,500,000원) - ", 5, 1500000),
BONUS("5개 일치, 보너스 볼 일치 (30,000,000원) - ", 5, 30000000),
SIX("6개 일치 (2,000,000,000원) - ", 6, 2000000000)
}
✅ I LOVE 코드리뷰
이 내용은 과제 제출할 때 소감문에 쓴 내용이기도 하다. 많은 수의 코드 리뷰를 하거나 받은 것은 아니지만, 지난 주 처음 진행한 코드리뷰를 통해 3주차를 더 수월하게 진행할 수 있었다. 코드 리뷰를 하며 내가 아는 부분을 더 확실히 알려주기 위해 검색을 다시 해보고, 질문에 답변을 하기 위해 더 많이 찾아보았다. 그 과정에서 공부가 많이 되었고, 다른 사람의 코드를 보며 '아, 이런 부분은 이렇게 간단하게 처리할 수 있구나!'하는 부분을 3주차에 적용했다. 프리코스에 참여하게 된다면 꼭 코드리뷰에 적극적으로 참여해보는 것을 추천한다!
📌 공통 피드백
- 함수(메서드) 라인에 대한 기준 - 15라인이 넘어간다면 함수 분리를 위한 고민 하기
- 발생할 수 있는 예외 상황에 대해 고민하기
- 비즈니스 로직과 UI 로직을 분리하기
- 연관성이 있는 상수는 전역으로 선언하는 대신 enum을 활용하기
- val 키워드를 사용해 값의 변경을 막기
- 프로퍼티의 접근 제어자는 private으로 구현하기
- 객체는 객체스럽게 사용하기
- 필드의 수를 줄이기 위해 노력하기
- 성공하는 케이스 뿐만 아니라 예외에 대한 케이스도 테스트하기
- 테스트 코드도 코드다!
- 테스트를 위한 코드는 구현 코드에서 분리하기
- 단위 테스트하기 려운 코드를 단위 테스트하기
- private 함수를 테스트 하고 싶다면 클래스(객체) 분리를 고려하
📌 내가 받은 코드 리뷰
🫠 | 실수에 대한 리뷰
이번 미션에서 유독 실수가 많았던 것 같다. 메소드 시작을 대문자로 했다거나, 상수 처리를 한 곳만 빼먹었다거나, 코드를 일관성 없게 짰다거나...정신없이 제출하다보니 코드를 전체적으로 살펴보지 못했기 때문이다. 다 구현했다고 생각하더라도 남의 코드 보듯이 내 코드를 바라볼 필요가 있는 것 같다. 4주차에서는 이런 자잘한 실수를 하지 않도록 한번 더 검토하고 생각해보는 시간을 가져야겠다.
🔗 | 의미없는 주석 제거하기
몇몇 코드에 주석이 달려있는데, 메서드 네이밍을 잘하셔서 의도파악이 가능하기 때문에 제거하는 것이 깔끔할 것 같습니다!
'의미없는 주석을 달지 않는다'라는 피드백은 1주차 공통 피드백에서도 있었던 내용이다. 변수 이름, 함수 이름을 통해 어떤 의도인지가 드러난다면 굳이 주석을 달지 않는다. 그렇기 때문에 변수와 함수의 이름을 의미있게 짓는 것이 중요하다. 이것 역시 검토를 제대로 하지 못한 나의 실수다..! 보통은 한 번 검토하고 필요없는 주석을 모두 지우는데, 이번에는 빼먹어버렸다. 의도를 드러내기 힘든 경우에만 주석을 다는 연습을 하자!
🧹 | 더 깔끔한 코드
toIntOrNull() 메서드를 사용하면 보다 간편하게 String 관련 에러를 처리할 수 있을 것 같습니다!
val intersection = index.intersect(winningNumber) 와 같이 사용하면 보다 간편하게 교집합을 구할 수 있을 것 같습니다!
함수 안에서 mutableList를 초기화해서 관리하기 보다는 이 데이터를 관리하는 데이터 클래스(ex. LottoResult) 를 따로 정의해서 관리를 한다면 코드가 조금 더 깔끔해질 수 있을 것 같아요!
더 깔끔한 코드를 위한 리뷰를 많이 해주신 덕분에 4주차에 어떤 점을 보완하고 신경써야할지 생각해봤다. 특히 코틀린을 코틀린스럽게 사용하고 싶은데, 아직 모르는 것들이 많아 한 주 한 주 배워나가는 중이다.ㅎㅎ
📌 회고
미션이 끝나갈수록 아쉬움이 많이 남는 것은 어쩔 수 없는 것 같다. 특히 다른 지원자들과 이렇게 소통할 수 있는 기회가 곧 끝난다는 것이 아쉽다. 우테코 디스코드 내에서 활발하게 진행되는 정보 교류로 인해 몰랐던 점, 생각해보지 못했던 점을 알게 되고 고민해보는 시간이 많아졌다. 아쉽지만 나중에 또 기회가 있겠지..하는 생각이다. 남은 일주일은 지금까지 해왔던 것보다 더 깊고 진한 몰입을 해보고 싶다!
📌 다음 목표
- 4주차 잘 마무리하기
- 피드백 내용 숙지하기
'자격증 및 기타 활동 > 우아한테크코스' 카테고리의 다른 글
[AOS] 우아한테크코스 1차 합격과 최종 코딩테스트 후기 (0) | 2023.12.30 |
---|---|
[AOS] 우아한테크코스 6기 프리코스 4주차 회고 : 크리스마스 프로모션 (0) | 2023.11.20 |
[AOS] 우아한테크코스 6기 프리코스 2주차 회고 : 자동차 경주 (0) | 2023.11.04 |
[AOS] 우아한테크코스 6기 프리코스 1주차 회고 : 숫자야구 (0) | 2023.10.30 |