Android - 로또번호 추첨기(1)

Code_Alpacat·2021년 11월 8일

안드로이드 기초

목록 보기
14/18

Collections의 개념

  • Set - 주머니에 숫자를 넣어놓듯이 중복된 데이터는 없고, 순서도 존재하지 않음.
  • list - 데이터가 저장되거나 삭제될때, 배열과 같이 순서를 지킴.
  • Map - Key, value 타입의 형식을 가지고 있다. 주소값에 해당하는 key와 해당 key에 저장된 데이터를 value라고 볼 수 있다. key 값의 중복은 허용하지 않는다.

예를 들어,

val numberSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>"
  • 이 numberSet은 set을 함수로 호출해서 사용했고, 추가나 삭제가 불가능한 String타입이며, 중복이 불가능한 set이라는 것을 알 수 있다.
  • 또한 emptySet은 mutableSet을 사용해 수정과 삭제가 가능한 String을 받지만 자료가 아직 들어있지않은 빈 공간이다.
  • emptyList와 emptyMap과 같이 표현도 가능하다.

그 외에도 Collections에서 제공하는 많은 함수가 있는데 공식 홈페이지에서 확인이 가능하다.
kotlinlang.org로 접속하면 된다.

로또번호 알고리즘

  • Random함수의 seed를 통해 어느정도 범위에서 무작위로 값을 뽑아내는지 유추할 수 있다.
fun Random(seed: Int): Random

Random에 seed값을 넣어주면 다시 실행시켜도 같은 값이 나온다. nextInt에 값이 주어지면 0~N-1까지 숫자가 랜덤하게 나오므로 +1을 하면 1~ N까지의 범위로 설정할 수 있다.

import java.util.*
fun main() {
    
 	val random = Random()   
    val list = mutableListOf<Int>()
    
	for(i in  1..6) {
    println("${random.nextInt(45) + 1}")
    }
}

여기서 중요한 점은 일반 Random 함수로는 중복을 배제할 수 없다는 사실이다. 그렇기에 Collections에서 list나 set을 통해 숫자가 나왔는지 판별해야한다.

  • 또한 for문을 사용하면 중복을 배제하면 6개의 숫자를 뽑기가 불가능하므로 while문을 사용한다.
import java.util.*
fun main() {
    
 	val random = Random()   
    val list = mutableListOf<Int>()
    
	while(list.size < 6){
        
        val randomNumber = random.nextInt(45) + 1
        if(list.contains(randomNumber)){
            continue
        }
        
        list.add(randomNumber)
    }
    println(list)
}
  • 다음은 Set을 활용한 코드다. list와 다르게 Set은 중복을 허용하지 않으므로 if문을 사용하지않아도 무관하다.
import java.util.*
fun main() {
    
 	val random = Random()   
    val numberSet = mutableSetOf<Int>()
    
	while(numberSet.size < 6){
        
        val randomNumber = random.nextInt(45) + 1
        numberSet.add(randomNumber)
    }
    println(numberSet)
}

그래서 이 중에서 이번 프로젝트에 사용할 방법은 아래와 같다.

list에 45개의 수를 할당하고, 모두 섞어 그 중 앞의 6개의 숫자를 출력할 것이다.

여기에서 사용하는 expression인 apply는 적용하는 객체를 모두 가져오기때문에 편리하다. 그래서 초기화할때 사용할 예정이다.

import java.util.*
fun main() {
    
 	val random = Random()   
    val list = mutableListOf<Int>().apply {
        for(i in 1..45){
            this.add(i)
        }
    }
    list.shuffle()
   	
    println(list.subList(0, 6))
}

이 식에서 처음 사용한 기능을 보자.

  • apply함수 -> 그 값자체로 초기화하는 식을 만들 수 있음.
  • shuffle -> 랜덤하게 섞음.
  • subList(from, to) -> from <= N < to의 범위의 값을 받아옴.

이 방법을 활용해 앱을 만들어보겠다!

profile
In the future, I'm never gonna regret, cuz I've been trying my best for every single moment.

0개의 댓글