우아한테크코스

우아한테크코스 6기 안드로이드 프리코스 2주차 회고

김 안개 2023. 11. 2. 00:21

이번 2주차에서 지킬려고 노력했던 건 지난 1주차 피드백 + 이번 2주차 추가된 요구사항

1주차 코드리뷰
- 코딩컨벤션
- 상수화
- 네이밍
- if-else indepth
- equals() 대신 기본연산자(==) 사용

 

2주차 추가된 요구사항
- indent depth 3이 넘지 않도록 할 것 (2까지만 허용)
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들 것
- JUnit 5 dhk AssertJ 를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인할 것

 

그럼 2주차 회고 가보자고 ..

 

 


 

🎯 2주차 미션

 

GitHub - woowacourse-precourse/kotlin-racingcar-6: 자동차 경주 미션을 진행하는 저장소

자동차 경주 미션을 진행하는 저장소. Contribute to woowacourse-precourse/kotlin-racingcar-6 development by creating an account on GitHub.

github.com

🚀 나의 PR

 

[자동차 경주] 황지영 미션 제출합니다. by w36495 · Pull Request #49 · woowacourse-precourse/kotlin-racingcar-6

 

github.com

 


 

🧐 일주일간의 프리코스 어떻게 보냈나?

1️⃣ 목요일 (10/25)

처음 진행되었던 코드리뷰! 사람들의 코드를 리뷰하는 시간을 많이 가졌다. 

 

시간이 날때마다 요구사항 분석 후, 아래 사진과 같이 프로그램이 실행되는 순서에 맞춰 흐름도를 그려보았다.

생각했을 때 발생할 수 있는 예외들도 함께 적었다.

머릿 속에 있는 내용들을 공책으로 꺼내놓으니 한결 더 쉽게 생각할 수 있었다.

 

2️⃣ 금요일 (10/26)

금요일도 코드리뷰를 진행했고, 다른 사람들의 코드를 구경하는 시간을 잠시 가짐 ㅎㅎ..

 

그리고 위의 흐름도를 토대로 클래스를 어떻게 가져가야할 지 생각해보았다.

한 눈에 보이는걸로는 자동차, 게임을 진행시켜 줄 manager? (게임런처 .. 뭐 이런 역할)

클래스를 정했으면 어떤 함수들을 가지고가야할지에 대해서도 생각해보았다.

 

3️⃣ 토요일 (10/27)

코드리뷰 스터디를 만들어 시작한 날

처음 시작되었기 때문에 토/일에 스터디원들의 코드를 리뷰하는 시간을 갖기로 했다!

 

그리고 찔끔찔끔 .. 코드 작성하기 시작한 날 ..

그런데 웬걸 생각지도 못한 부분이 생겨남 

예상하지 못했던 부분

 

Car 를 데이터 클래스로 만들었고, name 과 location(현재 위치) 을 파라미터로 넣어주었는데 move(랜덤 숫자) 를 구현부에 만들어주었다.

move 를 만들었던 이유는 '랜덤 숫자를 사용하여 4이상이면 전진' 의 기능을 구현해야했기때문에 그 값을 Car 에서 가지고 있어야 한다고 생각했기 때문

하지만 move 를 가지고 있을 필요가 없다고 생각되었다. 

그 이유는? 값을 가지고 있지 않고 바로 조건문으로 '랜덤 숫자를 사용하여 4이상이면 전진' 의 기능을 처리할 수 있다고 생각되었기 때문이다.

 

그래서 수정한 클래스로는 아래와 같다.

 

move 를 없앴고, 구현부에 distance 를 변수로 두어 위의 location 과 같은 역할을 하도록 수정했다!

 

근데 이것도 굳이 구현분에 distance 를 넣을 필요가 없다고 생각이 되어서 그냥 아래와 같이 만들었다.

왜 넣을 필요가 없다고 생각이 들었냐면, 일단 distance 는 prevate set 으로 되어있는데 밑에있는 addDistance 를 통해 값을 수정함;

무슨 이런 모순적인 코드가 있음 ㅋㅋㅋㅋㅠ

 

그래서 아래와 같이 깔끔하게 그냥 data class 의 파라미터로 만들고, 객체를 복사해서 distance 를 수정해주는 식으로 변경했다!

 

