numberList = 사용자가 추가한 번호들
100: numberList + 아래 값들
101: filter()를 통해 1부터 45값 중에 numberList와 중복되지 않는 값들만 반환한다.
102: shuffled()를 통해 45 - numberList.size 개수 만큼의 값을 무작위로 섞는다.
103: take()를 사용해서 셔플된 List를 원하는 길이만큼 앞에서 잘라 가져온다. - subList()와 같은 역할
104: 합해진 리스트를 오름차순으로 정렬
주요 함수 설명
101. filter
filter : Iterable 객체에서 접근할 수 있는 함수로 매개값으로 전달받은 조건에 따라, Boolean값이 true인 값들만 List 형태로 반환하는 함수.
*Iterable은 Kotlin에서 컬렉션을 순회(iterate)하는 데 사용되는 인터페이스입니다. 즉, 반복 가능한 객체로 for 루프나 다른 반복 작업을 통해 그 요소들을 하나씩 접근할 수 있습니다.
Iterable 인터페이스는 주로 리스트(List), 세트(Set), 큐(Queue) 등의 컬렉션 클래스들에서 사용된다.
102. shuffle, shuffled
Iterable의 확장 함수로 filter에서 반환된 불변의 List를 MutableList로 변환한 뒤 아래의 shuffle() 함수를 적용시켜 반환한다.
내부적으로 컬렉션 클래스의 shuffle 함수를 재호출
r: Random 클래스 객체
rnd가 null 이라면 rnd와 r에 무작위 랜덤값을 넣고, 새로운 shuffle 함수를 호출
새로운 shuffle 함수
(셔플 임계값인 5와 || RandomAccess 인터페이스를 구현하는 컬렉션인지 아닌지를 기준으로) 서로 다른 swap함수를 호출한다.
- ex) 리스트의 사이즈가 4인 경우
for문 내부 로직에서는 i-1 인덱스와 i 인덱스를 swap
- ex) 리스트의 사이즈가 10인 경우
리스트를 배열로 변환한 후 배열을 셔플(for + swap)하고, 다시 리스트로 복사한다.
배열(Array)는 성능이 중요하고, 크기가 변경되지 않는 상황에 적합하며,
리스트(List)는 크기가 변할 수 있고, 다양한 메소드와 유연성이 필요한 상황에 적합하다.
따라서, 리스트 객체의 크기가 5 이상이면 성능 최적화를 위해 리스트를 배열로 변환하는 과정을 거쳐 shuffle한다.
'Kotlin' 카테고리의 다른 글
[Kotlin in Action 4장] 정주행 (0) | 2024.03.20 |
---|---|
Kotlin Scope Functions 정리 (1) | 2024.03.11 |
[Kotlin in Action 3장] 정주행 (1) | 2024.03.01 |
[Kotlin in Action 1, 2장] 정주행 시작 (0) | 2024.02.27 |