[인프런 워밍업 클럽_0기 BE] 다섯번째 과제 - Clean Code

[인프런 워밍업 클럽_0기 BE] 다섯번째 과제 - Clean Code

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

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

 

[제시된 코드]

  • 여러 함수로 나누어도 좋습니다! 🙂

  • 여러 클래스로 나누어도 좋습니다! 🙂

image


 

*클린코드(Clean Code) 란 ?

  • 좋은코드란 무엇일까

    • 이름만으로도 예측 가능한 코드

    • 객체 생성에 유의미한 이름

    • 서술적인 이름

    • 명령과 조회를 분리

    • 오류 코드보단 예외

 

<개선된 코드>

package inflearn;


import java.util.Scanner;

import java.util.concurrent.atomic.AtomicInteger;

import java.util.concurrent.ThreadLocalRandom;

import java.util.stream.IntStream;

    public class DiceRollStatistics {

        private static final int NUMBER_OF_SIDES = 6;

        private static final int MAX_THREADS = Runtime.getRuntime().availableProcessors();

        public static void main(String[] args) {

            try (Scanner scanner = new Scanner(System.in)) {
                

                System.out.print("주사위를 던질 횟수를 입력하세요: ");

                int numberOfThrows = scanner.nextInt();


                int[] diceCounts = getDiceCounts(numberOfThrows);
                

                printStatistics(diceCounts);

            }

        }

        private static int[] getDiceCounts(int numberOfThrows) {

            AtomicInteger[] counts = new AtomicInteger[NUMBER_OF_SIDES];
            

            IntStream.range(0, NUMBER_OF_SIDES)

                    .forEach(i -> counts[i] = new AtomicInteger());

          

            IntStream.range(0, numberOfThrows)

                    .parallel()

                    .limit(MAX_THREADS) 

                    .forEach(i -> {

                    

                        int result = ThreadLocalRandom.current().nextInt(NUMBER_OF_SIDES);

                        counts[result].incrementAndGet();

                    });
            

            return IntStream.range(0, NUMBER_OF_SIDES)

                    .map(i -> counts[i].get())

                    .toArray();

        }

        private static void printStatistics(int[] diceCounts) {
            

            IntStream.range(0, NUMBER_OF_SIDES)

                    .forEach(i -> System.out.printf("주사위 눈 %d은(는) %d번 나왔습니다.\n", i + 1, diceCounts[i]));

        }

    }

댓글을 작성해보세요.

채널톡 아이콘