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


📝 関数(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学習ブログを通じて一緒に成長していきましょう!

それではまた次回👋

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です