이번 주차 미션 정리[책] 객체 지향의 사실과 오해를 읽고 설계해보기책 속 예시미션에 적용구현 기능 목록📘 용어 정의🗂️ ModelCar (자동차)Cars (자동차 컬렉션)RacingResult (경주 결과)👩🏻💻 ViewInputViewOutputView📡 ControllerRacingController⚙️ UtilRandomDigitGeneratorToday in 프리코스
이번 주차 미션 정리
- 기능 요구 사항
- 주어진 횟수동안 n대의 자동차는 전진 또는 멈출 수 있음
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 함
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시키고 앱 종료해야 함
- 전진하는 조건은 0~9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우임
- 각 자동차에 이름 부여할 수 있음
- 전진하는 자동차 출력할 때 자동차 이름을 같이 출력함
- 자동차 이름은 쉼표를 기준으로 구분하며 이름은 5자 이하만 가능함
- 게임 완료한 후 우승자 알려줌
- 우승자가 여러 명일 경우 쉼표를 이용하여 구분함
- 프로그래밍 요구 사항
- indent depth는 최대 2까지만 허용함 (while문 안에 if문 들어있음 2임)
- 3항 연산자 금지함
- 함수가 한 가지 일만 하도록 최대한 작게 만들어야 함
- Junit5와 AssertJ를 이용해 본인의
기능 목록이 정상 동작함을테스트 코드로 확인해야 함 (test/java/study 참고) - Randoms.pickNumberInRange(0,9)와 Console.readLine() 활용해야 함
- 과제 진행 요구 사항
- 기능 구현 전에
기능 목록만들고,기능 목록 단위로 커밋하기
- 과제 목표
- 함수 분리하고, 함수별로 테스트 작성하는 것에 익숙해지기
- 소감문엔 이번주차 목표를 중심으로 학습하면서 느낀 점 적기. 이때 학습한 “과정”을 잘 드러내기
- 예외 처리
- 자동차 이름 : 쉼표 사이의 무엇이든 가능
- 이동 횟수 : 정수
[책] 객체 지향의 사실과 오해를 읽고 설계해보기
책 속 예시
- 이야기 : 하트 왕의 파이를 도둑 맞은 사건에 대해 모자장수가 증언함
- 재판장엔 하트 왕, 하얀 토끼, 모자 장수가 있었음
- 하트 왕이 “첫 번째 목격자를 불러라” 라고 명령함
- 하얀 토끼가 “목격자인 모자 장수 나와라”라고 외침
- 모자 장수가 증언대에 섬
- 하트 왕이 “증언하라”라고 명령함
- 모자 장수가 증언을 함
- 협력 : 요청과 응답
- 누군가가 왕에게 재판을 요청함으로써 재판이 시작됨
- 왕이 하얀 토끼에게 증인을 부를 것을 요청함
- 왕의 요청을 받은 토끼는 모자 장수에게 증인석으로 입장할 것을 요청함
- 모자 장수는 증인석에 입장함으로써 토끼의 요청에 응답함
- 모자 장수의 입장은 왕이 토끼에게 요청했던 증인 호출에 대한 응답이기도 함
- 왕이 모자 장수에게 증언할 것을 요청함
- 모자 장수는 증언함으로써 왕의 요청에 응답함
- 책임 : 하는 것과 아는 것
- 왕
- 하는 것 : 하얀 토끼에게 목격자 불러오도록 요청, 모자 장수에게 증언하라 요청
- 하얀 토끼
- 하는 것 : 모자 장수가 증인석에 입장하도록 요청
- 아는 것 : 목격자가 모자 장수라는 사실
- 모자 장수
- 하는 것 : 스스로 증인석에 입장(생성)
- 아는 것 : 증언할 내용(자신이 알고 있는 사실을 증언해야 할 책임)
- 역할 : 책임의 집합 (재사용성)
- 왕 → 판사
- 모자 장수 → 증인
미션에 적용
삽질
- 이야기 : 왕 앞에서 자동차들이 경주를 함
- 게임장에 자동차들, 진행자, 심판, 왕이 있음
- 왕이 “빨간 자동차, 파란 자동차를 불러라”라고 명령함
- 진행자가 “빨간 자동차, 파란 자동차 나와라”라고 외침
- 빨간 자동차와 파란 자동차가 스타트 라인으로 나옴
- 왕이 “5판(이동)에 승부를 내라”라고 명령함
- 아래를 5회 반복함
- 진행자가 “빨간 자동차, 파란 자동차 출발!”이라고 명령함
- 빨간 자동차와 파란 자동차가 이동함
- 심판이 “빨간 자동차 1m, 파란 자동차 0m 이동!”이라고 외침
- 왕이 “우승자를 말해라”라고 명령함
- 진행자가 심판한테 “우승자~~~?”라고 물음
- 심판이 “우승자는~ 빨간자동차!”라고 답함
- 협력 : 요청과 응답
- 누군가가 왕에게 경주를 요청함으로써 경주가 시작됨
- 왕이 진행자에게 특정 자동차들을 부를 것을 요청함
- 왕의 요청을 받은 진행자는 해당 자동차들이 스타트 라인에 설 것을 요청함
- 빨간 자동차와 파란 자동차는 스타트 라인에 섬으로써 진행자의 요청에 응답함
- 자동차들의 입장은 왕이 진행자에게 했던 자동차 입장에 대한 응답이기도 함
- 왕이 진행자에게 5회 안에 승부를 내라고 요청함
- 진행자는 심판한테 나오라 요청함
- 심판이 심판석에 입장함으로써 진행자의 요청에 응답함
- 심판의 입장은 왕이 진행자에게 했던 승부 내기에 대한 응답이기도 함
- 진행자가 자동차들에게 이동하라 요청함
- 자동차들이 이동함으로써 진행자의 요청에 응답함
- 자동차들의 이동은 왕이 진행자에게 했던 승부 내기에 대한 응답이기도 함
- 진행자가 심판한테 라운드 결과 말하라고 요청함
- 심판이 라운드 결과를 답함으로써 진행자의 요청에 응답함
- 왕이 진행자에게 승부의 결과를 말할 것을 요청함
- 진행자가 심판한테 우승자를 답할 것을 요청함
- 심판이 우승자를 답함으로써 진행자와 왕의 요청에 응답함
- 책임 : 하는 것과 아는 것
- 왕
- 하는 것 : 진행자에게 특정 자동차들 불러오도록 요청, 진행자에게 몇 회 안에 승부를 낼지 요청, 진행자에게 결과 말하라고 요청
- 아는 것 : 자동차 이름, 라운드 수
- 진행자
- 하는 것 : 자동차들이 스타트라인에 서도록 요청, 자동차들이 이동하도록 요청, 심판이 심판대에 서도록 요청, 심판에게 라운드 별 결과 답하도록 요청, 심판에게 우승자 답하도록 요청
- 아는 것 : 달릴 자동차가 누구인지, 심판 볼 심판이 누구인지
- 심판
- 하는 것 : 스스로 심판석에 입장(생성), 결과 판독
- 아는 것 : 매 라운드 결과, 최종 결과
- 자동차들
- 하는 것 : 스스로 스타트라인에 입장(생성), 이동
- 아는 것 : 이동할 수 있는지 없는지 여부
- 역할 : 책임의 집합 (재사용성)
- 진행자 → 게임 진행자 (GameController)
- 심판 → 게임 결과 (GameResult)
- 왕 → 없애기로 결정함
삽질 2
- 이야기 : 자동차들이 경주를 함
- 게임장에 자동차들, 진행자, 심판이 있음
- 진행자가 “빨간 자동차, 파란 자동차 불러와라”라고 외침
- 빨간 자동차와 파란 자동차가 스타트 라인으로 나옴
- 아래를 5회 반복함
- 진행자가 “빨간 자동차, 파란 자동차 출발!”이라고 명령함
- 빨간 자동차와 파란 자동차가 이동함
- 심판이 “빨간 자동차 1m, 파란 자동차 0m 이동!”이라고 외침
- 진행자가 심판한테 “우승자는 누구?”라고 물음
- 심판이 “우승자는~ 빨간자동차!”라고 답함
- 협력 : 요청과 응답
- 누군가가 진행자에게 경주를 요청함으로써 경주가 시작됨
- 진행자는 빨간 자동차와 파란 자동차가 스타트 라인에 설 것을 요청함
- 빨간 자동차와 파란 자동차는 스타트 라인에 섬으로써 진행자의 요청에 응답함
- 진행자는 심판한테 나오라 요청함
- 심판이 심판석에 입장함으로써 진행자의 요청에 응답함
- 아래를 반복함
- 진행자가 자동차들에게 이동하라 요청함
- 자동차들이 이동함으로써 진행자의 요청에 응답함
- 진행자가 심판한테 라운드 결과 말하라고 요청함
- 심판이 라운드 결과를 답함으로써 진행자의 요청에 응답함
- 진행자가 심판한테 우승자를 답할 것을 요청함
- 심판이 우승자를 답함으로써 진행자의 요청에 응답함
- 책임 : 하는 것과 아는 것
- 진행자
- 하는 것 : 자동차들이 스타트라인에 서도록 요청, 자동차들이 이동하도록 요청, 심판이 심판대에 서도록 요청, 심판에게 라운드 별 결과 답하도록 요청, 심판에게 우승자 답하도록 요청
- 아는 것 : 달릴 자동차가 누구인지, 심판 볼 심판이 누구인지
- 심판
- 하는 것 : 스스로 심판석에 입장(생성), 결과 판독
- 아는 것 : 매 라운드 결과, 최종 결과
- 자동차들
- 하는 것 : 스스로 스타트라인에 입장(생성), 이동
- 아는 것 : 이동할 수 있는지 없는지 여부
- 역할 : 책임의 집합 (재사용성)
- 진행자 → 게임 진행자 (GameController)
- 심판 → 게임 결과 (GameResult)
- 이야기 : 자동차들이 경주를 함
- 게임장에 자동차들, 자동차 매니저, 진행자, 심판이 있음
- 진행자가 “자동차들 불러와라”라고 외침
- 매니저가 “빨간 자동차, 파란 자동차 나와라”라고 외침
- 빨간 자동차와 파란 자동차가 스타트 라인으로 나옴
- 아래를 5회 반복함
- 진행자가 “자동차들 출발!”이라고 명령함
- 매니저가 “빨간 자동차, 파란 자동차 출발!”이라고 외침
- 빨간 자동차와 파란 자동차가 이동함
- 진행자가 “자동차들 현재 위치를 말해라”라고 명령함
- 심판이 “빨간 자동차 3m, 파란 자동차 1m 지점!”이라고 외침
- 진행자가 심판한테 “우승자는 누구?”라고 물음
- 심판이 “우승자는~ 빨간자동차!”라고 답함
- 협력 : 요청과 응답
- 누군가가 진행자에게 경주를 요청함으로써 경주가 시작됨
- 진행자는 자동차들이 스타트 라인에 설 것을 요청함
- 진행자의 요청을 받은 매니저는 빨간 자동차와 파란 자동차가 스타트 라인에 설 것을 요청함
- 빨간 자동차와 파란 자동차는 스타트 라인에 섬으로써 매니저와 진행자의 요청에 응답함
- 아래를 반복함
- 진행자가 자동차들에게 이동하라 요청함
- 진행자의 요청을 받은 매니저가 빨간 자동차와 파란 자동차한테 이동하라 요청함
- 자동차들이 이동함으로써 매니저와 진행자의 요청에 응답함
- 진행자가 심판한테 자동차들 현재 위치 말하라고 요청함
- 심판이 자동차들의 현재 위치를 답함으로써 진행자의 요청에 응답함
- 진행자가 심판한테 우승자를 답할 것을 요청함
- 심판이 우승자를 답함으로써 진행자의 요청에 응답함
- 책임 : 하는 것과 아는 것
- 진행자
- 하는 것 :
- 매니저한테 자동차들 불러오도록 요청, 매니저한테 자동차들 이동하도록 요청
- 심판에게 자동차들 현재 위치 답하도록 요청, 심판에게 우승자 답하도록 요청
- 심판
- 하는 것 : 자동차들 현재 위치 판독, 우승자 판독
- 아는 것 : 매 라운드 결과, 최종 결과
- (자동차) 매니저
- 하는 것 : 자동차가 스타트라인에 입장하도록 요청, 자동차가 이동하도록 요청
- 아는 것 : 게임에 참여할 자동차들
- 자동차
- 하는 것 : 스스로 스타트라인에 입장(생성), 이동
- 아는 것 : 전진할 수 있는지 없는지 여부
- 역할 : 책임의 집합 (재사용성)
- 진행자 → 경주 진행자 (RacingController)
- 심판 → 경주 결과 (RacingResult)
- 자동차 매니저 → 자동차 컬렉션 (Cars)
- 자동차 → 자동차 (Car)
구현 기능 목록
삽질
📘 용어 정의
- 이동 : 게임의 각 라운드를 의미한다. 매 이동(라운드)마다 자동차들은 전진하거나 안하거나 한다.
🗂️ Model
Car
- 자동차 이름이 5자 이하인지 검사할 수 있다
- 전진할지 안 할지 결정할 수 있다
- 현재까지 전진한 거리를 알 수 있다
Cars
- 경주에 참여하는 자동차들을 생성할 수 있다
- 자동차들이 이동하도록 명령할 수 있다
RacingResult
- 각 자동차들이 얼마나 이동했는지 알 수 있다
- 어떤 자동차가 우승했는지 알 수 있다
👩🏻💻 View
InputView
- 사용자로부터
자동차 이름을 입력받을 수 있다 (String → List<String>으로 변환해 반환)
- 사용자로부터
이동 시도 횟수를 입력받을 수 있다 (String → int로 변환해 반환)
OutputView
- 자동차의 전진 거리를 출력할 수 있다
- 우승한 자동차를 출력할 수 있다
📡 Controller
RacingController
- 이동 시도 횟수만큼 자동차들이 이동하게 할 수 있다
- 각 이동마다 결과를 알 수 있다
- 우승한 자동차를 알 수 있다
⚓ Util
RandomDigitGenerator
- 0~9 사이의 랜덤한 숫자를 생성할 수 있다
📘 용어 정의
- 경주 : 애플리케이션이 시작되어 경주가 시작되고 우승자가 나와 경주가 종료될 때까지를 의미한다.
- 이동 : 경주의 각 라운드를 의미한다. 매 이동(라운드)마다 자동차들은 전진하거나 안하거나 한다.
- 전진 : 이동과 달리 실제로 자동차가 움직였는지 안움직였는지 여부를 표현한다.
- 결과값이
pobi : --라면 전진 횟수는 2회라는게 특정되는 반면, 이동 횟수는 알 수 없다.
🗂️ Model
Car (자동차)
자동차 이름유효성 검사 기능- 5자 초과면 예외 처리
전진 시도기능
총 전진 거리계산 기능
Cars (자동차 컬렉션)
자동차들 생성기능
자동차들 이동기능
RacingResult (경주 결과)
자동차들 총 전진 거리수합 기능
우승 자동차결정 기능
👩🏻💻 View
InputView
자동차 이름입력 기능 (String → List<String>으로 변환해 반환)
이동 시도 횟수입력 기능 (String → int로 변환해 반환)- 정수 아니면 예외 처리
- 0 이하면 예외 처리
OutputView
자동차 전진 거리출력 기능
우승 자동차출력 기능
📡 Controller
RacingController
- 경주 진행 기능
- 자동차이름으로
자동차 컬렉션 생성기능 - 이동 시도 횟수만큼
자동차들 이동기능 - 각
이동마다 결과확인 기능 경주 결과확인 기능
⚙️ Util
RandomDigitGenerator
0~9 사이의 랜덤 숫자생성 기능
Today in 프리코스
TIL 작성하기
준비
과제 설명 꼼꼼히 읽고 정리하기
몰입
객체지향의 사실과 오해 책 읽기
객체지향적으로 설계하기
기능 목록 작성하기(기능 내지 테스트 단위 중심)
- 다음 주차에 해보고 싶은 것
[책] 테스트 주도 개발 시작하기를 참고해 설계해보기
