숫자 야구 프로젝트 - 트러블슈팅

J_log·2024년 10월 22일
0

1. 랜덤 숫자가 갱신되지 않던 문제

원인 추론

생성자에서 랜덤한 숫자를 생성하는데 main메서드 에서 생성자를 최초에 한번만 호출하고 있다.

해결 방안

생성자의 호출 위치를 바꿔주거나 랜덤 숫자를 생성하는 메서드를 해당 클래스 내부에서 호출되도록 로직을 바꿔야 겠다고 생각했다.
결론적으로 생성자에서 랜덤 숫자를 생성하지 않고 해당 클래스 내부에서 호출되도록 하였다.

main메서드 while 반복문 내에서 매번 새로운 인스턴스를 생성하면 메모리 할당과 해제가 반복되면서 성능에 부담이 될 수 있고 메서드의 형태로 기능을 분리하면 필요할 때 언제든 기능을 사용할 수 있기에 유연성과 재사용성이 증가한다고 생각한다.

결과 확인

정상적으로 랜덤한 숫자를 생성하는 로직이 작동한다.


2. Strike, Ball 판정 오류

원인 추론

Strike와 Ball을 판정하는 메서드를 결과를 출력하는 메서드의 파라미터로 전달하여 바로 출력이 가능하게 구현하려고 했으나 원하는 값을 얻을 수 없었다. 처음에는 호출 순서가 꼬인걸까..생각 했지만 코드를 보면 스트라이크 체킹을 하고 이미 끝난 숫자를 또 볼 체킹을 하여 중복된 체크를 하고 있었다.

displayHint(countOfStrike(input), countOfBall(input));
  • displayHint는 파라미터로 스트라이크의 갯수(int), 볼의 갯수(int)를 입력받아 출력하는 메서드이다.

해결 방안

순차적으로 체크할 수 있게 Strike를 체크한 다음에 Ball을 체크하도록 내부 조건문을 수정했다.

  • 수정 전 코드
private int countOfStrike(String input) {
        String[] answerLetters = answerNumber.split(""); // 정답 숫자를 자릿수 별로 나눠서 배열에 담기
        String[] inputLetters = input.split(""); // input 을 자릿수 별로 나눠서 배열에 담기

        for (int i = 0; i < inputLetters.length; i++) {
            if (inputLetters[i].equals(answerLetters[i])) {
                strikeCount++;
            } 
        }
        return strikeCount;
    }

    private int countOfStrike(String input) {
    	String[] answerLetters = answerNumber.split(""); // 정답 숫자를 자릿수 별로 나눠서 배열에 담기
    	String[] inputLetters = input.split(""); // input 을 자릿수 별로 나눠서 배열에 담기

        for (int i = 0; i < inputLetters.length; i++) {
            if (inputLetters[i].contains(answerLetters[i])) {
                ballCount++;
            } 
        }
        return ballCount;
    }
  • 수정 후 코드
private void answerChecking(String input) {
        String[] answerLetters = answerNumber.split(""); // 정답 숫자를 자릿수 별로 나눠서 배열에 담기
        String[] inputLetters = input.split(""); // input 을 자릿수 별로 나눠서 배열에 담기

        for (int i = 0; i < inputLetters.length; i++) {
            if (inputLetters[i].equals(answerLetters[i])) {
                strikeCount++;
            } else {
                ballCheck(inputLetters[i]);
            }
        }
    }

    private void ballCheck(String inputLetter) {
        //숫자는 맞지만 위치는 맞지 않을 경우
        if (answerNumber.contains(inputLetter)) { //정답에 유저가 입력한 값이 존재하는지 확인
            ballCount++;
        }
    }

결과 확인

정상적으로 Strike와 Ball을 체킹할 수 있다.

post-custom-banner

0개의 댓글