🍀

11일차_객체지향을 미션 설계에 적용하기(with [책] 객체 지향의 사실과 오해)

작성일자
Oct 29, 2023
태그
DIARY_DEVELOP
프로젝트
PreCourse
책 종류

이번 주차 미션 정리

  • 기능 요구 사항
    • 주어진 횟수동안 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 작성하기
    준비
    과제 설명 꼼꼼히 읽고 정리하기
    몰입
    객체지향의 사실과 오해 책 읽기
    객체지향적으로 설계하기
    기능 목록 작성하기(기능 내지 테스트 단위 중심)
     
    • 다음 주차에 해보고 싶은 것
      • [책] 테스트 주도 개발 시작하기를 참고해 설계해보기