Flutter初心者の学習記録 第5回:関数とクラスの基本

こんにちは、ジミーです!前回はDartのデータ構造(リスト、マップ、セット)について紹介しました。今回は、Dartプログラミングの要となる 関数(Function)と クラス(Class)の基本について解説します。
📝 関数(Function)の基本
関数は、特定の処理をひとまとめにしたコードブロックです。何度も使う処理を関数化することで、コードの再利用性が高まります。
基本的な関数の定義と呼び出し
// 関数の定義
void greet() {
print('こんにちは、Flutterの世界へようこそ!');
}
// 関数の呼び出し
void main() {
greet(); // 出力: こんにちは、Flutterの世界へようこそ!
}
引数(パラメータ)を持つ関数
// 引数を受け取る関数
void greetPerson(String name) {
print('こんにちは、$name さん!');
}
void main() {
greetPerson('ジミー'); // 出力: こんにちは、ジミー さん!
}
戻り値(返り値)のある関数
// 戻り値を返す関数
int add(int a, int b) {
return a + b;
}
void main() {
int result = add(5, 3);
print('5 + 3 = $result'); // 出力: 5 + 3 = 8
}
名前付き引数とデフォルト値
// 名前付き引数(オプション)を持つ関数
void introduceYourself({String name = '名無し', int age = 20}) {
print('私の名前は$nameで、$age歳です。');
}
void main() {
introduceYourself(); // 出力: 私の名前は名無しで、20歳です。
introduceYourself(name: 'ジミー'); // 出力: 私の名前はジミーで、20歳です。
introduceYourself(age: 25, name: 'タロウ'); // 出力: 私の名前はタロウで、25歳です。
}
アロー関数(短縮構文)
// 通常の関数
int multiply(int a, int b) {
return a * b;
}
// アロー関数(=>)を使った短縮形
int multiplyArrow(int a, int b) => a * b;
void main() {
print(multiply(4, 5)); // 出力: 20
print(multiplyArrow(4, 5)); // 出力: 20(同じ結果)
}
🧩 クラス(Class)の基本
クラスは、オブジェクト指向プログラミングの基本要素で、データ(プロパティ)と振る舞い(メソッド)をひとまとめにしたものです。
クラスの定義と使用
// Personクラスの定義
class Person {
// プロパティ(フィールド)
String name;
int age;
// コンストラクタ
Person(this.name, this.age);
// メソッド
void introduce() {
print('私の名前は$nameで、$age歳です。');
}
}
void main() {
// インスタンスの作成
Person person = Person('ジミー', 25);
// メソッドの呼び出し
person.introduce(); // 出力: 私の名前はジミーで、25歳です。
}
名前付きコンストラクタ
class User {
String username;
String email;
// 通常のコンストラクタ
User(this.username, this.email);
// 名前付きコンストラクタ
User.fromEmail(this.email) {
username = email.split('@')[0];
}
}
void main() {
User user1 = User('flutter_dev', 'flutter@example.com');
print('${user1.username}: ${user1.email}'); // 出力: flutter_dev: flutter@example.com
User user2 = User.fromEmail('dart@example.com');
print('${user2.username}: ${user2.email}'); // 出力: dart: dart@example.com
}
プライベートプロパティとゲッター・セッター
class BankAccount {
// プライベートプロパティ(_で始まる)
String _accountNumber;
double _balance = 0;
BankAccount(this._accountNumber);
// ゲッター
String get accountInfo => 'アカウント: $_accountNumber, 残高: $_balance円';
double get balance => _balance;
// セッター
set deposit(double amount) {
if (amount > 0) {
_balance += amount;
}
}
// 通常のメソッド
void withdraw(double amount) {
if (amount > 0 && _balance >= amount) {
_balance -= amount;
} else {
print('残高不足です');
}
}
}
void main() {
BankAccount account = BankAccount('123-456-789');
account.deposit = 10000;
print(account.accountInfo); // 出力: アカウント: 123-456-789, 残高: 10000円
account.withdraw(3000);
print('残高: ${account.balance}円'); // 出力: 残高: 7000円
}
継承
// 親クラス
class Animal {
String name;
Animal(this.name);
void makeSound() {
print('動物が鳴いています');
}
}
// 子クラス
class Dog extends Animal {
String breed;
Dog(String name, this.breed) : super(name);
// メソッドのオーバーライド
@override
void makeSound() {
print('$name: ワンワン!');
}
void fetch() {
print('$nameはボールを取ってきました!');
}
}
void main() {
Animal animal = Animal('動物');
animal.makeSound(); // 出力: 動物が鳴いています
Dog dog = Dog('ポチ', '柴犬');
dog.makeSound(); // 出力: ポチ: ワンワン!
dog.fetch(); // 出力: ポチはボールを取ってきました!
}
🔍 実践的な例:Flutterでのクラスの活用
Flutterでは、ほとんどすべてのものがクラスです。ウィジェットを作るときも、クラスを定義して使います。
// Flutterでのカスタムウィジェット
import 'package:flutter/material.dart';
// StatelessWidgetを継承したカスタムウィジェット
class UserInfoCard extends StatelessWidget {
final String name;
final String email;
// コンストラクタ
const UserInfoCard({
Key? key,
required this.name,
required this.email,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Text(name, style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
const SizedBox(height: 8),
Text(email, style: const TextStyle(fontSize: 16)),
],
),
),
);
}
}
// 使用例(別のウィジェット内で)
// UserInfoCard(name: 'ジミー', email: 'jimmy@example.com'),
📊 まとめ
- 関数:
- コードの再利用性を高める
- 引数と戻り値を持つことができる
- 名前付き引数やデフォルト値でAPIを柔軟に設計できる
- クラス:
- データ(プロパティ)と振る舞い(メソッド)をカプセル化
- コンストラクタでオブジェクトの初期化を制御
- 継承を使って機能を拡張
- Flutterアプリ開発の基礎となる概念
関数とクラスを組み合わせることで、保守性が高く、再利用性のあるコードを書くことができます。Flutterアプリ開発では、これらの概念を使いこなせると、クリーンなコードが書けるようになります。
次回は、抽象クラス & インターフェースについて解説する予定です。引き続き、Flutter学習ブログを通じて一緒に成長していきましょう!
それではまた次回👋