본문 바로가기
스파르타(부트캠프)/TIL (Today I Learned)

[내일배움캠프] 스파르타 17일차_24.10.21

by Kimuky 2024. 10. 21.

공부 내용 및 활동 내용

1. Java  기초 학습 (Java의 정석 :  chapter 8. 예외처리 ~  chapter 9. java.lang )
2. 개인과제 lv4
3. 과제 회고

 


1. 예외 처리

- 책을 읽어보았지만 정확히 어떻게 써야하고 조건을 어떻게 설정해야할 지 감이 잘 오지 않는다. 내용이 조금 어려워서 제대로 안 읽힌 것 같다. 내일 일어나서 한 번 다시 읽어보아야 할 것 같다. 정말 예외처리를 제대로 공부해놓으면 프로젝트에 많은 도움이 될 것 같지만, 아직까지 과제에서는 예외처리를 깊게하지 않아도 되서 그런지 모르겠지만 잘 머리에 들어오지 않는다.


2. Java.lang

- 실질적으로 "구현"에 있어서는 가장 도움되었던 파트였다. 각 클래스의 메소드, 변환 등을 다뤘었고, 이것을 읽어보면서 제대로 이해하지 못하고 사용한 메소드들을 다시 학습할 수 있었다. 대부분이 알고 있던 내용이지만 StringBuffer, StringBuilder, 클래스 메소드 오버라이딩 등은 처음 제대로 알게 되었다.


3.. 개인 과제 회고

오늘은 책도 안 읽히고, 기초 과제 발제가 나온겸 9시간 동안 과제를 했었던 것 같다.

스텝바이 스텝으로 진행했다

 

과제 분배 시간

0 ~ 2 시간: 설계를 어떻게 해야할지, 필요한 클래스들이 무엇인지

2 ~ 5 시간: lv 1 ~ lv 2 구현

5 ~ 6 시간: 버그 수정 및 약간의 리팩토링

6 ~ 8 시간: lv 3 ~ lv4 구현

8 ~ 9 시간: 버그 수정 및 코드 리팩토링


자체평가표

완성도 : ★ ★ ★ ★ ☆

만족도 : ★ ★ ☆ ☆ ☆

 

- 완성도

1. LV4까지 잘 구현되어 있다고 생각한다.

2. 모든 예외처리를 해놓았다고 생각한다.

 

- 만족도

1. 내 코드지만 잘 안 읽힌다.

2. 네이밍 컨벤션이 별로 좋지 않다.

3. git commit을 잘못한 것 같다.

-> lv1~2 한번에 commit, lv3~4 한번에 commit 두번의 커밋으로 과제 완성

-> 각 기능을 구현하고 commit을 진행해야할 것 같다..

4. 클래스를 잘못 나눈 것 같다.


- 마음에 안 드는 점

1. 코드가 선형적으로 읽히지 않는다. -> 코드 가독성이 떨어진다.

더보기
public class BaseballGame {

    InputRequester inputRequester;
    GameAnnouncement gameAnnouncement;
    RandomNumberGenerator randomNumberGenerator;
    Validator validator;
    GameRecorder gameRecorder;
    boolean isRunning = true;

    public BaseballGame(InputRequester inputRequester, GameAnnouncement gameAnnouncement, RandomNumberGenerator randomNumberGenerator, Validator validator, GameRecorder gameRecorder) {
        this.inputRequester = inputRequester;
        this.gameAnnouncement = gameAnnouncement;
        this.randomNumberGenerator = randomNumberGenerator;
        this.validator = validator;
        this.gameRecorder = gameRecorder;
    }

    public static void main(String[] args) {
        BaseballGame baseballGame = new BaseballGame(new InputRequester(), new GameAnnouncement(), new RandomNumberGenerator(), new Validator(), new GameRecorder());
        baseballGame.play();
    }

    public void play() {
        while (isRunning) {
            boolean isValidOption = false;
            String selectedOption = inputRequester.selectGameOption();

            while (!isValidOption) {
                isValidOption = validator.optionValidator(selectedOption);
                handleOption(selectedOption);
            }
        }
    }

    public void handleOption(String selectedOption) {
        switch (selectedOption) {
            case "0":
                setDigit();
                break;
            case "1":
                gameAnnouncement.printGameStartMessage();
                gameStart();
                break;
            case "2":
                gameAnnouncement.printRecordMessage();
                showGameRecord();
                break;
            case "3":
                gameAnnouncement.printGoodbyeMessage();
                isRunning = false;
        }
    }

