[인프런 워밍업 클럽] BE 0기 5일차 과제

image

클린코드를 위해 각 책임에 맞게 객체들을 만들어 보았다. Main, InputOutput, Counting

  • Main

public class Main {
    public static void main(String[] args) {
        InputOutput io = new InputOutput();
        Counting count = new Counting();

        int a = io.numberInput();
        count.count(a);
        io.output(count);
    }
}
  • InputOutput

import java.util.Scanner;

public class InputOutput {

    public int numberInput(){
        System.out.print("숫자를 입력하세요 : ");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }

    public void output(Counting counting) {
        for (int i = 0; i < Counting.DICENUM; i++) {
            System.out.printf("%d는(은) %d번 나왔습니다. \n",i+1 , counting.getNum(i));
        }
    }
}
  • Counting

public class Counting {
    public final static int DICENUM = 6;

    private int[] arr = new int[DICENUM];

    public void count(int a) {
        for (int i = 0; i < a; i++) {
            double b = Math.random() * DICENUM;
            int temp = (int) b % DICENUM;
            arr[temp]++;
        }
    }

    public int getNum(int i) {
        return arr[i];
    }
}

입출력을 위한 객체를 만들어 입출력만을 위한 책임을 부여했으며, Counting 객체를 만들어 배열을 만든 뒤, 나온 숫자에 따라 횟수를 증가시켰으며, 원하는 숫자의 횟수가 몇 번인지 알기 위해 getter를 수정하였습니다.

현재 Counting 객체는 DICENUM 상수를 통하여 간단한 변수설정을 위해 주사위 면의 갯수를 설정하고, 그에 따라 배열 설정과 출력이 가능하게 하였습니다.

하지만 이 방법은 여러 면의 주사위를 사용하거나, 전략패턴을 사용할 때와 같이, 몇 개의 면을 가진 주사위를 사용할지 런타임에 결정되게 할 때에는 적합하지 않습니다.

위와 같은 문제의 해결 방법으로 생각해본 것은, 인터페이스를 만들어 count 메소드를 선언하며, 각 구현체를 주사위의 면을 사용할 개수만큼 만들어 구현하여 기존에는 불가능하였던 확장이 가능해집니다.

하지만 단점도 존재합니다. 초기 코드를 작성할 때 여러개의 Counting 구현체를 만들어야 하여 코드를 작성하는 것이 번거로워 프로젝트의 크기를 생각할 때 trade-off를 생각하면, 인터페이스를 만든 뒤 구현체를 만드는 방식보단, 상수설정을 통하여 한개의 변수를 건드는 것 만으로 원하는 대로 기능이 작동되게 하였습니다.

 

주사위 면이 6개일 때의 결과 (DICENUM = 6)

image

주사위 면이 12개일 때의 결과 (DICENUM = 12)

image

댓글을 작성해보세요.


채널톡 아이콘