4️⃣ 일요일~화요일 (10/29~10/31)

List 로 자동차 목록을 관리하려고 하는데 한가지 고민이 생겼다.

 

사진에서 보이는 것 같이 toList() 를 통해 새로운 자동차 목록을 반환하고 있다.

그런데 반환값으로 받는 val cars 는 val 이라 나중에 추가적으로 값을 재할당이 불가능한 상태

여기서 고민이 되었던 것 같다.

 

val 이라 list 를 복사해서 넣을 수가 없는데 이걸 .. 어떻게 해야하지 ...?

 

List 안에 있는 Car 객체를 수정하고 싶어! -> copy 사용하자!

그런데 MutableList 가 아니라 List 로 선언되어있으니까 안에 수정할 수가 없단말임. ...? 

 

 

이걸 어떻게 ...? 

 

이 부분에 대해서 고민고민.. 고민하다가 같이 코드리뷰를 했던 분께서 블로그에 작성하신 글을 공유해주셨는데 바로 블로그로 다이브 ..

해당 글을 토대로 Collection 에 대한 copy 를 이해할 수 있었다. (사실 copy 와 관련된 얘기는 하지 않았는데, 의도치않게 copy 에 대한 내용을 이해했음)

 

👇 참고한 블로그는 여기!

 

백킹 프로퍼티.. 잘 사용하고 계신가요? 프로퍼티를 알아보고 완벽히 이해 해보아요...! (Kotlin)

.asStateFlow()나 .asSharedFlow()에 관해서 한글로 된 레퍼런스 들을 찾아보면 잘못된 정보를 제공하...

blog.naver.com

 

아무튼 이제는 어떻게 짜야될지 감이 왔기때문에 가장 먼저 한 일은

현재 모든 함수들이 RacingGameManager 클래스에 몰빵되어 있으니 분리하는 것부터 시작했다

 

 

Car 를 조작하는 함수들은 CarController 라는 클래스를 생성하여 넣어주었다.

 

고민했던 List 의 객체를 수정하는 것은 Controller 에 mutableList 로 자동차 목록을 생성한 후에 추가/수정과 같은 일을 할 수 있도록 했다.

private 제어자를 달아주어 CarController 내부에서만 접근이 가능하도록 했고, 자동차 목록을 알고싶다면 getCars() 함수를 통해 자동차 목록을 복사하여 List 의 타입으로 반환하도록 하였다!

 

List 안에 있는 Car 를 수정하는 것도 수정하고 싶은 위치(index)를 파라미터로 받아온 후에 해당 객체를 복사하여 해당 위치에 다시 넣어주었다. (increaseCarDistance 참고)

 

그런데 이 부분은 전역변수를 사용하고 있으므로 자동차 목록인 cars 도 파라미터로 받아주었으면 더 좋았을 것 같다.

 

 

아무튼! 그동안 고민이었던 부분이 쫘아아악 내려가니 너무 속시원했다.

 

5️⃣ 수요일 (11/1)

미뤄두었던 예외를 하나하나 작성하기 시작했고, 코드 수정이 필요한 부분이 보이면 수정하는 작업을 진행했다.

그리고 테스트 코드를 작성해나가는데 .... 테스트를 해야하는데 현재 함수들이 인자를 가지지 않은 함수가 많아서 테스트가 조금 힘들었다.

그래서 자동차 생성하는 부분만 테스트를 작성했고, 그 외는 하지 못했다.

그래서 다음 주차 미션에서는 테스트를 먼저 작성한 후에 코드를 짜야겠다고 생각이 들었다.

 

🔥 느낀점

예전에는 정말 생각없이 짰구나 .. 그리고 절차지향, 객체지향, 함수형 프로그래밍 .. 어렵다

나의 함수는 한없이 쪼개지는구나 .. 아직 많이 읽어보지는 못했지만 함수형 코딩이 많이 도움되었던 것 같다.

이번 주차를 진행하며 코드리뷰 스터디를 만들었고, 1주차는 성공적으로 진행되었다!

1주차 코드리뷰를 하며 많은 분들의 코드를 봤는데 좋았던 부분을 적용시키려고 노력을 많이 했던 것 같다.