안녕하세요. 카카오 테크 캠퍼스 첫 번째 미션이 나왔습니다. 이 미션은 과제 진행 요구 사항, 기능 요구 사항, 프로그래밍 요구 사항으로 구성되어 있었습니다.
과제 진행 요구 사항
기능 요구 사항
- 숫자 야구 게임은 1 ~ 9까지의 서로 다른 수로 이루어진 세 자리 수를 맞추는 게임이다.
- 같은 수 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이라는 힌트를 얻고, 그 힌트를 이용해서 상대방의 수를 맞추면 승리한다.
- 숫자 야구 게임에서 상대방의 역할은 컴퓨터가 한다.
- 과정을 반복해 컴퓨터가 선택한 세자리 숫자를 모두 맞히면 게임이 종료된다.
- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
- 사용자가 값을 잘못 입력한 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료된다.
실행 결과
프로그래밍 요구사항
- JDK 17 버전에서 실행 가능해야 한다.
- 프로그램 실행 시작점은 Application 의 main() 이다.
- build.gradle 파일은 변경할 수 없으며, 제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.
- 프로그램 종료 시 System.exit() 을 호출하지 않는다.
- 프로그램 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸지 않는다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 3항 연산자를 사용하지 않는다.
- 함수가 한가지 일만 하도록 최대한 작게 만든다.
- indent는 depth를 3이 넘지 않도록 구현한다.
- JUnit5와 AssertJ를 이용하여 정리한 기능 목록이 정상적으로 작동하는 지 테스트 코드로 확인한다.
깃 커밋은 아래 이미지를 참고하여 작성했습니다.
기능 목록 작성하기📄
위의 요구 사항을 본 뒤, 저는 숫자 야구 게임의 기능 목록을 작성했습니다.
# ⚾숫자 야구 게임⚾
## 📃기능 목록📃
### 임의의 숫자 생성
- [x] 자바 util을 사용해 임의의 세자리 수 생성
### 입출력 기능
- [x] 게임 시작에 대한 출력
- [x] 숫자 세 자리 입력
- [x] 입력된 정보에 볼, 스트라이크, 낫싱 정보를 출력
- [x] 사용자가 숫자를 맞힐 경우 게임을 다시 시작하거나 종료를 구분하는 입력
### 스트라이크, 볼 확인 - 메서드로 제작
- [x] 같은 숫자, 같은 자리 -> 스트라이크
- [x] 같은 숫자, 다른 자리 -> 볼
- [x] 다른 숫자 -> 낫싱
### IllegalArgumentException 발생
- [x] 사용자 입력 값이 숫자가 아닌 경우
- [x] 사용자 입력 값이 세자리 수가 아닌 경우
- [x] 게임 종료 후, 사용자 입력 값이 0 또는 1이 아닌 경우
- [x] 사용자 입력 값에 중복된 값이 있을 경우
- [x] 사용자 입력 값이 null 인 경우
구현 방향
프로그래밍 요구 사항을 보면 메서드는 한 가지 일만 하도록 만들라는 지시가 있었습니다. 따라서, 기능에 따른 클래스를 정의하고 각 클래스의 구현할 메서드에 대해서 정리해보려고 합니다.
최대한 하나의 메서드가 하나의 기능을 처리할 수록 설계해보려고 하는데 그 기준을 어디로 잡아야할 지 감이 오지 않았습니다. 만일, game 클래스를 만들어서 start하는 메서드가 있을 때, 이 start라 함은 게임을 시작하는 output, input 만을 의미하는지 아니면 이 게임이 진행되게 만들어야 하는지 또한, 게임이 진행되게 만든다면 이 후 끝날 때까지 start() 메서드에서 처리 해야 할 지 의문이 들었습니다.
하지만, 줏대를 갖고 설계해서 구현한 뒤에 멘토님 또는 주변 분들께 피드백 받고자 했습니다.
Number
- create() : 임의의 숫자 세 개 생성하는 메서드
Game
- start()
InputOutput
- startOutput
- restartOutput
- numberInput
- yesOrNoInput
- hitterResultOutput
- endOutput
BaseballUtil
- strike()
- ball()
Validate
- numberValidate - 입력 값 판단
- yesOrNoValidate - 게임 재시작 입력 값 판단
부족한 점😥
설계를 진행할 때, 논리적인 이유 없이 감으로 이건 나눠야 할 것 같고, 이건 합치면 될 것 같고 라는 사고 과정으로 진행 했던 것이 아쉬움에 남았습니다. 객체 지향 설계에 대한 공부가 필요함을 많이 느꼈던 과제였습니다.
구현에 있어서는 Game 클래스의 start() 메서드는 남들은 알아보기 어려울 것 같습니다. 일부분 하드 코딩된 부분이 있어서 어떻게 하면 가독성 있고 좀 더 좋은 방법이 될 수 있는지 공부하고 수정하는 시간을 가져봐야 할 것 같습니다.
과제 진행 소감🎓
과제가 나온 뒤, 요구 사항을 보면서 기능 목록을 작성하고 기능 단위로 클래스를 분리해보고자 했습니다. 그러나 이 과정이 생각보다 쉽지 않았습니다. 만일 Game 클래스를 만들고 start()라는 메서드를 활용하여 실행한다면 이 start()에서 모든 과정을 처리 해야 하는지 분리를 해야 하는지 판단하기 어려웠습니다.
스프링 부트를 활용해서 백엔드 개발을 할 때에는 controller로 요청이 들어오고 이 요청을 service에서 처리하고 결과를 반환한다는 과정이 정해져 있었는데 이런 프로젝트의 경우에는 항상 main에서 모두 처리해왔기 때문입니다.
그래서 논리적인 이유보다는 감으로 이건 나눠야 할 것 같고, 이건 합치면 좋을 것 같다는 사고 과정으로 진행했고 아쉬움이 남았습니다. 객체 지향 설계에 대한 공부가 많이 필요함을 느꼈던 과제였습니다.
구현에 있어서는 Game 클래스의 start() 메서드는 타인이 알아보기 어려울 것 같았습니다. 또한, 일부분은 하드 코딩된 것이 있어서 어떻게 하면 가독성 있고 깔끔하게 코드를 작성할 수 있을지 공부하고 이 후 수정하는 시간을 가져야겠다고 생각했습니다.
받은 피드백🍫
input, output 도 나눠야 한다는 피드백을 받았습니다. View를 처리함에 있어서 input, output이 비슷한 기능이라고 생각했는데 아니었던 것 같습니다. 앞으로는 이 또한 나눠야하겠다고 느꼈습니다.
https://github.com/pkyung/java-baseball-precourse/tree/pkyung
GitHub - pkyung/java-baseball-precourse
Contribute to pkyung/java-baseball-precourse development by creating an account on GitHub.
github.com
'🍫카카오 테크 캠퍼스 2기 BE' 카테고리의 다른 글
[카카오 테크 캠퍼스 / BE] 2단계 첫 번째 코드 리뷰 후기 (0) | 2024.07.02 |
---|---|
[카카오 테크 캠퍼스 / BE] 두 번째 미니과제, 자동차 경주🚗 (1) | 2024.06.10 |
[카카오 테크 캠퍼스 / 2기] '웰컴 키트' 라는 것을 받다 (0) | 2024.05.14 |
[카카오 테크 캠퍼스] 1단계 4주차 학습 일지 (0) | 2024.05.12 |
[카카오 테크 캠퍼스] 1단계 3주차 학습 일지 (1) | 2024.05.02 |