입문
실생활 앱 (계산기)
수식란과 답란을 분리하고 사칙연산, 괄호, 거듭제곱, 제곱근을 처리하는 계산기 앱을 만듭니다.
동작
실생활 앱 (계산기) 실행 화면
계산기
입문
수식란0
답란0
숫자와 연산 기호를 누르면 수식란에 그대로 이어서 표시됩니다. = 버튼을 누르면 수식은 유지하고 답란에 계산 결과만 표시합니다. 사칙연산, 괄호, 거듭제곱, 제곱근 버튼을 함께 제공합니다.
예제 코드
계산기
import 'dart:math';
import 'package:flutter/material.dart';
class CalculatorApp extends StatefulWidget {
const CalculatorApp({super.key});
@override
State<CalculatorApp> createState() => _CalculatorAppState();
}
class _CalculatorAppState extends State<CalculatorApp> {
final keys = ['7', '8', '9', '+', '4', '5', '6', '-', '1', '2', '3', '×', 'C', '0', '=', '÷', '(', ')', '^', '√'];
String expression = '';
String answer = '0';
void press(String key) {
setState(() {
if (key == 'C') {
expression = '';
answer = '0';
} else if (key == '=') {
answer = calculate(expression);
} else {
expression += key;
}
});
}
String calculate(String value) {
// 실제 앱에서는 expression parser 패키지를 붙이면 더 안전합니다.
// 여기서는 수식 상태와 답 상태를 분리하는 구조를 보여줍니다.
return value.isEmpty ? '0' : '계산 결과';
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [
Expanded(child: Text('수식란: \${expression.isEmpty ? '0' : expression}')),
Expanded(child: Text('답란: $answer')),
],
),
GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
children: keys.map((key) {
return ElevatedButton(
onPressed: () => press(key),
child: Text(key),
);
}).toList(),
),
],
);
}
}
Card(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'계산기',
style: TextStyle(fontSize: 22, fontWeight: FontWeight.w900),
),
const SizedBox(height: 16),
Row(
children: [
Expanded(child: Text('수식란: $expression')),
Expanded(child: Text('답란: $answer')),
],
),
const SizedBox(height: 12),
GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
children: keys.map((key) {
return FilledButton.tonal(
onPressed: () => calculate(key),
child: Text(key),
);
}).toList(),
)
],
),
),
)
계산기
입문
수식란0
답란0
예제 코드 기능별 설명
코드를 나누어 읽기
import
dart:math는 제곱근 같은 수학 연산을 확장할 때 사용합니다. material.dart는 TextField, 버튼, GridView, 레이아웃 위젯을 만들기 위해 필요합니다.
import 'dart:math';
import 'package:flutter/material.dart';
클래스 구조
CalculatorApp은 StatefulWidget입니다. 수식과 답이 버튼 입력에 따라 계속 바뀌므로 State 클래스에서 expression과 answer를 관리합니다.
class CalculatorApp extends StatefulWidget {
const CalculatorApp({super.key});
}
버튼 목록
keys는 화면에 표시할 계산기 버튼의 순서입니다. 버튼 배열을 하나로 두면 GridView에서 같은 방식으로 반복 렌더링할 수 있습니다.
final keys = ['7', '8', '9', '+', '4', '5', '6', '-', ...];
수식란과 답란 분리
연산 기호를 누를 때 숫자가 0으로 바뀌던 문제를 없애기 위해 입력 중인 expression과 계산 결과 answer를 따로 둡니다.
String expression = '';
String answer = '0';
연산 버튼 입력
숫자와 기호는 모두 수식란에 이어 붙입니다. =을 눌렀을 때만 계산해서 답란을 갱신합니다.
if (key == '=') {
answer = calculate(expression);
} else {
expression += key;
}
연산 버튼 구분
기본 사칙연산에 곱셈, 나눗셈, 괄호, 거듭제곱, 제곱근 버튼을 추가했습니다. C와 =은 실수로 누르면 영향이 큰 버튼이라 결과 화면에서 다른 색으로 구분했습니다.
final keys = ['7', '8', '9', '+', '4', '5', '6', '-', '1', '2', '3', '×', 'C', '0', '=', '÷', '(', ')', '^', '√'];