숫자야구 게임 만들기
- 임의 숫자 3자리를 생성 (서로다른 수)
- 사용자가 3자리의 숫자를 입력
- 두 수를 비교하여 볼과 스트라이크의 개수를 출력
- 3스트라이크 라면 게임 종료
- 게임 재시작 의사 확인
- 사용자가 잘못된 값을 입력할 경우 예외처리
2주차 미션은 숫자야구였다.
위는 기능 목록을 단순하게 적어 놓은건데, 실제론 훨씬 자세히 기입했다.
2주차의 학습 목표는 다음과 같다.
메소드(함수)의 분리와 메소드(함수)에 대한 테스트를 해보기
미션을 완벽히 수행하는 것도 중요하지만 우테코쪽에서 제시하는 학습 목표를 중점으로 생각할 필요가 있다.
일단 이번주차는 메소드(함수) 분리에 최대한 포커스를 두었다. 하지만 나누기에 애매한 경우도 있었다.
또한 어디까지를 한 가지의 일이라고 봐야할지도 애매했었다.
이번 숫자야구 같은 경우엔 유저가 3자리의 숫자를 맞추는 과정과 그에 대한 결과값이 출력되는 과정의 반복이라 따로 숫자야구를 진행시키는 함수를 만들었었다.
fun main() {
println("숫자 야구 게임을 시작합니다.")
do {
숫자야구시작하기()
} while (숫자야구재시작())
}
fun 숫자야구시작하기() {
// 랜덤값을 받아 변수에 저장
do {
// 유저에게 숫자를 받아 게임을 진행하는 반복
} while (true)
}
(위는 내가 쓴 코드를 주석으로 바꿔 구성만을 표현하게끔 했다.)
코드를 작성하면서 고민이었던게 나는 최대한 메인함수를 더럽히고 싶지않았다.
메인함수는 README.md
다음으로 보게되는 목차와도 같은 어플리케이션 자체 구성을 보여주는 역할을 하는게 좋다고 느꼈다. 또한 숫자야구를 진행할 땐 조건 만족시 재시작이라는 반복과, 숫자야구를 진행하는 과정에서 유저에게 입력을 받는 반복, 즉 두 가지의 반복이 중첩이 된 설계가 보편적이다. 때문에 indet depth를 2까지만 유지하려면 함수로 분리하고 그 함수 자체를 반복 시키는 위의 내 코드와 같은 구성이 된다.
그런데 여기서 고민이 생긴다. 함수가 한 가지 일만을 하도록 설계를 해야하는데 그게 좀 관점에 따라 애매하다고 느껴졌다.
넓은 관점에서 본다면 내가 짠 함수 숫자야구시작하기( )
는 숫자 야구를 진행시키는 한 가지의 일만을 하지만,
좁은 관점에서 본다면 숫자야구 진행을 위해서 출력도 하고, 사용자 입력도 받고, 볼카운트를 가져오고 해당하는 볼카운트를 양식에 맞게 출력까지하는 여러가지의 일을 하는 함수가 되어버린다.
나는 결국에 이 문제를 넓은 관점에서의 한 가지 일이라고 판단을 하고 해결했다.
각각의 장단점 또한 눈에 가시적으로 보였다. 이번 2주차 미션 제출 후 신청자를 받아서 자체적으로 코드리뷰를 서로 해주었다.
넓은 관점의 한 가지의 일을 하는 함수(메소드)
좁은 관점의 한 가지의 일을 하는 함수(메소드)
코틀린과 객체지향 초보인 내 입장에서 당장에 생각나는 장단점은 위와같다. 물론 클래스를 활용하게 되면 어느 정도 해결이 되겠지만... 아직 깔끔하게 생각이 정리된건 아니라 추후에 다시 이 내용 관련해서 포스팅 하겠다. 2주차에선 넓은 관점으로 메소드(함수) 작성을 했으니, 3주차에선 함수를 좁은 관점에서 최대한 나눠 볼 생각이다.
이번엔 아쉬운 점 보다는 자주 썻던 테스트 코드에 대해서 복습겸 나열하려 한다.
@Test
fun 테스트이름() {
val 넣어볼인수 = 넣어볼인수
val 원하는결과 = 원하는결과값
assertThat(확인해볼함수(넣어볼인수)).isEqualTo(원하는결과)
}
@Test
fun 테스트이름() {
val 넣어볼인수 = 넣어볼인수
val 원하는출력값 = 원하는출력값
출력을하는 함수(넣어볼인수)
assertThat(output()).isEqualTo(원하는출력값)
}
@Test
fun `빈칸을 입력했을 때`() {
assertSimpleTest {
assertThrows<발생되는Exception> { runException(" ") }
}
}
추가로 코드리뷰스터디를 만들어서 진행 중이다. 물론 규칙에 어긋나지 않게 혼자 힘으로 열심히 진행한 후 해당 주차 미션이 끝나면 코드리뷰를 하는 형태이다.
사람 생각이 다 똑같으면서 또 한편으론 다다른 것이 신기하기도 하고 배울점이 많았다.
요즘들어 한 주마다 아주 큰 성장을 하는 것 같다. 벌써 반이나 지났는데, 이 시간이 고되면서도 너무 뜻깊어서 시간 가는거 조차 아쉬운 기분이 든다. 이 시간을 더 즐기고 싶으면 한 가지 해결책이 있다. 우테코에 합격하는 것이다! 남은 주차도 꼭 열심히해서 우테코 5기 모바일 안드로이드의 일원이 되고싶다!
이 글을 읽는 모든 우테코 동기님들 또는 후배님들 모두 캠퍼스에서 뵙길 바라며 이만 회고록을 마치겠다!