로또 번호 추첨기

매일 수정하는 GNOSS LV5·2021년 8월 24일
1

AndroidStudio

목록 보기
9/83
post-thumbnail
post-custom-banner

set을 사용하는 이유

*import java.util.*

fun main() {
  val random = Random()
  val list = mutableListOf<Int>()
  while (list.size<6){
    val randomNumber = random.nextInt(45)
    if (list.contains(randomNumber)){
      continue
    }
    list.add(randomNumber)
  }
  println (list)
}

-----------------------------------------------------------------------------------
//list를 사용할 경우 중복을 방지하기 위해 예외처리를 해야한다.

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)
}
-----------------------------------------------------------------------------------
//set의 긍정적인 사용 예시

import java.util.*

fun main() {
    val random = Random()
    val list = mutableListOf<Int>().apply{
        for (i in 1..45){
            this.add(i)
        }
    }
//shuffle()을 이용하여 리스트를 섞어주는것
    list.shuffle()
//subList를 이용해서 인덱스 0~6까지 뽑아주는 과정
    print(list.subList(0,7))    
}
-----------------------------------------------------------------------------------
//이번 챕터에서 사용할 리스트

일관성을 가진 텍스트뷰들을 단체로 관리

리사이클러뷰나 어떤 연관된 값들을 보여줄때 자주 사용된다.

// 이 클론코딩의 경우 텍스트뷰가 타겟이다.
// 리스트를 하나 만든다. 그 안의 내용물들은 텍스트뷰가 들어갈 예정이다.
private val numberTextViewList : List<TextView> bylazy{
  listOf<TextView>(
  findViewById(R.id.firstNumberTextView),
  findViewById(R.id.secondNumberTextView),
  findViewById(R.id.thirdNumberTextView),
  findViewById(R.id.fourthNumberTextView),
  findViewById(R.id.fifthNumberTextView),
  findViewById(R.id.sixthNumberTextView)
  )
}

//어떤 버튼을 클릭시 리스트 안에 들어있는 값들을 위의 텍스트뷰 리스트에 차례대로 뿌려줄 예정이다
runButton.setOnClickListener{
  val list = getRandomNumber()
  didRun = true
//forEachIndexed를 이용하여 하나씩 받는다.
  list.forEachIndexed{index,number->
    val textview = numberTextViewList[index]
    textview.text= number.toString()
    textview.isVisible= true
    }
  }

forEach와 forEachIndexed

forEach
특정 리스트가 주어졌을때 그 리스트의 사이즈 만큼 for문을 돌리고 싶을때 주로 사용한다. 해당 element들에 대하여는 it으로 받을 수 있다.
만약 특정경우에 for문을 탈출하고 싶으면 break대신 조건부분에 return값을 넣고 @forEach를 이용하여 탈출한다.
forEachIndexed
기본적인 내용은 forEach와 동일하다. 추가적으로 리스트의 value 뿐만 아니라 해당 value의 index까지 사용할 수 있으며 index,value순서로 받는다.
index와 value는 원하는 변수명에 따라 이름을 바꿀 수 있다.


상태값 관리와 예외처리

//버튼을 클릭시 예외처리를 해준다. 예외처리는 언제나 중요하므로 나올떄마다 케이스별로 정리하자.

//addButton 예외처리 상황들
addButton.setOnClickListener{
//만일 초기화가 되어있지 않고 이미 run을 한 상황
//didRun이라는 Boolean을 하나 설정한다. 상태를 관리할때 주로 사용한다.
  if (didRun){
    Toast.makeText(this,"초기화 후 시도해주세요",Toast.LENGTH_SHORT).show()
    return@setOnClickListener
  }
//내가 선태한 번호가 5개 이상일때
  if (pickNumberSet.size>=5){
    Toast.makeText(this,"번호는 5개까지만 선택할 수 있습니다.",Toast.LENGTH_SHORT).show()
    return@setOnClickListener
  }
//만약 중복된 번호를 추가하려고 할때
  if (pickNumberSet.contains(numberPicker.value)){
    Toast.makeText(this,"이미 추가된 번호입니다.",Toast.LENGTH_SHORT).show()
    return@setOnClickListener
  }
  val textView = numberTextViewList[pickNumberSet.size]
//PickNumberSet을 이용하여 매번 마지막 인덱스의 텍스트뷰를 보여준다.
  textView.isVisible= true
  textView.text= numberPicker.value.toString()
  pickNumberSet.add(numberPicker.value)
}
clearButton.setOnClickListener{
  pickNumberSet.clear()
  didRun = false
  numberTextViewList.forEach{
  it.isVisible= false
  }
}

//모든 예외처리 상황에서 만일 예외케이스에 걸린다면 Toast를 띄워주고 return@SetOnClickListener로 빠져나온다.

profile
러닝커브를 따라서 등반중입니다.
post-custom-banner

0개의 댓글