camp.nextstep.edu.missionutils.Randoms 의 메소드를 알아보자 - her0807/java-baseball-precourse GitHub Wiki
우테코 미션을 진행하며 아래와 같은 요구사항이 있었다.
- Random 값 추출은
camp.nextstep.edu.missionutils.Randoms의pickNumberInRange()를 활용한다.
패키지명을 보니 포비 대장님이 계신 nextstep 에서 만든 것 같았다.
위 패키지에 있는 내용을 파악하고, 요구 사항 외에도 적용해보면 어떨까? 라는 생각으로 이어졌다.
메서드 내부를 파악해보자!
- pickNumberInList
- pickNumberInRange
- pickUniqueNumbersInRange
- shuffle
- validateNumbers
- validateRange
- validateCount
ThreadLocalRandom // 스레드 별로 난수 생성을 고립시키는 랜덤 클래스 이고, .current()로 객체를 얻는다.리스트 내에서 숫자 하나를 랜덤으로 반환
List<Integer> 를 매개 변수로 받아 validateNumbers 로 Integer 값이 있는지 확인하고,
값이 있으면 pickNumberInRange 에 size 범위 중 숫자 하나를 랜덤으로 받아와 List에서 그 숫자(Index)의 위치에 있는 값을 리턴한다.
범위 내에서 숫자 하나를 랜덤으로 반환
시작 범위와 끝 범위 int 두개를 받아서 validateRange 로 끝 범위가 시작 범위보다 큰지 확인하고
startInclusive + defaultRandom.nextInt(endInclusive - startInclusive + 1);
0~ 끝범위가 이닌 , 시작 범위 ~ 끝범위를 나오게 하기 위해서 위와 같이 작업해 나온 숫자를 리턴한다.
범위내에서 원하는 갯수만큼 숫자를 랜덤으로 반환
시작 범위, 끝 범위, 뽑을 갯수를 int 매개변수로 받고, validateRange 로 끝 범위가 시작 범위보다 큰지 확인하고
validateCount 로 범위 크기가 뽑고 싶은 갯수보다 크거나 같은지 확인한다.
ArrayList 를 만든 후, 범위 내에 숫자들을 집어 넣고, shuffle 로 섞은 뒤 원하는 갯수만 추출해서 List 로 반환한다.
Collections.shuffle 을 사용해서 List 내에 데이터를 섞는다.
List 를 넘겨 받아 Integer 값이 있는지 확인한다.
끝 범위가 시작 범위보다 큰지 확인한다. (범위가 유효한지 확인한다)
범위 크기가 뽑고 싶은 갯수보다 크거나 같은지 확인한다. (뽑고 싶은 갯수 범위가 유효한지 확인한다)
요구사항에 `메서드가 하나의 일만 하게끔 구현하라` 는 내용이 있었는데 그 내용을 너무나 잘 보여준 예시같다.
또한 예외를 날릴때 메세지를 통해 예외 내용을 친절하게 전달한 부분도 참고하면 좋겠다.
아 그리고 내가 구현 했던 부분 들을 이 위에 있는 메서드를 사용하면, 충분히 대체가 가능 할 것 같다.
메서드 내부 구조와 공식문서를 보면 처음에는 외계어 같았는데, 지금 처럼 연습을 하니 조금 가까워진 느낌이다.
이것도 리팩토링 해보자.
- camp.nextstep.edu.missionutils.Randoms
- ThreadLocalRandom and Random