본문 바로가기
우아한테크코스/1주차 프리코스

[1주차 프리코스] 2일차 리뷰

by 행복한라이언 2023. 10. 20.
728x90
반응형

1.  TODO 체크

0. countBall 메서드 다시 작성하기

1. 예외처리 학습하기

2.컬렉션 학습하기

    - JAVA 스터디: https://cheddar-liquid-051.notion.site/1-7d30450363ce4f3b8579e8d0d5d232ab

 

1주차 주제

Java Collection

cheddar-liquid-051.notion.site

3. 코트 리팩토링하기


2.  진행상황

1) 컬렉션 학습하기

  • List, Set, Map에 대해서 학습, 디테일한 내용보다는 사용법 위주로 우선 학습

2) countBall메서드 수정 

  • 메서드 이름 변경: countBall은 실제로 Ball과 Stike가 합쳐진 값을 구하므로 countBallAndStrike로 변경
  • 컬렉션 사용 후 computeNumber와 userNumber의 교집합 구하는 방법 변경
    • 기존: for-each문 돌면서 포함될 때마다 ++;
    • 변경: retainAll 메서드 사용

3) 코드 리팩토링 진행

  • 기존: Application에 모든 기능 구현
  • 변경: 각 역할에 맞게 최대한 분리
    • Application 클래스
    • Game 클래스
    • GameRule 클래스
      • countBallAnsStrike: computNumber와 userNumber의 교집합을 통해서 Ball과 Strike 세기 
      • countStrike: 순회하면서 같은 위치에 있는 수,즉 Strike 세기
      • hintProvider: Ball과 Strike 수에 따른 힌트 제공
    • BaseBall 클래스
      • creatNumber: 서로다른, 1~9로 구성된, 자연수 생성
    • ExceptionHandler 클래스
      • isAllDigit: 숫자 외 입력이 있는지 판단
      • isValidLength: 3자리 숫자인지 판단
      • isValidNumber: 0이 포함되거나 중복되는 숫자가 있는지 판단
    • Constants 인터페이스: 상수를 관리하기 위해서 도입
      • validLength: 현재 숫자야구게임은 3자리이다. n자리까지 확장될 수 있도록 변수로 관리

3.  Game 클래스

package baseball;

import camp.nextstep.edu.missionutils.Console;

public class Game {
    private static final boolean playingGame = true;
    public Game(){
        System.out.println("숫자 야구 게임을 시작합니다.");
    }
    public void playing(){
        String computeNumber = BaseBall.creatNumber();
        System.out.println(computeNumber);
        while(playingGame) {
            System.out.print("숫자를 입력해주세요 : ");
            String userNumber = Console.readLine();

            if(!ExceptionHandler.isAllDigit(userNumber)){
                throw new IllegalArgumentException("숫자가 아닌 입력이 들어왔습니다.");
            }
            if(!ExceptionHandler.isValidLength(userNumber)){
                throw new IllegalArgumentException("3자리를 초과한 숫자가 입력으로 들어왔습니다.");
            }
            if(!ExceptionHandler.isValidNumber(userNumber)){
                throw new IllegalArgumentException("0이 포함되거나 중복된 숫자가 입력으로 들어왔습니다.");
            }

            int cntBS = GameRule.countBallAndStrike(computeNumber, userNumber);
            int cntS = GameRule.countStrike(computeNumber, userNumber);
            int cntB = cntBS - cntS;

            System.out.printf("cntB %d cntS %d".formatted(cntBS, cntS));
            System.out.println();
            if (cntS == 3) {
                System.out.println("3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료");
                System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
                String reGame = Console.readLine();
                System.out.println(reGame);
                if (reGame.equals("2")) {
//                    playingGame = false; -> "예외_테스트" 에러
                    break;
                }
                else {
                    computeNumber = BaseBall.creatNumber();
                    System.out.println(computeNumber);
                }
            }
            else {
                System.out.print("힌트: ");
                System.out.println(GameRule.hintProvider(cntB, cntS));
            }
        }
        System.out.println("게임이 종료되었습니다.");
    }
}
  • 문제점
    • playing() 메서드가 너무 무겁다. 조금 더 분리하면 좋을 것 같다. 인덴트 2이하로 줄여보자
    • if-else문 남발
    • 재시작(reGame)할 때 다른 방법 없을까 고민

