🎅

【Dart入門(1)】変数の初期化方法まとめ|var・型指定・final・const・lateの違いを徹底解説

に公開

【Dart入門】変数の初期化方法まとめ|var・型指定・final・const・lateの違いを徹底解説

Dart(ダート)は、Flutter開発でも使われる人気のプログラミング言語です。その基本となるのが変数の初期化方法です。
この記事では、Dartにおける変数の宣言・初期化の方法を、サンプルコード付きでわかりやすく解説します。

varによる変数宣言(型推論)

Dartではvarを使うと、代入する値の型を自動で推論してくれます。
varvariable(変数) の略で、変数が参照するオブジェクトを後から変更することも可能です。

// ここでnameの型はStringと推論されます。
var name = "Bob";
name = "Sam";
print(name); // Sam

型を自分で書かなくても、代入した値から型が決まるのがvarの便利な点です。


型指定(null安全を意識する)

もちろん、プログラマーが明示的に型を指定することも可能です。
特にDartは**null安全(null safety)**を採用しており、以下のように型?を使うと「nullを許容する型」になります。

String name = "Bob";  // nullを許容しない
int age = 25;
int? yourAge = null;  // nullを許容する
  • String → 絶対にnullを入れられない
  • String? → nullも代入できる

このルールにより、実行時のnullエラーを減らすことができます。


finalとconst(変更不可の変数)

変数の値が一度決まったら変更しないことが分かっている場合は、finalconstを使います。

final(実行時に確定)

finalは「実行時に一度だけ値を確定する」変数を定義します。

final String name = "Bob";
name = "Sam"; 
// エラー: nameは変更できない

代入するタイミングは実行時ですが、一度代入したら変更できません。


const(コンパイル時に確定)

constは「コンパイル時に確定する定数」を定義します。
つまり、プログラムが実行される前にすでに値が決まっている必要があります。

const String name = "Bob";
const pi = 3.14;

double l = r * 2 * pi; // 円周の計算などに便利

違いのポイント

  • final → 実行時に確定
  • const → コンパイル時に確定

lateとデフォルト値(後から初期化したいとき)

Dartではトップレベルの変数やクラスのプロパティは、初期値を持つかnull許容である必要があります。

初期値がない場合のエラー例

int a;  // 初期値なし → エラー

class Sample {
  int b;  // 初期値なし → エラー
  Sample();
}

正しい書き方

void main() {
  int a = 5;  // 初期化OK
}

class Sample {
  int b;
  Sample(this.b);  // コンストラクタで初期化OK
}

lateを使った初期化

「実行時に必ず初期化するが、宣言時には値を決められない」という場合はlateを使います。

late int count;

void main() {
  count = 10;  // ここで初期化
  print(count); // 10
}

lateを使うと、null許容にせずに後から代入可能になります。

ただし注意点として、代入を忘れてアクセスすると実行時エラーになります。

late String name;

void main() {
  print(name);
  // エラー: LateInitializationError: Field 'name' has not been initialized.
}

まとめ

  • var: 型推論で便利に変数を宣言できる
  • 型指定: null許容(型?)か非nullを意識する
  • final: 実行時に確定し変更できない変数
  • const: コンパイル時に確定する定数
  • late: 後から必ず初期化する変数

Dartの変数宣言はnull安全・変更不可・型推論といった特徴を理解することで、バグの少ないコードを書けるようになります。

FlutterやDartを学ぶ初心者は、この「変数の初期化」の仕組みを押さえておくと、コードの読み書きがグッと楽になりますよ。


Discussion