우리는 <클린 코드>라는 개념을 배웠습니다. <클린 코드>에 대한 감각을 익히기 위해서는 어떤 코드가 좋은 코드이고, 어떤 코드가 좋지 않은 코드인지 이론적인 배경을 학습하는 것도 중요할 뿐 아니라, 다양한 코드를 읽어 보며 어떤 부분이 읽기 쉬웠는지, 어떤 부분이 읽기 어려웠는지, 읽기 어려운 부분은 어떻게 고치면 좋을지 경험해보는 과정이 필요합니다.

이번 과제는 제시된 코드를 읽어보며, 코드를 더 좋은 코드로 고쳐나가는 과정입니다. 구글에 “클린 코드” 혹은 “클린 코드 정리”를 키워드로 검색해보면, 이론적인 배경을 충분히 찾아보실 수 있습니다. 🙂 그러한 내용들을 보며 제시된 코드를 더 좋은 코드로 바꿔보세요! (코드를 바꿀 때 왜 바뀐 코드가 더 좋은 코드인지 다른 사람에게 설명하신다고 생각해보시면 더욱 좋습니다.)

[제시된 코드]

최대한 클린하지 않게 작성된 아래 코드는 다음과 같이 동작합니다.

public class Main {

    public static void main(String[] args) throws Exception {
        System.out.print("숫자를 입력하세요 : ");
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();

        int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0;

        for (int i = 0; i < a; i++) {
            double b = Math.random() * 6;
            if (b >= 0 && b < 1) {
                r1++;
            } else if (b >= 1 && b < 2) {
                r2++;
            } else if (b >= 2 && b < 3) {
                r3++;
            } else if (b >= 3 && b < 4) {
                r4++;
            } else if (b >= 4 && b < 5) {
                r5++;
            } else if (b >= 5 && b < 6) {
                r6++;
            }
        }

        System.out.printf("1은 %d번 나왔습니다.\\n", r1);
        System.out.printf("2은 %d번 나왔습니다.\\n", r2);
        System.out.printf("3은 %d번 나왔습니다.\\n", r3);
        System.out.printf("4은 %d번 나왔습니다.\\n", r4);
        System.out.printf("5은 %d번 나왔습니다.\\n", r5);
        System.out.printf("6은 %d번 나왔습니다.\\n", r6);
    }
}

<aside> 💡 한 걸음 더!

현재 코드는 주사위가 1~6까지만 있다는 가정으로 작성되어 있습니다. 따라서 주사위가 1~12까지 있거나 1~20까지 있다면 코드를 많이 수정해야 하죠!

위의 코드를 클린하게 개선해 보았다면, 주사위의 숫자 범위가 달라지더라도 코드를 적게 수정할 수 있도록 고민해 봅시다!

</aside>

주사위 사진 예시 : https://www.google.com/search?sca_esv=600310596&rlz=1C5CHFA_enKR1067KR1067&sxsrf=ACQVn0_iT-qBMV0p_q-wUsDQsHY8hFBtlA:1705893428440&q=정십이면체+주사위&tbm=isch&source=lnms&prmd=ivsnbmz&sa=X&ved=2ahUKEwjMqc6ehPCDAxUSk1YBHUYeCcEQ0pQJegQIDhAB&biw=1512&bih=806&dpr=2

구현 결과

1. Main 클래스

package dice;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws Exception {
        System.out.print("숫자를 입력하세요 : ");
        try (Scanner scanner = new Scanner(System.in)) {
        	int repeatCount = scanner.nextInt();
            
        	 // 주사위 숫자가 나온 개수를 저장할 ArrayList 초기화
             ArrayList<Integer> countOfNums = initializeCountOfNums();
            
             RandomNum randomNum = new RandomNum(countOfNums);
             PrintResults printResults = new PrintResults(countOfNums);
             
             randomNum.CountOfNums(repeatCount);
             printResults.printResults();
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    
    
    // ArrayList를 초기화하는 함수를 통해 주사위의 눈 수가 바뀔 때 쉽게 수정 가능하도록 구
    private static ArrayList<Integer> initializeCountOfNums() {
    	ArrayList<Integer> countOfNums = new ArrayList<>();
    	for (int i = 0; i < 6; i++) {
    		countOfNums.add(0);
    	}
    	return countOfNums;
    }
}

2. RandomNumber 클래스