본문 바로가기
후기

우아한테크코스 4기 프리코스 1주차 후기 (숫자 야구 게임)

by clean_h 2021. 12. 24.
728x90

우아한테크코스 4기 프리코스 1주차 후기

https://github.com/woowacourse/java-baseball-precourse

 

GitHub - woowacourse/java-baseball-precourse: 숫자 야구게임 미션을 진행하는 저장소

숫자 야구게임 미션을 진행하는 저장소. Contribute to woowacourse/java-baseball-precourse development by creating an account on GitHub.

github.com

4기 프리코스 1주차는 숫자 야구게임 미션이다.


진행방식은 세가지 요구사항인 기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항을 만족하기 위해 노력하면서 구현하는 것이다.

미션에 대한 요구사항은 https://github.com/woowacourse/java-baseball-precourse README.md을 통해 확인할 수 있다.

기능 요구사항

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

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

 

프로그래밍 요구사항

  • JDK 8버전에서 실행 가능해야한다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍 한다.
  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용(예 -while문 안에 if 문이 있으면 들여쓰기는 2)j
  • 3항 연산자를 쓰지 않는다.
  • 함수가 한 가지 일만 하도록 최대한 작게 만들어라.
  • camp.nextstep.edu.missionutils에서 제공하는 Randoms, Console API를 활용해 구현해야 한다.
    • Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용
    • 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용
  • ApplicationTest에 있는 모든 테스트 케이스가 성공해야 한다.

 

과제 진행 요구사항

  • 미션은 저장소를 Fork/Clone해 시작한다.
  • 기능을 구현하기 전에 구현할 기능 목록을 정리해 추가한다.
  • 커밋 컨벤션을 참고하여 commit log를 남긴다.

 


 

Randoms, Console

Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용한다.
사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.

보통 랜덤 수를 추출하기 위해서는 JDK에서 기본 제공하는 Random 클래스를 사용하여 수를 랜덤으로 추출할 수 있다. 하지만 이번 조건에서는 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용해야한다.

 

import camp.nextstep.edu.missionutils.Randoms;

//랜덤 세자리 수 생성 함수
    public void RandomNum(){
        while(randomNum.size() <3) {
            int num = Randoms.pickNumberInRange(1, 9); // 1~9까지
            if (!randomNum.contains(num)) {
                randomNum.add(num);
                setNum.add(num);
            }
        }
    }

다음과 같이 랜덤 세 자릿수를 생성하는 함수를 구현하였다.

  • 다른 패키지 안의 클래스를 사용하기 위해 import로 camp.nextstep.edu.missionutils.Randoms을 선언해준 후 pickNumberinRange() 함수를 사용한다. 
  • pickNumberinRange() 함수는 범위를 지정해주면 범위 안에 있는 int형을 하나 반환한다.

 

import camp.nextstep.edu.missionutils.Console;

// 숫자 입력받는 함수
    public ArrayList<Integer> InputNum() {
        String playerNumString = Console.readLine();
        return playerNum;
    }

readLine() 함수를 사용하여 사용자가 입력하는 값을 받아올 수 있다.


IllegalArgumentException

사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

IllegalArgumentException은 런타임 에러로 메소드의 전달 인자 값이 부적절한 경우 발생한다. 따라서 값을 잘못된 값을 입력하였을 때 예외처리해줄 수 있다.

 

    // 길이 판별 함수
    public void isValidLength(String s){
        if(s.length() != 3) {
            throw new IllegalArgumentException("세자리 수보다 크거나 작음");
        }
    }

다음과 같이 throw new 구문으로 예외를 발생시킨다. 


자바 코드 컨벤션

자바 코드 컨벤션은 프로그래머 사이에서 약속의 코드 작성법이다. 컨벤션을 사용해야 소프트웨어의 가독성이 높아지기 때문에 코드 컨벤션을 사용한다. Naming, 들여 쓰기, 공백, 중괄호 등 규칙들이 존재한다. 수시로 코드 컨벤션을 꼼꼼하게 다시 읽어보고 규칙을 지키지 못한 것이 있나 다시 확인해본다. 

 