4.  우선 적용하고 생각해보기!

1) 깃 커밋 컨벤션

https://velog.io/@rkio/Git-commit-%EC%BB%A8%EB%B2%A4%EC%85%98-%EC%A2%8B%EC%9D%80-commit%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

[Git] commit 컨벤션, 좋은 commit message를 남겨보자!

우테코 프리코스를 진행하면서 처음으로 commit convention이라는 것을 알게되었다.지금까지 프로젝트를 해오면서 파일을 하나하나 따로 업로드 한 적도 없었고,의미있는 커밋 메세지를 적지도 않

velog.io

2) 상수 인터페이스

https://dev-coco.tistory.com/179

 

[Java] 상수 인터페이스(Constant Interface)사용에 대한 고찰

Constant Interface Constant Interface란 오직 상수만 정의한 인터페이스이다. interface는 변수를 등록할 때 자동으로 public static final 키워드가 붙는다. 따라서 상수처럼 어디에서나 접근할 수 있으며, 하나

dev-coco.tistory.com


TODO

▶ 1. 컬렉션 이터레이터, 제네릭, Wrapper 클래스 학습하기

▶ 2. 학습한 내용 정리하기

 예외처리 학습하기

JAVA 스터디: https://cheddar-liquid-051.notion.site/1-7d30450363ce4f3b8579e8d0d5d232ab

 

1주차 주제

Java Collection

cheddar-liquid-051.notion.site


소감

 자바 컬렉션를 잘 알지 못했다. 정보처리기사 공부할 때 자바에서는 컬렉션은 잘 나오지 않아서  공부를 안했다. 그래서 파이썬보다 뭐가 많길래 막연한 두러움이 있었는데 메서드를 우선 정리해보니 별 것 없더라. 기초라서 아직 크게 어려움을 느낀 부분은 없다. 사람들이 '일급 컬렉션'이야기를 많이들 이야기하더라. 'Collection을 Wrapping(?)하면서, 그외 다른 멤버 변수가 없는 상태' 라고 하는 뭐가 있더라. Wrapping이 Wrapper 클래스랑 연결이그나마 되지 않을까라는 추측으로 내일은 우선 예외처리보다는 Wrapper 클래스 학습과 나머지 컬렉션 공부하고 정리해야겠다.

 

 자바는 내가 객체지향적으로 제대로 분리한건지 잘 모르겠지만 파이썬보다는 훨씬 쉽게 분리되었다. 음 자바라서 쉬운게 아니라 애초에 머리 속으로 역할들을 암묵적으로 나누어 놔서 쉬운건지..뭐가 정확한 이유인지는 모르겠다. 아무튼 Application에 있는거 모두 분리시켰는데 Game클래스가 아주 말썽이다. 너무 크다. playing()메서드에 모조리 넣어서 그런가 메서드 길이만 40줄 가까이 된다. 이 부분을 어떻게 해결해야할지 고민을 해야할 것 같다.

 분리하면서 접근제어자는 어떻게 해야할지 생각을 한 것 같다. 우선 전부 같은 패키지에 있어서 사실 public에 static만 떡칠했는데 그 부분에 대한 고민도 필요해보인다.

 

 상수를 다루는데 이것에 대한 고민이 또 정말 많더라..내가 파이썬을 쓸 때 이런 고민을 많이 하지 않아서 그런지 자바의 세계는 신비로웠다. 우선 내가 의도한 바를 잘 설명하고 적용한 블로그 글을 읽고 적용했는데 아직 잘 모르는 부분이 많아서 우선 적용하고 나중에 실력이 조금 늘면 다시 이 글을 읽고 이해하는 기회를 가지도록 하자.

 

→ 1. 상수 인터페이스의 사용에 대해서..

→ 2. 접근제어자와 static에 대해서..

→ 3. 일급 컬렉션에 대해서..

728x90
반응형