공대생

[우테코 프리코스] 2주차 회고 본문

우아한 테크코스/프리코스

[우테코 프리코스] 2주차 회고

상수나무 2022. 11. 10. 20:11

2주차 목표

우테코 측에서 프리코스 참여자에게 부여했던 2주차의 목표는 다음과 같다.

  1. 함수 분리하기
  2. 함수별로 테스트 작성하는 것에 익숙해지기

그리고 추가된 요구사항들이 있었다.

  1. 코드를 구현하기 전 기능 목록을 작성한다.
  2. indent depth를 3이하가 되도록 구현한다.
    - indent depth를 줄이는 좋은 방법은 함수를 분리하는 것이다.
  3. 함수가 하나의 일만 하도록 최대한 작게 만들어라.
  4. Jest를 활용해 기능 목록이 정상 동작함을 테스트 코드로 확인한다.

2주차 과제는? 숫자 야구 게임

학창시절에 친구랑 열심히 하던 게임이었는데 이걸 프로그램으로 작성한다니까 괜히 신이 났다! 🙃

기능 요구사항

기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.

  • 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
    • 예) 상대방(컴퓨터)의 수가 425일 때
      • 123을 제시한 경우 : 1스트라이크
      • 456을 제시한 경우 : 1볼 1스트라이크
      • 789를 제시한 경우 : 낫싱
  • 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
  • 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
  • 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
  • 사용자가 잘못된 값을 입력한 경우 throw문을 사용해 예외를 발생시킨후 애플리케이션은 종료되어야 한다.

프로그램 코딩 과정

이번 주차 과제는 구현보다 고민하는 데에 훨씬 더 많은 시간을 썼다. 기능 목록을 먼저 작성해야 한다고 하니 각 기능들을 어떻게 나눠야 class로 잘 묶을 수 있을지, 데이터를 어떻게 나눠야 코드에서 데이터가 단방향으로 흐를 수 있을 지 고민하느라 기능목록을 쉽사리 작성하지 못했던 것 같다.

 

알고리즘 작성
먼저 어떤 흐름으로 프로그램이 동작하는 지 파악하기 위해 알고리즘을 작성해보았다.

 

사용되는 기능 목록 작성

알고리즘에서 사용되는 기능들을 나열했다.

 

각 기능을 구현하기 위해 필요한 함수 작성

어떤 함수가 중복적으로 사용되는지 확인하기 위해 각 기능마다 어떤 함수가 필요한지 나열해보았다. 스트라이크나 볼을 판단하기 위한 함수를 예로 들 수 있을 것 같다.

 

스트라이크 판단 기능: 사용자의 입력 문자열을 순회하며 동일한 인덱스에 같은 숫자가 있는지 확인

볼 판단 기능: 사용자의 입력 문자열을 순회하며 다른 인덱스에 같은 숫자가 있는지 확인

이렇게 보면 사용자의 입력 문자열을 순회하며 / 같은 숫자가 있는지 확인 하는 기능이 중복되므로 이 함수를 클래스로 묶을 수 있다고 판단했다.

 

데이터(값, 문자열 등) 작성

어떤 데이터가 중복적으로 사용되는지 판단하기 위해 각 함수에서 사용되는 데이터를 나열해보았다.

 

이런 과정을 통해 기능 목록을 작성하고, 객체지향 프로그래밍과 테스트에 대해 공부하고 나니 과제가 나온 지로부터 삼일이나 지나있었다 😱

 

+) 객체지향 프로그래밍에 대해서는 테오의 프론트엔드 블로그의 글을 통해 공부했는데 정말 너무 쉽고 재밌게 설명해주셔서 많은 도움이 되었다. (프론트엔드 개발자를 준비하는 사람들이라면 한 번쯤 봤으면 좋겠다. 객체지향에 대해 개념을 바로 잡을 수 있을 것 같다.)

 

이제 남은 시간은 이틀,, 어떤 일을 할 때 완벽하게 준비하려고 하는 나의 완벽주의 성향으로 인해 정작 코드를 구현할 시간이 이틀밖에 남지 않은 것이다. 빠르게 기능 목록을 업데이트하고 코드를 작성하려고 하는데, class 형식의 뼈대 코드를 보고 어떻게 시작해야 할 지 모르는 나를 발견했다. 분명히 객체지향에 대해서는 반복적으로 공부해왔고, 많이 접해봤다고 생각했는데 정작 class를 이용해서 내가 처음부터 코드를 개발해본 적 없다는 것을 깨달았다.

