상세 컨텐츠

본문 제목

로또 번호 통계 및 번호 생성기 앱 개발: 기능 구현 정리

공부/Kotlin

by micalcomanie 2025. 1. 19. 03:30

본문

728x90
반응형
SMALL

https://play.google.com/apps/testing/com.micallab.lottocraft

이번 포스팅에서는 Kotlin과 Jetpack Compose를 활용해
로또 번호 생성기번호 통계 화면을 구현한 과정을 정리합니다. 이 글은 앱의 핵심 기능인 번호 생성, 출현 빈도 그래프, 그리고 AdMob 광고 통합을 포함합니다.


주요 기능

  1. 번호 생성기
    • 일반 번호 생성: 1~45 범위에서 무작위 번호 6개를 생성.
    • 통계적 번호 생성: 과거 데이터를 기반으로 빈도가 높은 번호를 활용해 번호를 생성.
  2. 로또 번호 출현 통계
    • 과거 당첨 번호 데이터를 분석하여 각 번호의 출현 빈도를 시각적으로 표시.
    • 막대 그래프를 활용하여 번호별 출현 횟수를 보여줌.
  3. AdMob 광고 통합
    • 전면 광고 및 보상형 광고를 앱 내에서 표시.

주요 코드 및 설명

1. 로또 번호 생성 로직

로또 번호는 두 가지 방식으로 생성됩니다.

  • 일반 번호 생성:
Button(onClick = {
    displayedNumbers = (1..45).shuffled().take(6).sorted()
    bonusNumber = (1..45).shuffled().first { it !in displayedNumbers }
    animationTrigger++
}) {
    Text("일반 번호 생성")
}
  • 통계적 번호 생성 (과거 데이터 기반):
fun generateScientificNumbers(data: List<LottoRound>): List<Int> {
    val frequencyMap = calculateNumberFrequency(data)

    val weightedNumbers = mutableListOf<Int>()
    for ((number, count) in frequencyMap) {
        repeat(count) { weightedNumbers.add(number) }
    }

    return weightedNumbers.shuffled().take(6).sorted()
}

2. 번호 출현 빈도 통계 화면

출현 빈도 그래프는 LazyColumn을 활용해 각 번호의 출현 횟수를 막대 그래프로 표시합니다.

@Composable
fun LottoStatisticsGraph(frequencyMap: Map<Int, Int>) {
    val maxFrequency = frequencyMap.values.maxOrNull() ?: 1

    LazyColumn(modifier = Modifier.padding(16.dp)) {
        items(frequencyMap.keys.sorted()) { number ->
            val frequency = frequencyMap[number] ?: 0
            Row(verticalAlignment = Alignment.CenterVertically) {
                Text("$number", modifier = Modifier.width(40.dp))
                Box(
                    Modifier
                        .height(24.dp)
                        .width((frequency / maxFrequency.toFloat() * 250.dp).coerceAtLeast(1.dp))
                        .background(Color.Blue)
                )
                Text("$frequency 회", Modifier.padding(start = 8.dp))
            }
        }
    }
}

3. 광고 통합

AdMob를 활용하여 전면 광고와 보상형 광고를 구현했습니다.

  • 전면 광고 로드:
private fun loadInterstitialAd() {
    val adRequest = AdRequest.Builder().build()
    InterstitialAd.load(this, testInterstitialAdUnitId, adRequest, object : InterstitialAdLoadCallback() {
        override fun onAdLoaded(ad: InterstitialAd) {
            interstitialAd = ad
        }
    })
}
  • 보상형 광고 표시:
private fun showRewardedAd(onComplete: () -> Unit) {
    rewardedAd?.show(this) { rewardItem ->
        onComplete()
        loadRewardedAd()
    }
}

UI 디자인 개선

  • 번호 출현 빈도 그래프:
    • 색상 코드를 추가해 막대의 색상이 출현 횟수에 따라 달라지도록 개선.
    • 그래프의 디자인을 사용자가 직관적으로 이해할 수 있도록 단순화.
Box(
    modifier = Modifier
        .height(24.dp)
        .width((frequency / maxFrequency.toFloat() * 250.dp).coerceAtLeast(1.dp))
        .clip(CircleShape)
        .background(
            when {
                frequency <= 5 -> Color(0xFFB3E5FC)
                frequency <= 10 -> Color(0xFF81D4FA)
                else -> Color(0xFF0288D1)
            }
        )
)

기술적 어려움 및 해결 방법

  1. Firebase 및 AdMob 초기화 문제
    • 문제: Firebase 및 광고 초기화 과정에서 일부 오류 발생.
    • 해결: MobileAds.initialize() 및 Firebase Messaging 설정을 명시적으로 작성하여 오류 제거.
  2. 출현 빈도 계산 성능 문제
    • 문제: 과거 데이터를 분석하는 과정에서 성능 저하.
    • 해결: 코루틴(Dispatchers.IO)을 활용하여 데이터를 비동기로 처리.
suspend fun fetchLottoData(range: Int): List<LottoRound> {
    return withContext(Dispatchers.IO) {
        // 데이터 크롤링 로직
    }
}

배포 준비

  • App Bundle 생성: app-release.aab 파일을 생성하여 Google Play Console에 업로드.
  • 테스트 환경 설정: Firebase를 통한 Crashlytics와 Analytics를 추가.
  • 광고 ID 테스트: 실제 광고를 표시하기 전에 테스트 ID를 활용하여 안정성 검증.

결론

이번 프로젝트는 Kotlin과 Jetpack Compose를 통해 로또 번호 생성기와 통계 분석 앱을 구현한 사례입니다. 특히 광고 통합, 데이터 시각화, 그리고 Firebase 설정 등 다양한 기술을 학습하고 적용한 점에서 유익했습니다.

추후 업데이트에서는 사용자 인터페이스 최적화 및 추가 기능(예: 번호 추천 알고리즘)을 고려하고 있습니다.

728x90
반응형
LIST

관련글 더보기