코틀린(Kotlin)/해보기

[코틀린(Kotlin)] 로또 번호 생성기

초보왕보초 2023. 11. 7. 17:10
728x90

BMI 계산기처럼 잘 모르는 초짜가 따라 만드는 과정입니다

 


 

 

 

메인화면 레이아웃

이런 식의 메인화면을 구성한다

BMI계산기와 다른 점은 NumberPicker, LinearLayout가 사용된다

NumberPicker, << 이미지뷰, 번호추가하기 버튼은 Chains Horizontal 해준다

 

 

NumberPicker

NumberPicker는 최솟값과 최댓값을 설정하여 스크롤해서 숫자를 변경할 수 있다

background와 solidColor를 사용해서 색을 입혀준다

로또 번호 생성기니까 1~45를 스크롤해서 사용한다 

 

 

LinearLayout

가로나 세로 방향으로 나열할 때 사용된다

뷰의 위치를 지정하지 않아도 중첩되지 않고 자동으로 나열된다

NumberPicker에서 받은 번호들을 LinearLayout안에 추가시켜 준다

LinearLayout안에 TextView를 생성해 6개의 공을 만들어놓고, visibility를 gone(숨김)으로 설정해 놓는다 

번호가 추가될 때마다 값을 입력받아 isVisible를 true로 바꿔주면서 공의 색깔과 숫자를 바꾼다

 

android:background="@drawable/bg"

xml파일에 컬러와 윤곽선 색깔을 지정해 놓고 LinearLayout의 백그라운드로 사용한다

 

circle_color.xml

NumberPicker에서 받는 번호들을 LinearLayout에 추가할 때마다 생성되는 공의 색깔들을 각각 xml파일로 만들어 놓는다

(로또번호는 숫자 구간에 따라 공 색깔이 다르다)

 

 

 


 

 

 

XML 작업은 대충 마무리..

 

선언부

변수가 사용될 때 초기화(지연초기화)하는 by lazy를 사용한다

findViewById를 이용해서 clearButton(초기화), addButton(번호 추가하기), runButton(자동 생성 시작), numPick(NumberPicker)과 (구간에 따라 색이 다른)공에 접근한다

 

didRun = false

현재 run이 실행 중인지 체크하는 값, 처음에는 실행되지 않았으니까 초기값은 false

 

private val pickNumberSet = hashSetOf<Int>()

받은 숫자의 담아둘 공간을 만들어두는 것

hashSet은 내부적으로 키와 인덱스를 이용해 검색과 변경 등을 매우 빠르게 처리한다고 한다

또한, 불변성 선언이 없기 때문에 추가 및 삭제 등의 기능을 수행할 수 있다

 

 


 

 

fun Oncreate

numPick.minValue, numPick.maxValue

NumberPicker의 최솟값, 최댓값을 설정

 

밑의 세 함수들(Add, Run, Clear)은 추가, 자동생성, 초기화 버튼 클릭 시 실행된다

 

 


 

 

initAddButton()

48) setOnClickListener를 사용해서 클릭했을 때의 이벤트

didRun = true일 땐 번호가 꽉 차있기 때문에 초기화가 필요하다

50) showToast를 이용해서 메시지 "초기화 후에 시도해주세요."를 띄운다

51) pickNumberSet의 size가 5개 이상일 땐 숫자 제한을 두는 메시지를 띄운다

52) pickNumberSet안에 contains를 사용해서 같은 숫자가 반복되는지를 체크한 후, 반복될 시 메시지를 띄운다

53) 그 외(모든 조건이 성립될 때)는

54) textView를 만들어 numTextViewList에서 [picknuMberSet.size]만큼 꺼내온다

55) textView.isVisible을 true로 바꿔 visible이 gone이었던 숫자를 보이게 한다

56) textView.text = numPick.value.toString()으로 생성된 공에 숫자를 써준다

58) setNumBack 함수를 받아서 밸류값은 numPick.value, textView를 같이 불러준다

59) 앞에서 만든 공을 PickNumberSet.add(numPick.value)로 추가해 준다

 

showToast

String타입의 메시지를 생성해 준다

 

setNumBack

각 구간에 따라서 공들의 색깔을 바꿔준다

(ContextCompat은 Resource값을 가져올 때 SDK에 버전 같은 걸 고려하지 않고 가져오게 해주는 클래스라고 한다)

 

 


 

 

RunButton()

77) 숫자 자동 생성을 하는 함수(getRandom)를 생성

79) getRandom함수로 6개의 공을 다 채웠기 때문에 didRun = true

81) forEachIndexed를 사용해서 addButton()에서 했던 것처럼 isVisible과 text(공의 숫자)를 바꿔준다

 

getRandom()

함수가 다 처리되고 나면 리스트형태의 숫자 6개 값을 리턴하는 함수를 만들어준다

91) numbers에 filter를 이용해서 1~45 중에 pickNumberSet에 해당되지 않는 숫자를 넣는다

92) 이미 지정된 수 + [numbers를 섞고(shuffled) (6 - 이미 지정된 수의 크기만큼) 갖는다(take)]

92) 그러고 나서 sorted()를 이용해 오름차순 정렬시킨다

 

 

 


 

 

ClearButton()

pickNumberSet을 clear() 해준다

추첨된 공들의 isVisible을 false로 꺼준다

didRun을 false로 초기화시켜준다

numPick.value = 1로 NumberPicker를 1로 바꿔준다

 

728x90