    private void setDigit() {
        boolean isSetDigit = false;
        while (!isSetDigit) {
            String digit = inputRequester.selectDigit();
            if (validator.isValidDigit(digit)) {
                validator.setDigit(Integer.parseInt(digit));
                randomNumberGenerator.setDigit(Integer.parseInt(digit));
                isSetDigit = true;
            } else {
                gameAnnouncement.printWrongDigitMessage();
            }

        }
    }

    private void gameStart() {
        boolean isCorrect = false;
        int answer = randomNumberGenerator.getRandomNumber();
        int[] answerArr = randomNumberGenerator.getNumberArr();

        while (!isCorrect) {
            String stringNumber = inputRequester.inputNumber();
            if (validator.isValidNumber(stringNumber)) {
                if (validator.isAnswer(answerArr, answer)) {
                    gameAnnouncement.printCongratulationMessage();
                    gameRecorder.saveTryCounter(validator.tryCounter);
                    validator.resetTryCounter();
                    isCorrect = true;
                }
            }
        }
    }

    private void showGameRecord() {
        gameRecorder.printRecord();
    }
}

2. 함수, 변수 네이밍 컨벤션이 제대로 지켜지지 않은 것 같다.

더보기
public int[] getValidNumberArr(int answerLength) {
        int pow = digit - 1;
        int index = 0;
        int validNumberCopy = validNumber;
        int[] validNumberArr = new int[answerLength];

        while (validNumberCopy > 0) {
            int division = (int) (Math.pow(10, pow--));
            int number = validNumberCopy / division;
            validNumberCopy %= division;
            validNumberArr[index++] = number;
        }
        return validNumberArr;
    }

이렇게 수학적으로 접근할 때, 변수 네이밍을 어떻게 지정해야할 지 모르겠다...

3. 함수 간 의존성이 보인다.

더보기
    public boolean isAnswer(int[] answerArr, int answer) {
        tryCounter += 1;
        if (answer == validNumber) {
            return true;
        } else {
            int[] validNumberArr = getValidNumberArr(answerArr.length);
            countStrikeAndBall(answerArr, validNumberArr);
            return false;
        }
    }

    public int[] getValidNumberArr(int answerLength) {
        int pow = digit - 1;
        int index = 0;
        int validNumberCopy = validNumber;
        int[] validNumberArr = new int[answerLength];

        while (validNumberCopy > 0) {
            int division = (int) (Math.pow(10, pow--));
            int number = validNumberCopy / division;
            validNumberCopy %= division;
            validNumberArr[index++] = number;
        }
        return validNumberArr;
    }

    public void countStrikeAndBall(int[] answerArr, int[] validNumberArr) {
        int strikeCounter = 0;
        int ballCounter = 0;
        List<Integer> integerList = Arrays.stream(answerArr)
                .boxed()
                .toList();

        for (int i = 0; i < answerArr.length; i++) {
            int arrIndex = integerList.indexOf(validNumberArr[i]);
            if (arrIndex >= 0) {
                if (arrIndex == i) {
                    strikeCounter += 1;
                } else {
                    ballCounter += 1;
                }
            }
        }

4. 로직 처리의 문제

더보기
String temp = "";
        if (strikeCounter > 0) {
            temp += strikeCounter + "스트라이크 ";
        }
        if (ballCounter > 0) {
            temp += ballCounter + "볼";
        }
        if (strikeCounter == 0 && ballCounter == 0) {
            temp = "아웃";
        }
        System.out.println(temp);

음 이게 맞는 처리 방식인가 싶다... 너무 짜치게... 코드를 넣은 것 같다.

 

이것 말고도 많은 문제점이 있었지만 더 이상 코드가 안 읽힌다.

 

-  아 그와중에 버그가 있다.. 후우.. 바로 하자 ㅠㅠㅠㅠㅠㅠㅠ


구현도 구현이지만 네이밍 컨벤션이 정말 중요하다고 생각한다. 중간중간 제대로 짓지않아 헷갈린 것 같다. 물론 처음부터 잘하진 못하겠지만 뭔가 발전을 못하는 것 같은 느낌이 들었다. 음... 뭐가 문제인지 계속 고민해보고있다.

 

튜터님이 첫 과제에 대해 피드백을 남겨주셨지만 전혀 감을 못 잡겠다. Git 컨벤션은 어떻게 작성해야하고, push는 어떤 단위로 끊는게 좋을지, 멀티쓰레드는 뭔지..., 특정 클래스가 많은 책임을 지고 있다는게 무엇인지.. 정말 헷갈린다. 일단 내 스스로 해결하는게 좋을 것 같아 하루에 3번은 읽고있지만 해석이 잘 안 된다... 음.,... 내일 한번 튜터님 찾아가보도록 하자