이렇게 말하면 부끄러운 일이지만 나는 자바 코드 컨벤션이 존재한다는 것을 처음 알았다. 이번 계기로 자바 코드 컨벤션을 알게 되었고, 가독성이 좋은 코드를 구현하기 위해 어떻게 구현해야 하는지 방법을 알 수 있어서 한층 더 발전한 거 같다. 


indent depth, 함수 한 가지 일

indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.

depth가 3이 넘지 않도록 구현한다는 조건은 완전 처음 들어봤다. 처음 이 조건을 봤을 때 왜 굳이 depth을 설정하면서까지 제한을 두는지 이해하지 못하였다. 아마 함수가 한 가지 일만 하도록 최대한 작게 만들기를 원해서 depth를 설정해둔 것 같다. 그래서 조건을 만족하기 위해 함수를 최대로 나누면서 구현하도록 노력하였다. 1주 차  미션에서는 이 조건이 크게 까다롭지 않았는데, 2주 차 3주 차까지 진행해본 결과 엄청 까다로웠다. 최대한 함수를 나눴지만 그래도 해결이 안 되는 것들이 몇 번 있었다. 생각을 많이 하게 하는 조건이었다.

 


Commit

커밋 컨벤션을 참고하여 commit log를 남긴다.

커밋에도 컨벤션이 존재한다.

feat, fix, docs, style, refactor, test, chore 등 type에 맞춰 커밋을 해야 한다.

 

이 조건을 보지 못하고 마음대로 commit 해서 다시 브랜치를 생성해서 진행할 수 있었다. 이미 remote로 push까지 완료한 상태라 commit 메시지를 마음대로 바꾸지 못했다..ㅜㅜ

 


 

1주차 피드백

  • 이름을 통해 의도를 드러내라

나 자신, 다른 개발자와의 소통을 위해 가장 중요한 활동 중의 하나가 좋은 이름 짓기이다. 이름을 짓는데 시간을 투자해서 의도를 드러내기 위해 노력해야 한다. 

 

  • 축약하지 마라

축약은 혼란을 야기할 뿐, 의도를 드러낼 수 있도록 축약하지 않는다. 

 

  • 공백도 코딩 컨벤션이다

 

  • 공백 라인을 의미 있게 사용해라

문맥을 분리하는 부분에 사용하는 것이 좋고, 과도한 공백은 다른 개발자에게 의문을 준다.

 

  • 반복하지 마라

중복은 소프트웨어에서 모든 악의 근원이다.

 

  • space vs tab 혼용하지 않는다

 

  • 의미 없는 주석을 달지 않는다

주석을 달기 보다는 이름을 통해 의도를 드러낸다.

 

  • 커밋 메시지를 의미 있게 작성하라

 

  • 기능 목록을 업데이트하라

처음부터 기능 목록을 완벽하게 정리할 필요는 없다. 기능을 구현하면서 문서를 계속 업데이트한다. 

 

  • 기능 목록을 재검토하라

 

  • README.md를 상세히 작성하라

어떤 프로젝트인지, 어떤 기능을 가지고 있는지 README를 통해 기술하고 소개한다.

 

  • IDE의 코드 자동 정렬 기능을 활용해라

 

  • 매직 넘버를 사용하지 마라

매직 넘버는 의미를 나타낼 수 있는 상수(static final)로 치환하여 코드의 가독성을 높인다.

 

  • 구현 순서도 코딩 컨벤션이다

클래스는 상수, 멤버 변수, 메서드 순으로 작성한다.


고찰

JAVA를 이번 기회에 처음 배웠다. JAVA를 통해 프로젝트는 해봤지만 이렇게 체계적으로 배우지는 않았었다. 

자바 코드 컨벤션을 지키면서 구현을 한다는 것이 가장 어려웠다. 여태 계속 해왔던 습관들을 한 번에 바꾸는 것이 쉽지 않았고 구현 전 설계를 하는 일 조차 나에게는 많이 버거웠다.

하지만 고생한만큼 얻은 것도 너무 많아서 프리코스를 진행하길 너무 잘했다는 생각이 든다.

 

728x90

댓글