[우아한테크코스 백엔드 4기]프리코스 1주차 "숫자야구게임" 회고

헌치·2021년 11월 30일
7

우아한테크코스

목록 보기
1/30
post-thumbnail

⛳ 숫자야구게임

🚀 기능 요구사항

1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임

  • 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
    • 예) 상대방(컴퓨터)의 수가 425일 때
      • 123을 제시한 경우 : 1스트라이크
      • 456을 제시한 경우 : 1볼 1스트라이크
      • 789를 제시한 경우 : 낫싱
  • 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한
    결과를 출력한다.
  • 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
  • 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
  • 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.

✍🏻 입출력 요구사항

⌨️ 입력

  • 3자리의 수
  • 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수

🖥 출력

  • 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시
1볼 1스트라이크
  • 하나도 없는 경우
낫싱
  • 3개의 숫자를 모두 맞힐 경우
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료

🔗 관련 링크

1주차 프리코스 깃허브 링크
작성한 코드
프리코스 참고자료 노션 정리


⚙️ 구현 기능 목록

✅ 컴퓨터 숫자 생성 기능

  • 랜덤하게 1~9 숫자 세개를 뽑아 배열에 저장하기
  • 배열에 중복된 수가 있는지 확인하기

✅ 유저 숫자 생성 기능

  • 유저에게 인풋 받기
    • [예외] 인풋 길이가 3이 아닌 경우
    • [예외] 인풋 속 문자 중 숫자가 아닌 게 있는 경우
    • [예외] 인풋 속 문자 중 0이 있는 경우
    • [예외] 인풋 속 문자 중 중복된 문자가 있는 경우

✅ 볼/스트라이크 결과 생성 기능

  • 볼 개수를 계산해 변수에 저장하기
  • 스트라이크 개수를 계산해 변수에 저장하기

✅ 게임(set) 실행 기능

  • 입력하세요 메세지 출력하기
  • 볼/스트라이크/낫싱 여부 출력하기
  • 3스트라이크 일 시 종료하기

✅ 게임(set) 반복 기능

  • 재시작 여부 메세지 출력하기
  • 유저에게 인풋 받기
    • [예외] "1","2" 외의 문자열이 들어온 경우
  • 게임 재시작/ 종료하기

🔍 구현 로직

반복
  컴퓨터 숫자 생성 : 1에서 9까지 정수 3개 (중복 x)
  반복
      1. 유저에게 3자리 정수 인풋 받기
          예외처리
      2. 결과 출력
          1. 입력한 수에 대한 볼, 스트라이크 개수 : n볼 n스트라이크
          2. 같은 수가 하나도 없는 경우 : 낫싱
          3. 3개의 숫자를 모두 맞힐 경우 : 3스트라이크
              + 인풋이 1일 시 브레이크
              + 인풋이 2일 시 종료
              + 이외 예외처리

📥 클래스 분리


⛳ 후기

🗒 원칙(배운 점)

  1. jdk 버전 8, intellij IDEA로 세팅했습니다.
    • checkstyle 등을 이용해 자바 코드 컨벤션을 꾸준히 확인했습니다.
    • crlflf로 전환했습니다.
  2. 커밋 메세지 컨벤션을 지키려 노력했습니다.
    • "타입(스코프): 내용" 형식으로, 모두 영문 작성했습니다.
    • 스코프에는 바뀐 파일/클래스 명을 썼고, 바뀐 파일이 3개 이상일 경우 비워뒀습니다.
  3. README.md 속 사항을 구현할 때마다 커밋을 남겼습니다.
    • 개괄적인 구현 이후엔 리팩토링 마다 커밋을 남겼습니다.
  4. MVC 구조를 사용했습니다.
    • /model : 데이터 저장 및 처리
    • /view : 인풋/아웃풋 관리
    • /controller : 프로그램 실행 로직 클래스
  5. indent = 1을 지키려 노력했습니다.
    • stream 메소드들을 공부하고 사용했습니다.
  6. 클린코드를 적용시키려 노력했습니다.
    • 메소드 당 기능 하나를 담당하도록 설계했습니다.
    • 메소드/변수명을 축약없이 설명적으로 적었습니다.
    • getter/setter 대신 상수 & 생성자를 사용했습니다.
    • 주석을 쓰지 않았습니다.
    • 하드코딩 대신 상수 클래스를 사용했습니다.
    • else/switch 대신 if/continue를 사용했습니다.

🖋 소감

이전의 저는 클린코드에 대한 열망은 있었지만, 구체적인 방법론을 몰랐습니다.

구체적으로 살펴보자면,

  1. 컨벤션의 '컨'자도 몰랐음(자바 컨벤션? 커밋컨벤션?)
  2. 클래스 분할 없이 메인 메소드 만으로 코드를 짜옴
  3. readme.md 파일은 항상 삭제해옴
  4. git 커멘드도 add,push 밖에 몰랐음
  5. indent가 무엇인지도 검색해보고서 알았음
  6. MVC 모델은 아직도 정확히 감이 안잡힘

이번 기회로 여러가지 컨벤션을 배우고 구현사항들을 하나씩 파고들 수 있었어요.
'막코딩'을 하던 이전과 비교해보면 코드의 구조가 확연히 좋아졌습니다.

능동적인 학습을 해나갈 수 있었습니다.

원칙들을 지키기 위해 스스로 서치하거나 <클린코드> 책을 읽고 적용시켰습니다.
그러면서 좋은 설계의 중요성을 체감할 수 있었습니다!
(리팩토링을 하고...또 하고...)

기존에 인강을 들으며 공부하던 방식보다 보람찼고,
README.md를 분석하며 대략적인 공부 방향이 정해졌기에 막막하지도 않았습니다ㅎㅎ

일주일이란 기간은 짧았습니다.

아직 새로 배워나가야 할 것들이 많습니다.
배운 개념들도 계속 적용시키며 익숙해져야 할 것 같습니다.
그래도 시작이 반이라는 말도 있잖아요?
앞으로도 계속 방향을 잃지 않고 공부 해나가려 합니다!
화이팅👍


📚 TODO

  • junit 공부 ->테스트 코드 작성 연습 (인풋이 비었을 때)
  • TDD 공부
  • 변수/클래스/함수명 표준 공부
  • 캡슐화 공부
  • 커밋 메세지 한글로 작성 (보기 더 편해보임)
  • intelliJ 커멘드 공부
  • 기타 등등...
profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

0개의 댓글