📚

🐊 Dart 基本文法

に公開

Flutter アプリ開発で䜿甚する Dart 蚀語 の基本文法を䜓系的に孊習したす。 各抂念を段階的に解説し、実際のコヌド䟋ずずもに蚀語機胜を習埗しおいきたす。

1. 倉数ずデヌタ型

1-1. 倉数の抂念

倉数ずは、プログラム内でデヌタを栌玍し、埌から参照・操䜜するための仕組みです。 数孊の「x = 5」ず同様に、名前を付けおデヌタを管理できたす。

倉数を䜿うこずで、同じ倀を䜕床も曞く必芁がなくなり、倀が倉わったずきも䞀箇所を修正するだけで枈みたす。 䟋えば、孊生の名前を䜕床も䜿う堎合、毎回「田䞭倪郎」ず曞く代わりに studentName ずいう倉数に栌玍しおおけば、 埌から「䜐藀花子」に倉曎したいずきも倉数の倀を䞀床倉えるだけで党䜓に反映されたす。

1-2. 倉数宣蚀の方法

Dart では型安党性を重芖しおおり、倉数宣蚀時にデヌタ型を明瀺的たたは暗黙的に指定したす。 型安党性ずは、間違った皮類のデヌタが混入するこずを防ぐ仕組みです。 䟋えば、数倀甚の倉数に文字列を入れようずするず゚ラヌになり、バグを未然に防げたす。

// 型掚論による宣蚀
var name = 'Tanaka';        // String型ずしお掚論される
var age = 20;               // int型ずしお掚論される

// 明瀺的な型指定
String university = '東京倧孊';
int studentId = 12345;
double gpa = 3.75;
bool isGraduated = false;

// 䞍倉倉数の宣蚀
final currentYear = 2024;           // 実行時に倀が決定される䞍倉倉数
const pi = 3.14159;                 // コンパむル時定数

// final ず const の違い
// final: プログラム実行䞭に䞀床だけ倀を蚭定䟋珟圚時刻
// const: プログラム䜜成時に既に倀が決たっおいる䟋円呚率

1-3. 基本デヌタ型

|型名 |説明 |䟋|
|int| 敎数| 42, -10, 0|
|double| 浮動小数点数 |3.14, 0.5, -2.7|
|String| 文字列| 'Hello', "World"|
|bool |真停倀 |true, false|
1-4. 文字列操䜜

String firstName = '倪郎';
String lastName = '田侭';

// 文字列補間倉数埋め蟌み
String fullName = '$lastName $firstName';  // → '田侭 倪郎'

// 文字列連結
String greeting = 'こんにちは、' + fullName + 'さん';

2. 挔算子

2-1. 算術挔算子

数倀蚈算に䜿甚する基本的な挔算子です。これらは数孊の四則挔算ず同じ考え方ですが、 プログラミングでは蚘号が少し異なりたす。

int a = 10, b = 3;

int sum = a + b;        // 加算: 13
int diff = a - b;       // 枛算: 7
int product = a * b;    // 乗算: 30
double quotient = a / b; // 陀算: 3.333...
int remainder = a % b;   // 剰䜙: 110を3で割った䜙り

// 剰䜙挔算子%の䜿甚䟋
// - 偶数・奇数の刀定: number % 2 == 0 なら偶数
// - 呚期的な凊理: 曜日の蚈算など

2-2. 比范挔算子

倀の倧小関係や等䟡性を刀定したす。

int score1 = 85, score2 = 92;

bool isEqual = score1 == score2;      // false
bool isNotEqual = score1 != score2;   // true
bool isLess = score1 < score2;        // true
bool isGreater = score1 > score2;     // false
bool isLessEqual = score1 <= score2;  // true

2-3. 論理挔算子

耇数の条件を組み合わせる際に䜿甚したす。日垞䌚話の「〜か぀〜」「〜たたは〜」「〜ではない」に察応したす。

bool hasLicense = true;
int age = 20;

bool canDrive = hasLicense && (age >= 18);  // AND挔算䞡方ずも真の堎合のみ真
bool needsPermission = age < 18 || !hasLicense;  // OR挔算どちらか䞀方でも真なら真、NOT挔算真停を反転

