⚾ 1주차 미션 - 숫자 야구 게임


1주차 미션은 숫자 야구 게임이었다.

워낙 유명한 구현 과제라 예전에 파이썬으로 구현했던 적이 있다.

하지만 처음 다뤄보는 자바로 구현해야 했기에 어려움도 많았지만 배움도 많았던 것 같다.

아래와 같이 작동을 할 수 있는 프로그램을 만드는 것이 미션의 궁극적인 목표였고 기능적인 요구사항 외에 다양한 요구사항들이 존재했다.

다양한 요구사항들 중 미션을 진행하면서 꾸준히 신경 썼던 프로그래밍 요구사항과 과제 진행 요구사항을 아래 정리해놨다.

💻 프로그래밍 실행 결과 예시


숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요 : 145
1볼 
숫자를 입력해주세요 : 671
2볼 
숫자를 입력해주세요 : 216
1스트라이크 
숫자를 입력해주세요 : 713
3스트라이크 
3개의 숫자를 모두 맞히셨습니다! 게임 종료
게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
1
숫자를 입력해주세요 : 123
1볼
…

🎱 프로그래밍 요구사항


  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
  • 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.

📈 과제 진행 요구사항


  • 기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리해 추가한다.
  • Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.

🖋 1주차 미션 후기


README 작성


항상 알고리즘 문제나 풀고 이제 막 자바 문법을 공부하던 단계라 프로그램을 구현하기 전 기능 목록을 작성한다는 것 자체가 새로운 경험이었다.

어떤 기능들이 필요할까 생각하다가 우선 프로그램의 흐름대로 필요한 기능들을 나열하였다.

마크다운 문법도 처음이었기에 간단히 불릿포인트로 작성했다.

기능 목록을 작성하니 확실히 만들고자 한 기능들만 차근차근 만들 수 있었다.

커밋 메시지 컨벤션


커밋 메시지에도 컨벤션이 있었다는 것을 알게 되었을 때 1일 1커밋을 할 때마다 날짜만 써놨던 나 자신이 굉장히 부끄러웠다.

기능 목록을 나열하자 기능을 하나씩 구현할 때 마다 커밋 푸시를 진행하니 커밋 컨벤션에 따라 커밋 로그를 남기기 수월했고 만들어온 과정을 되돌아볼 나 자신에게도 굉장히 중요한 기록이라는 것을 알게 되었다.

자바 코드 컨벤션


코드에도 컨벤션이 있다는 사실에 놀랐고 세세하게 정해져 있는 규칙에 다시 한번 놀랐다.

항상 작성했던 코드가 적절한 것인지 고민이 많았었는데 컨벤션을 접하고 나서 그런 고민이 현저히 줄어들었다.

컨벤션을 적용한 상태로 코드를 작성하니 코드들이 일정하고 읽기 좋은 코드를 작성할 수 있었다.

이런 공통된 규칙을 갖고 협업한다면 큰 시너지를 발휘할 수 있을 것 같다는 생각이 드는 순간이었다.

클래스 분리


기존에 완성했던 코드는 한 클래스에 모든 기능이 모인 상태였다.

코드 길이도 약 130줄에 불과했고 굳이 클래스를 분리해야 할 필요성을 느끼지 못하였고 해당 미션의 요구사항 역시 아니었지만, OOP 언어를 공부하면서 제대로 된 객체지향을 연습해보고 싶었다.

OOP의 단일 책임 원칙을 접하면서 클래스가 단 하나의 책임을 져야 한다는 것을 알고 객체 간 상호작용하는 프로그램을 만들어보고자 클래스를 분리하는 연습을 했다.

  • 게임 진행을 책임지는 클래스
  • 컴퓨터 역할을 책임지는 클래스
  • 예외 상황을 책임지는 클래스
  • 상수와 변수를 책임지는 클래스

총 4가지의 클래스를 분리하였고 해당 책임에 상응하는 메서드들을 배치하였다.

기존에 모여있던 메서드들이 흩어지자 다양한 에러가 발생했고 객체의 인스턴스 생성 등 더 많은 지식이 요구되었다.

처음 공부하던 자바였기에 어려움이 있었지만 끝내 완성된 프로그램을 만들 수 있었다.

클래스를 분리하니 각 클래스가 무엇을 하는지 확실하게 구분할 수 있었고 코드의 가독성도 높아진 것을 확인할 수 있었다.

여전히 궁금증이 많고 부족한 코드지만 순간순간 떨어지는 문제를 해결하는 프로그래밍이 아니라 체계적인 설계를 바탕으로 한 프로그래밍을 경험한 것 자체가 큰 수확이었던 것 같다.

해당 미션을 통해 객체 간의 상호작용을 경험할 수 있었고 앞으로 가독성 좋은 코드를 작성할 수 있는 역량을 키우는 데 더욱 집중할 수 있을 것 같다.