플러터 강좌: 13.3 로또 앱의 기능 구현

플러터는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 구글의 UI 도구 키트입니다. 다양한 플랫폼에서 네이티브 성능을 발휘하며, 매력적인 사용자 인터페이스를 제공합니다. 이번 강좌에서는 플러터를 사용하여 로또 앱의 기능을 구현하는 방법을 알아보겠습니다. 로또 앱은 사용자가 로또 숫자를 추첨하고, 당첨 번호와 비교하여 결과를 확인할 수 있는 유용한 모바일 애플리케이션입니다.

1. 프로젝트 준비하기

로또 앱을 만들기 위해서는 먼저 플러터 환경을 설정해야 합니다. Flutter SDK를 설치하고, 새 프로젝트를 생성합니다.

flutter create lotto_app

생성된 프로젝트 디렉토리로 이동하여, 필요한 패키지를 설치합니다.

cd lotto_app

2. 앱 구조 설계

로또 앱은 사용자가 번호를 선택하고, 당첨 번호를 확인할 수 있는 두 가지 주요 기능이 있습니다. 앱의 구조를 설계할 때, 사용자 경험을 고려하여 각각의 화면을 명확히 나누는 것이 중요합니다.

2.1 화면 구성

  • 메인 화면: 번호 선택 및 추첨 버튼이 있는 화면
  • 결과 화면: 당첨 번호와 비교하여 결과를 보여주는 화면

이 두 화면을 구현하기 위해서는 Flutter의 Navigator를 활용하여 화면 간 이동을 관리할 것입니다.

3. 번호 선택 기능 구현

3.1 UI 구성

메인 화면에서 사용자가 로또 번호를 선택할 수 있도록 UI를 구성합니다. GridView를 사용하여 번호를 배열하고, 사용자가 선택할 수 있도록 합니다.

import 'package:flutter/material.dart';

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State {
  List selectedNumbers = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('로또 번호 선택기')),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3),
        itemCount: 45,
        itemBuilder: (context, index) {
          return GestureDetector(
            onTap: () => _onNumberTap(index + 1),
            child: Container(
              margin: EdgeInsets.all(4),
              decoration: BoxDecoration(
                color: selectedNumbers.contains(index + 1) ? Colors.blue : Colors.grey[200],
                borderRadius: BorderRadius.circular(10),
              ),
              child: Center(child: Text('${index + 1}', style: TextStyle(fontSize: 24))),
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _drawNumbers,
        tooltip: '번호 추첨',
        child: Icon(Icons.monetization_on),
      ),
    );
  }

  void _onNumberTap(int number) {
    setState(() {
      if (selectedNumbers.contains(number)) {
        selectedNumbers.remove(number);
      } else {
        if (selectedNumbers.length < 6) {
          selectedNumbers.add(number);
        }
      }
    });
  }

  void _drawNumbers() {
    // 추첨 로직 구현
  }
}

3.2 번호 추첨 로직

사용자가 6개의 번호를 선택했을 때, 당첨 번호를 랜덤으로 생성합니다. 이 때 중복된 번호가 없도록 주의해야 합니다.


void _drawNumbers() {
  Random random = Random();
  Set winningNumbers = {};
  
  while (winningNumbers.length < 6) {
    winningNumbers.add(random.nextInt(45) + 1);
  }

  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => ResultScreen(selectedNumbers: selectedNumbers.toSet(), winningNumbers: winningNumbers.toSet()),
    ),
  );
}

4. 결과 화면 구현

당첨 번호와 사용자가 선택한 번호를 비교하여 결과를 보여주는 화면을 생성합니다.

class ResultScreen extends StatelessWidget {
  final Set selectedNumbers;
  final Set winningNumbers;

  ResultScreen({required this.selectedNumbers, required this.winningNumbers});

  @override
  Widget build(BuildContext context) {
    int matches = selectedNumbers.intersection(winningNumbers).length;

    return Scaffold(
      appBar: AppBar(title: Text('결과 화면')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('당첨 번호: ${winningNumbers.join(", ")}', style: TextStyle(fontSize: 24)),
            Text('당신이 선택한 번호: ${selectedNumbers.join(", ")}', style: TextStyle(fontSize: 24)),
            Text('맞춘 개수: $matches', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
          ],
        ),
      ),
    );
  }
}

5. 앱의 최종 구조

위에서 구현한 모든 클래스를 종합하여 로또 앱의 최종 구조를 만들어봅니다. 각 화면 간의 연결은 Navigator를 통해 이루어집니다. 사용자가 번호를 선택하고 추첨 버튼을 클릭하면 결과 화면으로 이동하게 됩니다.

6. 앱의 디자인 개선

기본적인 기능이 구현되었으니, 앱의 디자인을 개선하여 더욱 매력적인 사용자 경험을 제공하도록 합니다. 예를 들어, 색상 스킴을 통일하고, 버튼에 애니메이션 효과를 추가할 수 있습니다.

7. 추가 기능 제안

  • 당첨 확률 계산기: 사용자가 선택한 번호를 기반으로 당첨 확률을 계산합니다.
  • 이전 추첨 결과 보기: 이전 당첨 번호를 저장하고, 사용자에게 보여줍니다.
  • 로또 통계: months/monthly statistics/monthly.html monthly statistics에 대한 다양한 데이터를 시각적으로 제공합니다.

8. 결론

이번 강좌를 통해 플러터를 활용한 로또 앱의 기본적인 기능 구현 방법에 대해 알아보았습니다. 로또 앱은 사용자가 번호 선택과 추첨, 결과 확인을 통해 재미를 느낄 수 있는 간단하면서도 유용한 애플리케이션입니다. 추가 기능을 통해 더욱 풍부한 경험을 제공할 수 있으며, 자신의 브랜드로 발전시킬 수도 있습니다.

어떠한 프로젝트를 진행할 때 기초부터 시작하여 점차 복잡한 기능을 추가해 나가는 것이 중요합니다. 이번 강좌를 통해 플러터의 기본 기능을 익히고, 나아가 복잡한 앱 개발에도 도전해보시기 바랍니다.

참고 자료