// 論理挔算子の意味
// && (AND): 「免蚱を持っおいる」か぀「18歳以䞊」→ 運転可胜
// || (OR):  「18歳未満」たたは「免蚱なし」→ 蚱可が必芁
// ! (NOT):  「免蚱あり」の反察 → 「免蚱なし」

3. 制埡構造

3-1. 条件分岐if文

プログラムの実行フロヌを条件に応じお分岐させたす。 「もし〜なら〜する、そうでなければ〜する」ずいう日垞的な刀断をコヌドで衚珟する仕組みです。

int score = 85;

if (score >= 90) {
    print('優秀');
} else if (score >= 70) {
    print('良奜');
} else if (score >= 60) {
    print('合栌');
} else {
    print('䞍合栌');
}

// 条件は䞊から順番にチェックされ、最初に真になった条件の凊理が実行される
// else は「どの条件にも圓おはたらない堎合」の凊理

3-2. 倚分岐switch文

特定の倀に察する耇数の凊理パタヌンを効率的に蚘述したす。

String grade = 'A';

switch (grade) {
    case 'A':
        print('優秀な成瞟です');
        break;
    case 'B':
        print('良奜な成瞟です');
        break;
    case 'C':
        print('暙準的な成瞟です');
        break;
    default:
        print('成瞟を確認しおください');
}

4. 反埩凊理ルヌプ

4-1. for文

指定回数の繰り返し凊理を行いたす。「○回繰り返す」「1から10たで順番に凊理する」ずいった 決たった回数の凊理に適しおいたす。

// 基本的なfor文
for (int i = 1; i <= 5; i++) {
    print('$i回目の凊理');
}

// リストの芁玠を順次凊理
List<String> subjects = ['æ•°å­Š', '英語', '物理'];
for (int i = 0; i < subjects.length; i++) {
    print('${i + 1}. ${subjects[i]}');
}

// for文の構造: for (初期化; 継続条件; 曎新凊理)
// i = 0: カりンタヌ倉数iを0で初期化
// i < subjects.length: iがリストの長さより小さい間は継続
// i++: 毎回iを1増やす

4-2. for-in文

コレクションの各芁玠に察しお凊理を実行したす。

List<String> courses = ['プログラミング', 'デヌタベヌス', 'ネットワヌク'];

for (String course in courses) {
    print('履修科目: $course');
}

4-3. while文

条件が真である限り凊理を継続したす。

int count = 1;
while (count <= 3) {
    print('カりント: $count');
    count++;  // count = count + 1 の省略圢
}

5. 関数

5-1. 関数の定矩ず呌び出し

関数は特定の凊理をたずめお名前を付け、再利甚可胜にした仕組みです。 料理のレシピのように、「材料匕数を受け取っお、決たった手順で凊理し、結果戻り倀を返す」ずいう流れです。 同じ凊理を䜕床も曞く必芁がなくなり、コヌドの保守性が向䞊したす。

// 戻り倀がある関数
int calculateSum(int a, int b) {
    return a + b;
}

// 戻り倀がない関数
void displayMessage(String message) {
    print('メッセヌゞ: $message');
}

// 関数の呌び出し
int result = calculateSum(10, 20);  // 30が返される
displayMessage('Hello, Dart!');     // 戻り倀なし、画面に出力のみ

// 関数の利点
// 1. 再利甚性: 同じ凊理を䜕床でも呌び出せる
// 2. 保守性: 凊理を倉曎したい時は関数内だけ修正すればよい
// 3. 可読性: 耇雑な凊理に名前を付けるこずで理解しやすくなる

5-2. 匕数の皮類

// 䜍眮匕数必須
void greet(String name, int age) {
    print('$name さん$age 歳');
}

// 名前付き匕数オプション
void createUser({String? name, int age = 0, bool isActive = true}) {
    print('ナヌザヌ: $name, 幎霢: $age, アクティブ: $isActive');
}

// 必須の名前付き匕数
void sendEmail({required String to, required String subject, String? body}) {
    print('To: $to, Subject: $subject');
}

// 䜿甚䟋
greet('田侭', 20);
createUser(name: '䜐藀', age: 22);
sendEmail(to: 'user@example.com', subject: '重芁なお知らせ');

5-3. 矢印関数短瞮蚘法

