우아한테크코스 5기 프리코스 2주차 회고

yeolyeol·2022년 11월 11일

woowa-precours-5th

목록 보기
2/3
post-thumbnail

✨요약

  • 하나의 작은 프로젝트를 하는 느낌
  • 사용자 입장에서도 생각할 수 있는 계기

📖미션

  • 학창시절 반 친구들과 몰래 했던 야구 게임 - 1~9까지의 서로 다른 숫자 3자리를 맞추는 게임
    과거 야구 게임을 회상하면서 프로그래밍을 했다. 익숙한 문제였기에 나름 재밌게 접근할 수 있었다.

야구 게임의 설명

  • 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
    • 예) 상대방(컴퓨터)의 수가 425일 때
      • 123을 제시한 경우 : 1스트라이크
      • 456을 제시한 경우 : 1볼 1스트라이크
      • 789를 제시한 경우 : 낫싱
  • 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한
    결과를 출력한다.
  • 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
  • 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
  • 단 사용자가 잘못 입력했을 경우, IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
    일반적인 알고리즘 문제와 큰 차이가 있다면, '예외처리'라고 생각한다. 사용자가 입력하는 값이 개발자가 원하는 범위에 없을 수 있다. 그렇기에 사용자가 입력하는 잘못된 값을 예측하고 예외처리하는 것이 중요했다. 마치 프로젝트의 기능 하나를 구현하는 느낌이 들었다.

📜추가된 요구사항

1주차 프리코스에 이어서 가독성을 올리는 요구사항이 추가되었다.

  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
    기능을 구현하다보면 나도모르게 indent가 3-depth까지 내려간 적이 있다. 이를 해결하기 위해, 처음부터 기능별 메서드를 작성하여 프로그래밍하려고 했지만 매우 어려웠다. 그래서 기존 방식처럼 코드를 작성한 뒤, 기능별 메서드로 나누며 프로그래밍하니 기능을 구현하는 속도가 나름 빨라졌다. 평소에도 indent의 depth를 줄이는 습관을 들여 처음부터 기능별 메소드를 작성하는 므찐 예비개발자가 되어야 겠다.
  • 3항 연산자를 쓰지 않는다.
    3항 연산자를 쓰지 말라는 추가 요구사항이 조금 놀라웠다. 왜냐하면, 나는 오히려 3항 연산자를 쓰는 것이 가독성에서 긍정적이라고 생각했기 때문이다.
    해당 이유를 찾아보니 다른 바이너리 연산자는 일관성있는 데이터타입을 가지고 있는데 3항 연산자는 두가지 이상의 데이터 타입을 가질 수 있어서 일관성이 떨어진다는 단점이 있었다.

  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
    1주차에 언급한 SOLID 중 SRP(단일책임원칙)을 준수하며 코딩하는 것이다. indent의 depth를 줄이려고 노력하니 이번 추가 요구사항에서 크게 걸리진 않았다.

  • JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.

    • 테스트 도구 사용법이 익숙하지 않다면 test/java/study를 참고하여 학습한 후 테스트를 구현한다.

    기능별 테스트 도구를 사용해서 테스트하는 것은 이번 프리코스를 하면서 처음 접해봤다. 그래서 test/java/study 디렉토리에 있는 StringTest라는 테스트 도구로 공부를 하기 시작했다.


docs/README.md

⚾야구 게임

우아한테크코스 5기 - 프리코스 2주차 미션

📑구현 기능 목록

1. 문제를 내는 사람 (COM)

  • 생성
    • 1에서 9까지 서로 다른 임의의 수를 3개
  • 검증
    • 볼의 개수
    • 스트라이크 개수

2. 문제를 맞추는 사람 (USER)

  • 입력
    • 1부터 9까지 서로 다른 수로 이루어진 3자리의 수
    • 게임이 끝난 후 재시작/종료를 구분하는 1과 2 중 하나의 수

3. 게임 진행

  • 게임 초기화
    • 맞출 숫자 생성
  • 게임 진행
    • 사용자가 숫자 입력
      • 입력한 숫자 검증
    • 스트라이크 및 볼의 개수 출력
    • 전부 스트라이크면 성공 메세지 출력
    • 게임 재시작 여부를 묻는 메세지 출력
      • 입력(1) : 게임 재시작
      • 입력(2) : 게임 종료
      • 입력(etc) : IllegalArgumentException 예외 발생 및 종료

흐름도


README.md를 작성 중 게임 진행에 대한 구현 기능 목록을 작성하다가 들었던 생각이다. '개발자가 아닌 다른 사람이 내 README를 봐도 이해할 수 있을까?'라는 생각이 들었다. 물론, 야구 게임은 크게 어렵지 않을뿐더러 잘 알려진 게임이라고 생각하지만, 그럼에도 프로그램의 전체적인 흐름을 표현할 수 있다면 조금 더 이해해기 수월할 것 같다는 생각이 들었다. 그렇게 야구 게임의 전체적인 흐름도를 그리게 되었다.

✏️2주차를 마친 소감

1주차에서 추가된 요구 사항을 인식하고 이를 지키기 위해 공부를 했다.
가장 많은 시간을 소요한 부분은 indent를 줄이고 기능별 메서드를 작성하는 것과 내가 구현 기능 목록에 작성한 것을 테스트 코드를 구현하는 것이다.

indent의 depth를 줄이는 것은 이제 와서 생각해보면 크게 어렵지 않았다. 하지만 당시 코드를 작성했을 땐, 커다란 모래주머니를 달고 달리는 느낌을 받았다. 간단한 구현이라도 항상 의식하면서 프로그래밍하니 매우 어색했다. 2주차 과제를 제출하고 2주치에 대한 회고를 쓰고 있는 지금은 indent의 depth를 줄이는 것과 기능별 메서드를 작성하는 것이 크게 어렵지 않았다. 오히려, 그렇게 하지 않으면 코드가 지저분하고 어렵게 보이기 시작했다. 나에게 이런 코딩 습관을 들이게 해준 우아한테크코스에 감사함을 느낀다.

테스트 코드를 작성하는 것과 테스트를 한다는 것을 이번 2주차 프리코스를 하면서 처음 알게되었다. 아직 어떤 식으로 내 기능 구현을 테스트 하는 것인지 많은 것을 공부해야 하겠지만 다음 3주차부터 탄탄한 기능별 단위 테스트 코드를 작성하도록 노력하겠다.

2주차에도 정말 많은 것을 배울 수 있었다. 다른 분들의 회고를 보면서 나보다 잘하는 사람들이 정말 많다는 것을 알게되었다. 하지만 그렇다고 내 자존감이나 동기가 떨어지진 않았다. 오히려 동기부여가 되어 다음 3주차에 더욱 성장한 모습을 보여주리라 다짐하는 계기가 되었다.

profile
한 걸음씩 꾸준히

1개의 댓글

comment-user-thumbnail
2022년 11월 14일

잘보고갑니다!

답글 달기