https://dev-playground.tistory.com/11
[Kotlin] 로또번호 랜덤 생성기 - 1(프로젝트 생성)
kotlin 처음 해보는 필자가 구글링으로 알음알음 따라 만드는 과정임.된다는 보장 없음. 정확한 코딩이라는 보장 없음. 코틀린 1도 모르는 필자이지만, 그래도 내가 원하는 기능은 다 넣고 싶은
dev-playground.tistory.com
https://dev-playground.tistory.com/56
[Kotlin] 로또번호 랜덤 생성기 - 2 (Layout 파일 생성)
로또번호 랜덤 생성기 - 2 (Layout 파일 생성) # Layout 구성화면을 MainActivity와 랜덤 번호가 추출 된 화면으로 나눠서 개발 예정랜덤 번호 추출은 로또 번호 기준으로 번호 6개 묶음을 7개 정도 한번에
dev-playground.tistory.com
로또번호 랜덤 생성기 - 3 (Activity 작업)
MainActivity 내 로또와 연금복권 Activity로 이동 가능한 Button 생성
Activity 와 XML 연결은 view binding을 이용하여 설정.
MainActivity.kt
바인딩 클래스 이름 규칙에 따라 activity_main.xml 을 ActivityMainBinding으로 설정한다.
바인딩 클래스에 inflate는 xml에 있는 뷰를 객체화 해주는 셈이다.
private var mBinding: ActivityMainBinding? = null
private val binding get() = mBinding!! // null
private lateinit var lottoMainBtn : Button
private lateinit var pensionMainBtn : Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_main)
// 위의 R.layout.activity_main이 아닌 view binding을 이용하여 xml 설정
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// view binding 이용하여 xml 설정하면 하위 view의 ID를 이용해서 접근 가능
binding.idLottoMainBtn.setOnClickListener(randomLotto)
initButton()
}
바인딩 클래스 이름은 규칙이 정해져 있다.
| Activity 이름 | Binding 클래스 이름 |
| MainActivity | ActivityMainBinding |
| SubActivity | ActivitySubBinding |
| XXXActivity | ActivityXXXBinding |
fun initButton() {
lottoMainBtn = binding.idLottoMainBtn
pensionMainBtn = binding.idPensionMainBtn
lottoMainBtn.setOnClickListener(randomLotto)
pensionMainBtn.setOnClickListener(randomPension)
}
val randomLotto = View.OnClickListener {
val intent = Intent(this, RandomLottoActivity::class.java)
//startService(intent)
startActivity(intent)
}
onCreate()에서 선언한 initButton()으로 각 button에 view binding 및 클릭 시 이벤트 설정.
로또 번호는 service 없이 activity 내에서 랜덤 숫자를 돌릴 예정이라 intent 에 다음 activity를 설정해 준다.
RandomLottoActivity.kt
lotto_activity.xml -> LottoActivityBinding 으로 binding 설정.
1~45까지 번호 동적으로 생성 하여 담을 부모가 되는 View GridLayout 선언.
랜덤으로 추출해서 동적으로 생성 할 list 선언 및 선택한 번호를 담는 list 선언
최종적으로 번호 7개가 보여지는 부모 View인 LinearLayout 선언

class RandomLottoActivity : AppCompatActivity() {
private lateinit var binding: LottoActivityBinding
private lateinit var gridLayout: GridLayout // 1~45 까지 번호의 부모 layout
private lateinit var linearLayout: LinearLayout // 최종 7개 번호의 부모 layout
private val selectNumber = mutableListOf<Int>() // 선택 된 번호 리스트
private val randomNumber = mutableListOf<Int>() // 랜덤으로 추출한 번호 리스트
private val listNumber = mutableListOf<Int>() // 최종 7개 번호 리스트
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LottoActivityBinding.inflate(layoutInflater)
gridLayout = binding.selectNumber
linearLayout = binding.linearLayout
setContentView(binding.root)
selectNumberView()
// 랜덤 추출 버튼
binding.randomBtn.setOnClickListener {
lottoRandomNumber()
binding.randomBtn.isEnabled = false
}
// 번호 초기화 버튼
binding.resetBtn.setOnClickListener {
listNumber.clear()
selectNumber.clear()
randomNumber.clear()
linearLayout.removeAllViews()
binding.randomBtn.isEnabled = true
}
}
}
랜덤으로 번호 추출이 완료되면 랜덤 추출버튼 비활성화 및 초기화 버튼 클릭시 랜덤버튼 비활성화 해제.
초기화 버튼 선택 시 각 list를 초기화 작업과, LinearLayout 초기화.
// 1~45까지 그리기 및 번호 선택
fun selectNumberView() {
for(i in 1..45) {
val textView = TextView(this).apply {
text = i.toString()
drawBackground(i, this)
gravity = Gravity.CENTER
setOnClickListener {
selectNumber(i)
listNumber.add(i)
}
}
var layoutParams = GridLayout.LayoutParams().apply {
width = 0
height = GridLayout.LayoutParams.WRAP_CONTENT
columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1f)
setMargins(5)
}
textView.layoutParams = layoutParams
gridLayout.addView(textView)
}
}
// 선택 또는 랜덤 번호 그리기
fun selectNumber(selectNum: Int) {
val textView = TextView(this).apply {
text = selectNum.toString()
drawBackground(selectNum, this)
gravity = Gravity.CENTER
}
var params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
params.setMargins(5)
textView.layoutParams = params
linearLayout.addView(textView)
}
// 번호별 background 그리기
fun drawBackground(temp:Int, view: TextView) {
when(temp) {
in 1..10 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_yellow)
in 11..20 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_green)
in 21..30 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_red)
in 31..40 -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_blue)
else -> view.background = ContextCompat.getDrawable(this@RandomLottoActivity,R.drawable.circle_gray)
}
}
// 최종 7개 번호 그리기
fun numberListView() {
for(i in listNumber.indices) {
selectNumber(listNumber[i])
}
}
// 랜덤 번호
fun lottoRandomNumber() {
val randomNum = Random()
for(i in 0..(6 - listNumber.size)) {
val random = randomNum.nextInt(45) + 1
if(!randomNumber.contains(random) && !listNumber.contains(random)) {
randomNumber.add(random)
}
}
numberResult()
}
// 랜덤 번호 리스트화
fun numberResult() {
listNumber.clear()
if(randomNumber.isNotEmpty()) {
for(i in randomNumber.indices) {
listNumber.add(randomNumber[i])
}
}
numberListView()
}

번호 선택과 버튼 클릭 시 동작을 담은 함수들.
이상한 부분이나 궁금하신 부분 있으면 댓글로 부탁드립니다.
고수님들의 조언도 감사히 듣겠습니다.
'개발 > kotlin' 카테고리의 다른 글
| [Kotlin] companion object 정리 (1) | 2025.06.16 |
|---|---|
| [Kotlin] 로또번호 랜덤 생성기 - 2 (Layout 파일 생성) (1) | 2025.05.13 |
| [Kotlin] Data Class (0) | 2025.04.18 |
| [Kotlin] 코틀린에서 뷰 바인딩(View Binding) (0) | 2025.03.27 |
| [Kotlin] tools:ignore="UselessParent" (0) | 2025.02.03 |