camp.nextstep.edu.missionutils.Randoms 의 메소드를 알아보자 - her0807/java-baseball-precourse GitHub Wiki

camp.nextstep.edu.missionutils.Randoms? 그게 뭔데?

우테코 미션을 진행하며 아래와 같은 요구사항이 있었다.

  • Random 값 추출은 camp.nextstep.edu.missionutils.RandomspickNumberInRange()를 활용한다.

패키지명을 보니 포비 대장님이 계신 nextstep 에서 만든 것 같았다.

위 패키지에 있는 내용을 파악하고, 요구 사항 외에도 적용해보면 어떨까? 라는 생각으로 이어졌다.

메서드 내부를 파악해보자!


목록

  • pickNumberInList
  • pickNumberInRange
  • pickUniqueNumbersInRange
  • shuffle
  • validateNumbers
  • validateRange
  • validateCount

공통

ThreadLocalRandom // 스레드 별로 난수 생성을 고립시키는 랜덤 클래스 이고, .current()로 객체를 얻는다.

pickNumberInList

리스트 내에서 숫자 하나를 랜덤으로 반환

List<Integer> 를 매개 변수로 받아 validateNumbers 로 Integer 값이 있는지 확인하고,

값이 있으면 pickNumberInRange 에 size 범위 중 숫자 하나를 랜덤으로 받아와 List에서 그 숫자(Index)의 위치에 있는 값을 리턴한다.


pickNumberInRange

범위 내에서 숫자 하나를 랜덤으로 반환

시작 범위와 끝 범위 int 두개를 받아서 validateRange 로 끝 범위가 시작 범위보다 큰지 확인하고

startInclusive + defaultRandom.nextInt(endInclusive - startInclusive + 1);

0~ 끝범위가 이닌 , 시작 범위 ~ 끝범위를 나오게 하기 위해서 위와 같이 작업해 나온 숫자를 리턴한다.


pickUniqueNumbersInRange

범위내에서 원하는 갯수만큼 숫자를 랜덤으로 반환

시작 범위, 끝 범위, 뽑을 갯수를 int 매개변수로 받고, validateRange 로 끝 범위가 시작 범위보다 큰지 확인하고

validateCount 로 범위 크기가 뽑고 싶은 갯수보다 크거나 같은지 확인한다.

ArrayList 를 만든 후, 범위 내에 숫자들을 집어 넣고, shuffle 로 섞은 뒤 원하는 갯수만 추출해서 List 로 반환한다.


shuffle

Collections.shuffle 을 사용해서 List 내에 데이터를 섞는다.


validateNumbers

List 를 넘겨 받아 Integer 값이 있는지 확인한다.


validateRange

끝 범위가 시작 범위보다 큰지 확인한다. (범위가 유효한지 확인한다)


validateCount

범위 크기가 뽑고 싶은 갯수보다 크거나 같은지 확인한다. (뽑고 싶은 갯수 범위가 유효한지 확인한다)

느낀점

요구사항에 `메서드가 하나의 일만 하게끔 구현하라` 는 내용이 있었는데 그 내용을 너무나 잘 보여준 예시같다.

또한 예외를 날릴때 메세지를 통해 예외 내용을 친절하게 전달한 부분도 참고하면 좋겠다.

아 그리고 내가 구현 했던 부분 들을 이 위에 있는 메서드를 사용하면, 충분히 대체가 가능 할 것 같다. 

메서드 내부 구조와 공식문서를 보면 처음에는 외계어 같았는데, 지금 처럼 연습을 하니 조금 가까워진 느낌이다.

이것도 리팩토링 해보자.

참고

⚠️ **GitHub.com Fallback** ⚠️