본문 바로가기

우테코

우테코 2주차 - [자동차 경주] 프로그래밍 요구사항 파악 + 구현 기능 목록 작성

2주차 미션이 시작되었다.

 

이번 미션은 자동차 경주로

구체적인 요구사안은 다음 링크에 정리되어 있다.

https://github.com/woowacourse-precourse/java-racingcar-6

 

GitHub - woowacourse-precourse/java-racingcar-6

Contribute to woowacourse-precourse/java-racingcar-6 development by creating an account on GitHub.

github.com

 

이중 주의해야 할 점은 바로 기능 요구사항이다.

 

1. 기능 요구사항

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
  • 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

 

추가된 요구사항

  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
  • 3항 연산자를 쓰지 않는다.
  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
  • JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.
    • 테스트 도구 사용법이 익숙하지 않다면 test/java/study를 참고하여 학습한 후 테스트를 구현한다.

2. 내가 생각한 2주차 미션의 포인트

 

포인트1. 메소드 분리

: depth를 2로 제한한 것에서 각 기능별 메소드 분리가 핵심이라는 생각이 들었다.

: 이러한 포인트는 미션 메일에도 나와있는 만큼 신경써야 할 사안이라 생각된다.

파생된 생각흐름

=> 예외처리를 할 때에도 적법성 검사를 함수로 분리하자

=> depth가 3개로 초과할 때 nested loop문을 함수로 분리하자

=> 기능 단위를 최소화하고 그것들을 결합하여 기능을 구현하자(jason 님이 강조한 OOP의 핵심)

 

 

포인트2. TDD

: 지난 자바 기초 강의에서 간단한 TDD 실습을 해서 조금 자신감이 생겼다.

: 각 함수별 test 코드 작성으로 구현 => Test 과정을 실현해볼 생각이다.

 

참고: 

https://velog.io/@jkijki12/Java-TDD

 

[Java] TDD 어떻게 하는가?

TDD가 무엇이냐!!!!! 왜 자꾸 내눈에 보이는 것이냐!!!

velog.io

 

 

포인트3. API 활용

: 지난 1주차 공통피드백에도 들어있던 내용이다.

: JAVA collection 및 API를 적극적으로 메소드에 적용해야 겠다는 생각이 들었고 이를 위해 api pdf를 받아 한번 학습해보았다.

 

참고: 

https://hyunndyblog.tistory.com/32

 

JAVA - 주요 API 정리

책에 나온 JAVA에서 주로 쓰이는 API들 정리. *API(=라이브러리) : 프로그램 개발에 사용되는 클래스 및 인터페이스의 모음. 1. java.lang 패키지 - 자바 프로그램의 기본적인 클래스를 담고 있는 패키지

hyunndyblog.tistory.com


3. 작성한 구현 기능 목록

 

## 프로그램 시퀀스
1) 자동차 이름 입력 : 사용자로부터 자동차 이름을 입력받는다.
- 자동차 이름은 쉼표로 구분되어 있다.
- 자동차 이름이 5자 이하인지 검사한다. 

2) 횟수 입력 : 사용자로부터 턴 수를 입력받는다.
- 횟수는 1회 이상의 양수 숫자여야 한다.

3) 각 차수별 시행: 자동차별 전진 or 머무름
    - 자동차 별로 0에서 9사이의 난수를 발생시킨다.
    - 난수가 4이상일 경우 한칸 전진한다.
    - 난수가 4미만일 경우 그대로 머문다.

4) 우승자 출력
    - 단독 우승자의 경우 우승자의 이름을 출력한다.
    - 복수 우승자의 경우 우승자들의 이름을 쉼표로 구분하여 출력한다.

## 예외상황
1) 자동차의 이름 입력
    - 한개의 자동차 이름이 5자 이상일 때[1]
    - 쉼표로 구분될 것[1]
    - 중복된 자동차 이름이 있을 때[1]
    - 빈 값 체크[1]
    - 쉼표로 끝나는 경우[1]
2) 횟수 입력
    - 입력된 횟수가 숫자가 아닐 때[1]
    - 입력된 횟수가 양수가 아닐 때[1]

## 기능 구현 목록

1. 자동차 이름 입력 받기[1]
- 자동차 이름이 조건에 맞는지 확인하는 기능[1]
- 쉼표를 기준으로 자동차 이름 목록을 문자열 리스트로 저장[1]
   
2. 시도 회수 입력받기[1]
- 숫자가 정확히 입력되었는지 확인하는 기능[1]

3. 자동차
- 자동차 이름 생성하기[1]
- 자동차 이동거리 생성하기[1]
- 자동차 전진여부 함수 생성하기[1]

4. 자동차 목록
- 자동차 목록 생성하기[1]
- 자동차 목록에 자동차 추가하기[1]
- 턴마다 매턴 자동차 전진하는 함수[1]
- 매 턴의 결과 출력함수[1]
- 우승자 목록을 알려주는 함수[1]

5. 레이싱 게임
- 자동차 목록 생성
   - 자동차 생성
- 입력된 턴수 만큼 반복
   - 자동차 전진
   - 턴별 실행결과 출력
- 우승자 목록 생성
   - 우승자 목록 출력