TIL/Project

TIL 2024-10-26 (숫자 야구 게임 FeedBack)

myoma 2024. 10. 26. 12:44

1 ) Feedback 

  • countStrike()와 countBall()에서 input값을 자릿수로 분리하는 코드가 중복됩니다. 별도 메서드로 추출하여 재사용 할 수 있습니다
    • 기존의 자릿수 분리하는 코드
ArrayList<Integer> list = new ArrayList<Integer>();
        int num = 0;
        while (input > 0) { // 입력 받은 숫자를 자릿 수 마다 하나씩 저장
            list.add(input % 10);
            input /= 10;
        }
  • 똑같은 코드가 3개의 메서드에 들어가 있기에 중복되는 코드를 하나의 메서드로 따로 만들어준다.
public class BaseballGame {

    static ArrayList<Integer> inputlist = new ArrayList<>();

    ...

    public static void numDigits(int input) {

            inputlist.clear();

            while (input > 0) { // 입력 받은 숫자를 자릿 수 마다 하나씩 저장
                inputlist.add(input % 10);
                input /= 10;
            }
    }
}
  • 기존 클래스에 static list를 생성하여 여러 메서드에서 사용할 수 있도록 선언 및 생성.
  • 입력 받은 숫자의 자릿수를 저장하는 메서드를 따로 만들어주고 해당 코드가 있던 메서드에 해당 메서드 선언.
  • numDigits 메서드 실행 시 inputlist를 clear() 해준다.
    • why? static으로 선언했기에 초기화를 해주지 않으면 기존의 넣었던 데이터들이 그대로 남아 새로운 input을 넣어도 기존에 있던 데이터들로 인해 데이터 크기 오류 발생.
    • 그렇기 때문에 input을 받았을 때 inputlist를 clear을 해준다.
 private int countStrike(int input) {

        int num = 0;
        numDigits(input);

        for(int i = 0; i < inputlist.size(); i++) {
            if(inputlist.get(i) == ranNum[inputlist.size()-i-1]) { // 정답 숫자와 입력 한 숫자가 같은 위치에 같은 숫자면 strike
                num++;
            }
        }
        return num;
 }
  • input을 받아 numDigits에 input을 넘겨주고 자릿수를 inputlist에 저장하고 선언도 inputlist로 해준다.
  • 다른 중복 코드들도 다 변경해주면 끝.
  • 이러면 각 메서드마다 계속 Arraylist 인스턴스를 선언 및 생성을 안해주고 되며 inputlist만 가져와 사용하면 되기에 코드가 더욱 효율적으로 변한다.

 

  • Baseballgame 클래스의 ranNum과 같이 반복적으로 사용하는 수들은 상수로 만들어 관리하면 유지보수성이 증가합니다.
    • 기존 코드
public class Baseballgame {
    
    ...
    
    private static int[] ranNum = new int[3];

    public Baseballgame() {

        Integer[] arr={1, 2, 3, 4, 5, 6, 7, 8, 9};
        List<Integer> arrlist =Arrays.asList(arr);

        Collections.shuffle(arrlist);
        arrlist.toArray(arr);
        // 랜덤 난수 3자리 설정
        for(int i = 0; i < 3; i++) {
            ranNum[i] = arrlist.get(i);
        }
//        System.out.println(Arrays.toString(ranNum)); // 빠른 검증을 위해 정답 숫자를 보고 싶을 때 주석 풀어주세요.
    }
    
    ...
    
}

 

 

  •  반복적으로 사용하는 수들을 상수로 선언
public class BaseballGame {

    ...
    
    private static final Integer[] DIGITS = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    private static final int NUMBER_LENGTH = 3;
    private static int[] ranNum = new int[NUMBER_LENGTH];

    public BaseballGame() {

        List<Integer> arrlist =Arrays.asList(DIGITS);

        Collections.shuffle(arrlist);
        arrlist.toArray(DIGITS);
        // 랜덤 난수 3자리 설정
        for(int i = 0; i < NUMBER_LENGTH; i++) {
            ranNum[i] = arrlist.get(i);
        }
        System.out.println(Arrays.toString(ranNum)); // 빠른 검증을 위해 정답 숫자를 보고 싶을 때 주석 풀어주세요.
    }
    
    ...
    
}
  • 접근제어자 final을 사용해서 상수로 선언해준다.