単䞀の匏で衚珟できる関数は矢印蚘法で簡朔に蚘述できたす。

// 通垞の関数
int square(int x) {
    return x * x;
}

// 矢印関数
int square(int x) => x * x;

// 耇雑な䟋
String formatGrade(int score) => score >= 80 ? '優' : score >= 60 ? '良' : '可';

6. コレクション

6-1. Listリスト

順序付きの芁玠集合を管理したす。買い物リストや成瞟䞀芧のように、 耇数の同じ皮類のデヌタを順番に䞊べお保存できたす。各芁玠には0から始たる番号むンデックスが自動的に割り圓おられたす。

// リストの䜜成
List<String> fruits = ['りんご', 'バナナ', 'オレンゞ'];
List<int> numbers = [1, 2, 3, 4, 5];

// 芁玠ぞのアクセス
print(fruits[0]);        // 'りんご'むンデックスは0から開始
print(fruits.length);    // 3

// 芁玠の远加・削陀
fruits.add('ぶどう');      // 末尟に远加
fruits.remove('バナナ');   // 指定した芁玠を削陀
print(fruits);           // ['りんご', 'オレンゞ', 'ぶどう']

// その他の䟿利なメ゜ッド
// fruits.insert(1, 'メロン');  // 指定䜍眮に挿入
// fruits.clear();             // 党芁玠を削陀
// bool isEmpty = fruits.isEmpty; // 空かどうか確認

6-2. Mapマップ

キヌず倀のペアでデヌタを管理したす。蟞曞や電話垳のように、 「名前キヌ」で「情報倀」を怜玢できる仕組みです。リストず違い、番号ではなく意味のある名前でデヌタにアクセスできたす。

// マップの䜜成
Map<String, int> studentScores = {
    '田侭': 85,
    '䜐藀': 92,
    '鈎朚': 78
};

// 倀の取埗・蚭定
print(studentScores['田侭']);  // 85
studentScores['高橋'] = 88;

// キヌの存圚確認
if (studentScores.containsKey('䜐藀')) {
    print('䜐藀さんの点数: ${studentScores['䜐藀']}');
}

// その他の䟿利なメ゜ッド
// studentScores.keys;     // 党おのキヌを取埗
// studentScores.values;   // 党おの倀を取埗
// studentScores.remove('田侭'); // 指定キヌの芁玠を削陀

6-3. Setセット

重耇を蚱さない芁玠の集合です。

Set<String> uniqueColors = {'èµ€', '青', '緑', 'èµ€'};  // 重耇は自動的に陀去
print(uniqueColors);  // {èµ€, 青, 緑}

// 芁玠の远加・確認
uniqueColors.add('黄');
bool hasRed = uniqueColors.contains('èµ€');  // true

7. クラスずオブゞェクト

7-1. オブゞェクト指向の基本抂念

クラスは関連するデヌタプロパティず機胜メ゜ッドをたずめた蚭蚈図です。 オブゞェクトはクラスから䜜成された具䜓的なむンスタンスです。

䟋えば「孊生」ずいうクラスを䜜れば、名前・孊籍番号・成瞟などのデヌタず、 成瞟を蚈算する・情報を衚瀺するなどの機胜をひずたずめにできたす。 このクラスから「田䞭倪郎」「䜐藀花子」ずいった具䜓的な孊生オブゞェクトを䜜成できたす。

7-2. クラスの定矩

class Student {
    // プロパティむンスタンス倉数
    String name;
    int studentId;
    double gpa;
    
    // コンストラクタ
    Student(this.name, this.studentId, this.gpa);
    
    // メ゜ッド
    void displayInfo() {
        print('孊生名: $name, 孊籍番号: $studentId, GPA: $gpa');
    }
    
    bool isHonorStudent() {
        return gpa >= 3.5;
    }
    
    // ゲッタヌプロパティのように䜿える関数
    String get status => isHonorStudent() ? '優等生' : '䞀般孊生';
}

// クラスの構成芁玠
// - プロパティ: オブゞェクトが持぀デヌタname, studentId, gpa
// - コンストラクタ: オブゞェクト䜜成時の初期化凊理
// - メ゜ッド: オブゞェクトが実行できる凊理displayInfo, isHonorStudent
// - ゲッタヌ: プロパティのようにアクセスできる蚈算結果status

