[인프런 워밍업 클럽] BE 0기 5일차 과제
클린코드를 위해 각 책임에 맞게 객체들을 만들어 보았다. 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)
주사위 면이 12개일 때의 결과 (DICENUM = 12)
댓글을 작성해보세요.