이때부터 진짜 발등에 불이 떨어졌다고 생각했다. 막막함과 초조함이 함께 찾아왔지만 그래도 하나씩 해결해보자는 생각으로 과제를 시작했다.

 

부랴부랴 내가 해결한 문제들

1. App클래스의 play() 함수로 프로그램을 실행할 수 있도록 하는 문제 해결

 

2. 사용자 입력 메세지가 안나와서 코드가 정상적으로 동작하는지 알 수 없던 문제 해결

    → 이전에는 VScode에서 파일 하나만 실행해왔어서 ctrl+F5를 누르면 console창에 바로 결과가 떴는데 이 과제에             서는 아무리 ctrl + F5를 눌러도 나와야 하는 문자열이 안나왔다 ㅜㅜ     

    → javascript 앱을 실행할 때는 cmd 창에 node (소스코드 폴더)/(시작코드 포함한 파일) 의 형태로 명령어를 작성           해야한다는 것을 알게되었다. ( 아주 초보같은 실수겠지만 그래서 해결법을 찾는데 더 오래걸렸다… )
    

3. Console.readline을 사용했는데 사용자 입력을 받고 무한루프를 도는 문제 해결
    → 이 문제를 해결하기 위해 MissionUtils 라이브러리 코드를 뜯어보았다. readline 함수에서는 question 함수를               사용하고 있었고, readline의 question함수를 사용한 뒤에는 사용자 입력을 멈추기 위해 close를 해줘야 한다는           것을 알아내어 Console.close 문을 추가함으로써 문제를 해결할 수 있었다.

 

등등 문제를 해결해가면서 오후 3시부터 아침 8시까지, 장장 17시간동안 기능을 구현하고 8시간동안 리팩토링을 해서 과제를 제출할 수 있었다. 이렇게 단기간동안 코드를 집중해서 짜본 기억이 있나 싶을 정도록 빠져서 과제를 수행했던 것 같다.

 

느낀점!

객체지향으로 코드를 구현하니 각 기능을 하는 함수들을 클래스에서 불러와 전체적인 프로그램이 구동되도록 레고조립을 하는 느낌이라서 너무 재미있었다. 한 번에 번뜩이는 아이디어를 떠올리는 것은 잘 못하지만 이렇게 진득하게 앉아서 코드를 구현하고 조립하는 걸 잘한다는 나만의 장점을 알게 된 시간이었다.

그리고 처음에는 각 함수마다 테스트 케이스를 작성하는 것이 번거로운 작업이라고 생각했는데, 하나 하나 테스트를 하면서 코드를 작성하니 문제가 생겨도 어디서 생겼는지 바로 알 수 있어서 결과적으로 코드 구현 시간을 배로 단축시킨 것 같다. 다음 주차시에는 jest를 이용해 좀 더 복잡한 로직의 테스트코드도 구현해보고 싶다.

마지막으로 가장 중요한 것, 시간관리를 잘 해야겠다는 생각을 했다. 이번 주차처럼 기능 목록에만 너무 많은 시간을 쏟지 않도록 한 주의 계획을 짜고 시작해야겠다. 그리고 모든 것이 완벽하지 않아도 일단 시작해보는 노력을 해야겠다. 경험해봤으니까 이젠 안다. 어차피 기능 목록은 코드를 작성하면서도 여러번 바꿔가면서 해야 한다는 것을 😂

저번주보다 배울 것도, 신경쓸 것도 많은 과제였지만 모든 것을 받아들이고 스스로 헤쳐나가면서 결국 제출까지했다는 경험이 개발자로서 무엇보다 중요한 경험이라고 생각한다. 우테코를 통해서 진짜 개발자로 성장해가고 있는 느낌이 들어 기분이 너무 좋다. 다음 주차도 화이팅 해보자!!

 

저의 2주차 과제 코드는 다음 링크에 있습니다.

여전히 부족한 부분이 많지만 리뷰 남겨주시면 큰 도움이 될 것 같습니다!!

(불쌍한 중생을 구제해주십쇼😇)

https://github.com/woowacourse-precourse/javascript-baseball/pull/279

 

[숫자 야구] 최예송 미션 제출합니다. by to06109 · Pull Request #279 · woowacourse-precourse/javascript-baseball

최예송 미션 제출합니다.

github.com

 

Comments