본문 바로가기

Education/인프런 워밍업 클럽(BE 0기)

인프런 워밍업 클럽 - BE 0기, 과제 #5

목차

     

    과제

    제시된 코드를 더 좋은 코드로 바꿔보기.


    풀이

    클린 코드는 한 번도 해 본 적이 없어서 처음 과제를 봤을 때 너무 막막했다... 이걸 어디서부터 해결해야 되는 거지?

     

    먼저 기존에 작성된 코드를 한 번 따라 쳐봤다. 그러자 중복되는 코드가 많다는 느낌이 들었다.

    거기다 주사위의 면이 6보다 많으면 코드도 더 많아져야 되는데?😱

     


    1. 각 숫자가 몇 번 나왔는지 카운트하는 코드를 먼저 수정해 보겠다.

    현재 주사위 번호가 6까지 있다는 가정 하에 Math.random() * 6으로 0 이상 6미만의 무작위 실수를 생성한다.

    Math.random()으로 구해진 값은 실수이기 때문에 각 번호를 카운트할 때 조건이 복잡해졌다. 랜덤으로 구해진 값을 int형으로 변환해 보겠다.

    Math.random() * 6으로 나온 값은 6미만의 실수이지 6까지 나오는 것이 아니다. 또한 0은 나오면 안 되기 때문에 구해진 랜덤 값에 +1을 해 줘야 된다.

    변수명 'r1, ...'이나 'b'는 무엇을 의미하는지 알 수 없기 때문에 변수명도 의미를 알아볼 수 있도록 수정하고, if문도 switch문으로 수정했다. 왜냐면 switch문이 연속적인 숫자 비교에 더 효율적이고 가독성이 더 좋기 때문이다.  

    int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0, cnt5 = 0, cnt6 = 0;
    
    for (int i = 0; i < a; i++) {
        int rollDice = (int)(Math.random() * 6) + 1;
        switch (rollDice) {
            case 1:
                cnt1++;
                break;
            case 2:
                cnt2++;
                break;
            case 3:
                cnt3++;
                break;
            case 4:
                cnt4++;
                break;
            case 5:
                cnt5++;
                break;
            case 6:
                cnt6++;
                break;
            default: break;
        }
    }

     

    이렇게 했는데... 이것도 코드 양이 조금 줄었다 뿐이지 주사위 번호가 많아지면 변수나 case문이 계속 추가되어야 하는 것은 마찬가지다. 이 방법은 아닌 거 같은데?🤨


    2. Dice 클래스를 생성해서 해당 클래스에 모든 메서드를 작성하고 주사위를 굴리고, 숫자를 카운트하는 역할을 하게 만들었다.

    package com.group.libraryapp.controller.study;
    
    import java.util.Scanner;
    
    public class StudyD3 {
    
        public static void main(String[] args) {
            Dice dice = new Dice(6);
            int rollCount = dice.setRollCount();
            dice.countDice(rollCount);
            dice.printResult();
        }
    
        static class Dice {
            final int[] diceNumbers; //주사위 번호
    
            public Dice(int diceNumbers) {
                this.diceNumbers = new int[diceNumbers];
            }
    
            //주사위를 굴릴 횟수를 정한다
            public int setRollCount() {
                System.out.println("숫자를 입력하세요: ");
                Scanner sc = new Scanner(System.in);
                return sc.nextInt();
            }
    
            //주사위를 굴려 각 숫자가 몇 번 나왔는지 카운트한다.
            public void countDice(int rollCount) {
                for (int i = 0; i < rollCount; i++) {
                    int rollDice = (int)(Math.random() * 6) + 1;
                    diceNumbers[rollDice-1]++;
                }
            }
    
            //결과를 출력한다.
            public void printResult() {
                for (int i = 0; i < diceNumbers.length; i++) {
                   System.out.printf((i+1) + "은 %d번 나왔습니다.\n", diceNumbers[i]);
                }
            }
        }
    }

    객체를 생성할 때 주사위가 가지고 있는 면을 알려주고, 주사위를 굴렸을 때 각 숫자가 몇 번 나왔는지 카운트해 주었다.

    마지막으로 결과를 카운트해주면 완성이다.

     

    오늘도 오래 걸렸지만 과제 끝!👍