Dartの基本文法入門：変数宣言、条件分岐、繰り返し処理、クラス、例外処理、非同期処理について

※ この記事は、Dartの基本文法について解説しています。全体を読むのにおおよそ5～10分程度かかると思われます。

DartはGoogleが開発したオブジェクト指向のプログラミング言語で、Flutterなどのフレームワークの開発に用いられています。以下では、Dartの基本的な文法について解説します。

### 変数の宣言

Dartでは、変数を宣言するには `var`、`final`、`const` などのキーワードを使用します。

```dart
var name = "John"; final age = 30; const double PI = 3.14;
```

`var` は、宣言時に初期値を代入することで、自動的に変数の型が決定されます。 `final` は、変数の値を一度だけ代入でき、その後は変更できないことを示します。 `const` は `final` と同様ですが、コンパイル時に値が決定される必要があります。

### データ型

Dartには、以下のようなデータ型があります。

-   int：整数を表す
-   double：浮動小数点数を表す
-   String：文字列を表す
-   bool：真偽値を表す
-   List：リストを表す
-   Map：キーと値のペアを表す

```dart
int num1 = 10;
double num2 = 3.14;
String str = "Hello, World!";
bool flag = true;
List<String> list = ["apple", "banana", "orange"];
Map<String, int> map = {"apple": 100, "banana": 200, "orange": 300};
```

### 条件分岐

Dartでは、 `if`、`else`、`else if` などを使用して、条件分岐を実装することができます。

```dart
if (score >= 90) {
  print("Great!");
} else if (score >= 80) {
  print("Good!");
} else if (score >= 70) {
  print("Average.");
} else {
  print("Needs improvement...");
}
```

### 繰り返し処理

Dartでは、 `for`、`while`、`do-while` などを使用して、繰り返し処理を実装することができます。

```dart
// for
for (var i = 0; i < 10; i++) {
  print(i);
}

// while
var i = 0;
while (i < 10) {
  print(i);
  i++;
}

// do-while
var i = 0;
do {
  print(i);
  i++;
} while (i < 10);
```

### 関数

Dartでは、関数を宣言することができます。

```dart
int add(int x, int y) {
  return x + y;
}

var result = add(1, 2);
print(result);
```

### クラスとオブジェクト

Dartはオブジェクト指向プログラミング言語であり、クラスとオブジェクトをサポートします。

```dart
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void sayHello() {
    print("Hello, my name is $name, and I'm $age years old.");
  }
}

var person = Person("John", 30);
person.sayHello();
```

上記のコードは、 `Person` クラスを定義して、 `name` と `age` のプロパティを持ち、 `sayHello` メソッドで自己紹介するように設定されています。その後、 `Person` クラスのインスタンスを作成し、 `sayHello` メソッドを呼び出しています。

### 継承

Dartでは、クラスを継承することができます。継承することで、既存のクラスを拡張して新しいクラスを作成することができます。

```dart
class Student extends Person {
  String major;

  Student(String name, int age, this.major) : super(name, age);

  void sayMajor() {
    print("My major is $major.");
  }
}

var student = Student("Mike", 20, "Computer Science");
student.sayHello();
student.sayMajor();
```

上記のコードは、 `Student` クラスを定義して、 `major` プロパティを追加し、 `Person` クラスを継承しています。そして、 `sayHello` メソッドをオーバーライドし、 `sayMajor` メソッドを追加しています。その後、 `Student` クラスのインスタンスを作成し、 `sayHello` メソッドと `sayMajor` メソッドを呼び出しています。

### getterとsetter

Dartでは、クラス内のプロパティにアクセスするための `getter` と `setter` を定義することができます。

```dart
class Person {
  String _name;
  int _age;

  Person(this._name, this._age);

  String get name => _name;

  set name(String name) {
    _name = name;
  }

  int get age => _age;

  set age(int age) {
    _age = age;
  }

  void sayHello() {
    print("Hello, my name is $name, and I'm $age years old.");
  }
}

var person = Person("John", 30);
person.sayHello();

person.name = "Mike";
person.age = 25;
person.sayHello();
```

上記のコードは、 `Person` クラスで `name` と `age` のプロパティを定義して、それぞれの `getter` と `setter` を定義しています。そして、 `sayHello` メソッドで `name` と `age` の値を使用しています。その後、 `name` と `age` の値を変更し、再び `sayHello` メソッドを呼び出しています。

以上が、Dartの基本的な文法についての解説となります。

### 例外処理

Dartでは、 `try`、`catch`、`finally` などを使用して、例外処理を実装することができます。

```dart
try {
  // 例外が発生する可能性があるコード
  var result = 10 ~/ 0; // 例外が発生する
} on UnsupportedError {
  // 発生した例外に対する処理
  print("You can't divide by zero.");
} finally {
  // 必ず実行される処理
  print("Done.");
}
```

上記のコードは、 `try` ブロック内で例外が発生する可能性があるコードを実行し、 `catch` ブロックで発生した例外に対する処理を記述しています。また、 `finally` ブロックでは、例外が発生しても必ず実行される処理を記述しています。

### ラムダ式

Dartでは、ラムダ式を使用して、匿名関数を定義することができます。

```dart
var numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) => print(number));
```

上記のコードは、 `forEach` メソッドにラムダ式を渡して、リスト内のすべての要素を出力しています。

### 非同期処理

Dartでは、 `async`、`await`、`Future` などを使用して、非同期処理を実装することができます。

```dart
Future<void> fetchData() async {
  print("Fetching data...");
  await Future.delayed(Duration(seconds: 1));
  print("Data fetched.");
}

void main() {
  fetchData();
  print("Program finished.");
}
```

上記のコードは、 `fetchData` メソッド内で非同期処理を実装しています。 `await` キーワードを使用して、非同期処理が完了するまで待機し、 `Future` オブジェクトを返します。その後、 `main` メソッドで `fetchData` メソッドを呼び出しています。

### まとめ

以上が、Dartの基本的な文法についての解説となります。Dartは、オブジェクト指向プログラミング言語であり、FlutterやAngularDartなどのフレームワークの開発に使用されます。Dartの文法を理解することで、より効率的かつ堅牢なコードを記述することができるようになります。