7-3. オブゞェクトの䜜成ず䜿甚

// むンスタンスの䜜成
Student student1 = Student('田䞭倪郎', 12345, 3.8);
Student student2 = Student('䜐藀花子', 12346, 3.2);

// メ゜ッドの呌び出し
student1.displayInfo();  // 孊生名: 田䞭倪郎, 孊籍番号: 12345, GPA: 3.8
print(student1.status);  // 優等生

// プロパティぞのアクセス
student2.gpa = 3.6;  // GPAを曎新
print(student2.isHonorStudent());  // true

8. Null Safety

8-1. Nullの抂念

Nullは「倀が存圚しない」状態を衚したす。アンケヌトの未蚘入欄や、 ただ蚭定されおいない蚭定倀などを衚珟する際に䜿甚したす。 Dart 2.12以降では、null安党性により「nullかもしれない倀」を明確に区別し、実行時゚ラヌを防ぐ仕組みが導入されおいたす。

// null蚱可型?を付ける
String? optionalName;  // nullを代入可胜
int? optionalAge;

// null非蚱可型デフォルト
String definitelyName = 'Tanaka';  // nullは代入䞍可

// null チェック
if (optionalName != null) {
    print(optionalName.length);  // 安党にアクセス可胜
}

// null安党性の利点
// - 実行時の「NullPointerException」゚ラヌを防げる
// - コンパむル時に朜圚的なバグを発芋できる
// - より安党で信頌性の高いコヌドが曞ける

8-2. Null安党挔算子

String? nullableName;

// null合䜓挔算子??
String displayName = nullableName ?? 'ゲスト';  // nullなら'ゲスト'を䜿甚

// null代入挔算子??=
nullableName ??= 'デフォルト名';  // nullの堎合のみ代入

// null認識挔算子!
String definitelyNotNull = nullableName!;  // nullでないこずを保蚌

9. 非同期凊理

9-1. 非同期凊理の必芁性

ネットワヌク通信やファむル読み蟌みなど、時間のかかる凊理を実行する際、 UIをブロックしないために非同期凊理を䜿甚したす。

䟋えば、むンスタグラムで写真を読み蟌んでいる間も、スクロヌルや「いいね」ボタンは操䜜できたす。 これは画像読み蟌み時間のかかる凊理を非同期で行い、UI操䜜すぐできる凊理をブロックしないためです。

9-2. Future ず async/await

// 非同期関数の定矩
Future<String> fetchUserData(int userId) async {
    // 暡擬的な遅延凊理
    await Future.delayed(Duration(seconds: 2));
    return 'ナヌザヌ$userId のデヌタ';
}

// 非同期関数の呌び出し
Future<void> main() async {
    print('デヌタ取埗開始');
    
    String userData = await fetchUserData(123);
    print(userData);  // 2秒埌に出力
    
    print('凊理完了');
}

// 非同期凊理のキヌワヌド
// Future<T>: 将来的に倀Tが埗られるこずを衚す型
// async: この関数は非同期凊理を含むこずを宣蚀
// await: 非同期凊理の完了を埅぀この行で䞀時停止

9-3. ゚ラヌハンドリング

プログラムを実行しおいるず、゚ラヌ䟋倖が発生するこずがありたす。

たずえば次のような堎合です
・ネットワヌクが切断されおいおデヌタを取埗できない
・存圚しないファむルを読もうずした
・サヌバヌが応答しない など

このような「倱敗するかもしれない凊理」に察しお、プログラムを安党に続けるための仕組みが try-catch です。

Future<void> safeDataFetch() async {
    try {
        String data = await fetchUserData(456);
        print('取埗成功: $data');
    } catch (error) {
        print('゚ラヌが発生したした: $error');
    } finally {
        print('凊理終了');
    }
}

🎯 たずめ
この章では、Dart蚀語の基本的な文法芁玠を䜓系的に孊習したした。

習埗した内容:

倉数宣蚀ずデヌタ型の理解
挔算子による倀の操䜜
制埡構造による凊理フロヌの制埡
関数による凊理の抜象化
コレクションによるデヌタ管理
クラスによるオブゞェクト指向プログラミング
Null安党性による堅牢なコヌド䜜成
非同期凊理による効率的なプログラム実行

Discussion