[Dart / Flutter]dynamic型とは?varとの違い

変数の型を柔軟に扱いたいときにdynamic型を利用します。

文法・構文形式

dynamic 変数名 = 初期値;

  • dynamic:任意の型の値を持てる型キーワード。
  • 変数名:保存したいデータに名前をつける部分。
  • 初期値:最初に変数に入れたいデータ。

Dart言語は、基本的に明確な型を持ち数値や文字列など、変数がどのようなデータを持つか明示的に示す必要があります。しかし、dynamic型を使用すると、一つの変数がさまざまな型のデータを持つことができます。

利用場面

  • 事前に変数の型がわからない場合。
  • さまざまな型のデータを同一の変数で取り扱いたいとき。
  • APIや外部ライブラリから返される未知のデータ型を扱うとき。

ここでは、オブジェクトの型を返すruntimeTypeを利用して実行時の型を表示します。

dynamic item = 30;
print(item.runtimeType);  // int

item = "Dart";
print(item.runtimeType);  // String

item = [1, 2, 3];
print(item.runtimeType);  // List<int>
  • 1つ目は、item変数に数値を代入して、int型であることを確認します。
  • 2つ目では、同じitem変数に文字列を代入するとitemは、String型に変わります。
  • 3つ目では、同じitem変数にリストを代入するとitemは、List型に変わりました。
    これにより変数の型が動的に変わったことが確認できます。

daynamicとvarの機能比較

daynamicとvarは、変数の代入時にint、Stringなど型を決めておく必要はない点で似ていますが、いくつかの違いがあります。

特徴 var dynamic
型推論するしない
型変更不可可能
安全性高い
柔軟性低い高い
  • 型推論
    varは初期値の型に基づき変数の型が自動的に決定されます。一方、dynamicは型の自動推定を行いません。
  • 型変更
    varを使用すると、初期値の型に固定され、後から型を変更することはできません。dynamicはいつでも型を変更できます。初めは数値を持ち、次に文字列を持つこともできます。
  • 安全性
    varは型の間違いを早期に検出するため、コードの安全性が向上します。dynamicはエラーが実行時まで見えない場合があります。
  • 柔軟性
    varは初期値の型に変数が固定されるため柔軟性は低めです。dynamicは任意の時点で任意の型を持つことができるので、柔軟性が高いです。

dynamicとvarとの利用面の違い

varは型の安全性を確保したい場合や、変数の型が変わることがない場面で使用します。dynamicは型が頻繁に変わる可能性がある場面や、型が不明なデータを扱う場面で利用できますが、過度な利用は不具合が発生時の原因になりかねません。


メリット
  • 柔軟性: さまざまなデータ型を一つの変数で扱うことができます。
  • 予期しないデータ型を扱う場面で役立つ: 外部からのデータがどのような型で返ってくるかわからないときに便利です。
デメリット
  • 実行時エラーのリスク: dynamic型はコンパイル時に型のチェックが行われないため、実行時にエラーが発生する可能性があります。
  • コードの可読性が低下: 変数の型が明確でないため、コードを読む他の人々にとって理解しにくくなることがあります。