[우아한 테크코스] 3기 프리코스 2주차 후기
1주차 우테코 후기를 올렸는데, 내용이 너무 부실하고 배웠던 것을 너무 적게 표현한 것 같아 지금부터는 조금 더 자세하게 쓸 예정이다.
이번 우테코 2주차 미션은 "자동차 경주 게임".
간단하게 설명하자면 자동차 이름을 정하고, 랜덤 함수를 통해 전진할 것인지, 전진하지 않을 것인지에 대해 무작위적으로 선택하고, 정해주는 횟수에 걸쳐 자동차들을 움직인다.
이 후, 각자 움직인 거리를 보고 승자를 결정하게 된다.
승자는 한 명 또는 그 이상이 될 수 있다. (같은 거리를 이동했을 경우)
문제 자체는 그렇게 어려운 편은 아니지만, 기능 요구 사항이 항상 도전적이게 만든다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 들여쓰기 depth를 3이 넘지 않도록 구현한다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다.
- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- else 예약어를 쓰지 않는다.
제한 조건이 간단하게 이렇게 되어 있는데 특히 함수의 길이가 15라인을 넘어가지 않도록 짜는 부분과, 들여쓰기를 3이 넘지 않도록 구현, 마지막으로 else 예약어를 쓰지 않도록 하는 것이 어려웠다.
이번 우테코 프리코스를 하면서 느낀 점은 기능을 구현할 때, 코드부터 치는 것이 아니라, 구현해야할 기능들의 리스트를 먼저 정하고 시작하는 것이다. 전공 시간에도 배웠었는데, 요구분석과 기능을 알아내는 데에 많은 시간을 들여야 실제 작업시간의 속도가 줄어든다는 것이다. (또한 일정 관리나 구현 관리에도 도움이 된다.)
그래서 구현 전에 먼저 기능서를 README.md에 작성했다.
미션 - 자동차 경주 게임
구현해야할 기능
입력
- 경주 자동차 이름을 분리하는 기능
- 분리된 이름을 체크하는 기능 -> 정규식으로 구현해보기
예외 처리
- 이름이 5자 이상일 경우 에러 처리
- 이름이 중복되는 경우 에러 처리
- 쉼표말고 다른 특수 글자가 들어가 있을 경우 에러 처리
- 한글과 영어, 한글영어 혼용을 제외한 모든 글자는 예외 처리
로직
- 무작위 값을 생성하고 체크하는 기능 만들기
- 무작위 값에 따른 움직임을 적용하는 기능 만들기
- 게임 전체를 관리하는 GameBoard 클래스를 만들기
- 자동차들을 관리하는 클래스 만들기
CarController
- Car 들을 저장하는 기능
- Car 중에서 검색해서 가져오는 기능
- 모든 Car 객체를 가져오는 기능
- 특정 Car에게 움직이게 하는 기능
GameBoard
- 차를 관리하고 게임을 진행하는 클래스
- 처음 인풋 값을 통해 자동차를 만드는 기능
- 랜덤으로 난수를 추출해 자동차들을 움직이게 하는 기능
- 시도할 횟수를 받는 기능
- 시뮬레이션을 출력하는 기능
- 최종 우승자를 출력하는 기능
보면 구현해야할 기능을 상세하게 적었지만, 사실 한 번에 다 적은 것은 아니다.
예외 처리나 또는 생각지 못했던 로직을 구현해야 할 경우 문서를 먼저 업데이트 시키고 나서 기능을 구현한다.
여기서 피드백이 있었는데
"기능 목록을 클래스 설계와 구현, 함수(메소드) 설계와 구현과 같이 너무 상세하게 작성하지 않는다."
나도 기능 목록 중에 특정 클래스의 기능을 언급하며 목록 사항에 적었는데 이 것은 별로 좋지 못한 방법이다.
이유는 너무 쉽게 변경될 수 있는 것들이고, 그렇게 중요하지 않기 때문이다.
더욱 중요한 것은 예외 처리같은 정상적이지 않은 경우를 적는 것이 더 중요하다는 것이다.
구현 부분으로 넘어가자면, 좀 아쉬웠던 것들이 있었는데 바로 "중복"이었다.
보면 두 함수의 기능은 사실상 하나로 만들어도 괜찮을 것 같은 느낌이 들었다.
또한 하나의 함수가 하나의 기능만을 수행하도록 했어야 했는데, 출력 부분이 들어간 것이 설계 미스라는 생각이 든다.
이 것을 보면 더 손쉽게, 그리고 더 직관적이게 만들 수 있었다.
JAVA API는 굉장히 많은 기능을 제공하고, API로 짤 수 있는 기능의 경우 이렇게 로직을 짜는 것이 좋다고 한다.
이걸 보면서 느낀 점은, 내가 확실히 API를 제대로 숙지하지 않고 있다고 생각이 들었다.
이 외에도 객체의 "단일 책임 원칙"을 위배하는 클래스도 있었다.
전공자로써 굉장히 부끄럽고, 그렇기에 더욱 더 발전해야한다고 생각한 2주차 프로코스였다.
마지막 3주차 프리코스를 남기는 시점에서 마지막 과제인 만큼 여태까지 배우고 느낀 것들을 반영하려고 한다.
이런 깨달음을 준 우아한 테크코스에 매번 감사하게 된다.
마지막으로 2주차 공통 피드백을 올리는 것으로 2주차 후기는 마무리 하려고 한다.
- 기능 목록 구현을 재검토한다.
- 값을 하드코딩 하지마라.
- 축약하지 마라.
- java api를 적극 활용해라.
- 배열 대신 java collection을 사용하라.
- 객체에 메시지를 보내라.
- 필드(인스턴스 변수)의 수를 줄이기 위해 노력한다.
- 비즈니스 로직과 UI로직을 한 클래스가 담당하지 않도록 한다.
- 함수에 대한 기준은 main함수도 적용된다.
- commit 메세지에 "#번호"를 추가하지 않는다.
- 발생할 수 있는 예외 케이스에 대해 고민한다.
- 주석은 꼭 필요한 경우에만 남긴다.
- git을 통해 관리할 자원에 대해서도 고려한다.
- Pull Request를 보내기 전에 브랜치를 확인한다.