3주 차 미션에서는 클래스 분리, 단위 테스트를 시작해 보는 것으로 과제를 진행했지마, 이번 4주 차 미션에서 작성하는 실습 과정의 목표는 다음과 같다.
3주 차에서는 클래스를 분리하는 연습에 있어서 많은 어려움을 겪었지만, 이번 4주 차에서는 클래스를 분리하는 연습을 하는 것에 있어서 큰 어려움을 느끼면서 진행할 것 같은 느낌은 들지 않았다. 좀 더 자신감 있게 과제를 진행할 수 있을 것 같다.
이번에는 하나의 기능을 만들어 놓고 테스트를 할 수 있으면 테스트를 해서 그 기능이 정상적으로 동작하는지 확인해가면서 과제를 진행하였다.
코드의 내용을 다 설명을 하게 되면 글이 너무 길어질 것 같아서 어떤 과정으로 과제를 해결했는지 설명하겠다.
문제 풀기에 앞서 다음과 같은 진행 방식을 유의하면서 기능을 구현해야 한다.
위아래 둘 중 하나의 칸만 건널 수 있는 다리를 끝까지 건너가는 게임이다.
Exception
이 아닌 IllegalArgumentException
, IllegalStateException
등과 같은 명확한 유형을 처리한다.입력
출력
다리 건너기 게임을 시작합니다.
최종 게임 결과
[ O | | ]
[ | O | O ]
게임 성공 여부: 성공
총 시도한 횟수: 2
[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다.
실행 결과 예시
다리 건너기 게임을 시작합니다.
다리의 길이를 입력해주세요.
3
이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O ]
[ ]
이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O | X ]
[ | ]
게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)
R
이동할 칸을 선택해주세요. (위: U, 아래: D)
U
[ O ]
[ ]
이동할 칸을 선택해주세요. (위: U, 아래: D)
D
[ O | ]
[ | O ]
이동할 칸을 선택해주세요. (위: U, 아래: D)
D
[ O | | ]
[ | O | O ]
최종 게임 결과
[ O | | ]
[ | O | O ]
게임 성공 여부: 성공
총 시도한 횟수: 2
기능을 구현하기 전 docs/README.md
에 구현할 기능 목록을 정리해 추가한다.
Git의 커밋 단위는 앞 단계에서 docs/README.md
에 정리한 기능 목록 단위로 추가한다.
이번에도 작성한 코드에 대한 설명을 다 진행하기에는 글이 너무 길어질 것 같아서 과제를 진행하면서 있었던 일들 위주로 소개를 하려고 한다.
문제 요구 사항대로 최대한 한 가지의 기능을 담당할 수 있도록 목록을 고찰하려고 노력하였다.
예를 들어서 게임 시작 문구 출력 기능이 있으면 그것에 대한 메서드를 만들고 출력 관련 기능을 담당하는 클래스에 담는 방식으로 생각하면서 기능 목록을 구상하였다.
지금까지 계속 기능 목록을 작성해봤으므로 기능 목록을 정리하는데는 크게 어려움이 없었다.
지난 3주 차에서는 모든 기능들을 구현 후 그에 따른 테스트 코드를 한번에 작성하는 방식으로 진행했었다면 이번 4주 차 과제에서는 기능을 생성하고 그 기능이 제대로 동작하는지 테스트 코드를 작성하는 방식으로 과제를 진행했다.
테스트 코드를 통해서 기능 오류가 발견되면 기능을 수정하고 커밋 컨벤션에 따라서 커밋을 하였다.
기능 목록은 처음부터 항상 완벽하진 않기에 코드 작성시 중간에 항상 추가적으로 필요한 기능이 있는 경우도 있었고, 기능의 역할 수정이 필요한 경우도 있었다.
예를 들어서 단순히 다리를 생성하는 기능을 기능 목록에 처음에 작성했었다면, 다리를 생성하기 위해서 세부적으로 어떤 기능이 필요할지 추가적으로 기능이 필요했다. 그에 따른 추가 가능 사항들을 다시 정리하고 기능 목록을 항상 라이브성을 유지하기 위해서 실시간으로 업데이트 하는 방식으로 과제를 진행했다.
주어진 클래스 파일을 다른 패키지로 이동하는 작업 및 코드 변수명 변경 등의 리펙토링 작업과 클래스 내에서 작성했던 메서드를 다른 클래스로 옮기는 리펙토리 작업을 하며 과제를 진행했다.
3주 차 과제는 단순히 자기 자신만의 힘으로 클래스와 메서드를 알아서 구현해서 문제를 해결하면 됐으나, 4주 차는 몇 개의 클래스와 메서드가 주어진다.
각 클래스에 대한 요구 사항(기능 구현 유의 사항 설명에는 기재하지 않았다. 생성자, 필드 등의 요구 사항)과 그 클래스가 가지고 있는 메서드를 활용해서 어떻게 내가 구상한 기능들을 구현을 해야할지 고민하는데 많은 시간이 걸렸다.
다리를 생성하고 다리 건너기를 진행하기 위한 기능 구현은 어렵지 않았다.
다만 다리 건너기 게임 진행 중 현재 내가 건너고 있는 다리의 상황을 출력으로 나타낼 때 어떤 방식을 사용해야 할지 고민을 했지만 쉽게 방법이 떠오르지 않았다.
처음에는 아무것도 작성할 수가 없을 만큼 막막하고 멍때리는 경우가 많았다. 한편으로는 내가 생각했던 방식으로 작성을 했는데 작성하는 과정 중에서 또다른 오류가 발생하거나 막히면 곤란할 것 같다는 그 불안감이 나의 코드 작성에 영향을 미치면서 무기력한 상황에 처해지기도 하였다.
그렇지만 무기력하게 아무것도 하지 않으면 처음부터 과제를 안하는 상황과 다름없기에 일단은 이것저것 부딪혀보고 왔던 길을 되돌아가면서 피드백을 차차 쌓아가며 코드 작성을 하는 것이 낫겠다는 생각이 들었다.
그래서 일단은 계속 작성을 해보고 이 코드는 어떤 방식으로 구현 방식을 하는 것이 좋을지 보완하는 방식으로 코드를 작성하였다.
그런 방식으로 코드를 완성도 있게 작성할 수 있는 단계까지 도달하여 좌절을 딛을 수 있다는 성취감을 가질 수 있었고, 4주 차 과제도 내 자신만의 힘으로 해결할 수 있었다.