この章では、Dartの基本的な文法と型システムについて学びます。
Dartは静的型付け言語ですが、優れた型推論を備えており、冗長な型記述を避けつつ型安全性を保つことができます。
また、他の言語とは一味違う var, dynamic, Object, final, const などのキーワードの使い分けを理解することで、堅牢で読みやすいコードの土台を築きます。
Dartは静的型付け言語ですが、初期値から型を自動で推論する 型推論 を強力にサポートしています。
Dartでの変数宣言は、var による型推論と、型を明示する宣言の2通りが基本となります。
var による型推論と型明示初期値が存在する場合、var キーワードを使うとコンパイラが自動的に型を決定します。
void main() {
var name = 'Dart'; // String 型と推論される
var version = 3; // int 型と推論される
print('$name のバージョン: $version');
}dart run variables_intro.dartDart のバージョン: 3
一度型が推論された変数に異なる型の値を代入しようとすると、コンパイルエラーになります。
型を明示的に記述することも可能です。
void main() {
String message = 'Hello';
int count = 10;
print('$message: $count 件');
}dart run type_explicit.dartHello: 10 件
var、dynamic、Object の違いDartには一見似ているように思える var, dynamic, Object というキーワードが存在します。これらは型安全性において決定的な違いがあります。
| キーワード | 静的型チェック | 別の型の再代入 | メンバーアクセス |
|---|---|---|---|
var (初期化あり) | あり (初期値から固定) | 不可 | 推論された型のメソッドのみ |
dynamic | なし (実行時に解決) | 可能 | なんでも呼べる (存在しなければ実行時エラー) |
Object / Object? | あり (すべての型の基底) | 可能 | Object が持つメソッド (toString() 等) のみ |
void main() {
// 1. dynamic: 静的型チェックを完全にバイパスする
dynamic value = 'Hello';
print('dynamic: ${value.length}');
value = 123; // 異なる型の再代入もOK
print('dynamic(int): $value');
// 2. Object: すべての非Nullオブジェクトの基底クラス (型安全)
Object obj = 'World';
if (obj is String) {
// is チェックでスマートキャストされる
print('Object(String): ${obj.length}');
}
}dart run dynamic_vs_object.dartdynamic: 5 dynamic(int): 123 Object(String): 5
final と const の使い分けDartで値の再代入を禁止する変数(定数)を宣言するには、final または const を使用します。
final(実行時定数): 実行時に一度だけ初期化され、以降は変更できません。DateTime.now() などの実行時計算値も代入可能です。const(コンパイル時定数): コンパイル時に値が完全に確定している定数です。void main() {
final now = DateTime.now(); // 実行時に値が確定
const maxItems = 100; // コンパイル時に確定
// constリストは要素の変更も不可(完全なイミュータブル)
const list = [1, 2, 3];
print('現在時刻 (final): $now');
print('最大件数 (const): $maxItems');
print('定数リスト: $list');
}dart run final_const.dart現在時刻 (final): 2026-08-14 05:20:00.000 最大件数 (const): 100 定数リスト: [1, 2, 3]
Dartのすべての値はオブジェクトであり、数値や真偽値も含めて Object を継承しています。
主要な組み込み型には、整数 int、浮動小数点数 double、その共通親型 num、文字列 String、真偽値 bool があります。
int と double は相互に変換でき、文字列との相互変換もメソッドが用意されています。
void main() {
int integer = 42;
double decimal = 3.14;
num both = 10;
both = 2.5; // num型ならdoubleも代入可能
// 文字列から数値への変換
int parsedInt = int.parse('100');
double parsedDouble = double.parse('12.34');
// 数値から文字列への変換
String strInt = integer.toString();
String fixedDec = decimal.toStringAsFixed(1); // "3.1"
print('parsed: $parsedInt, $parsedDouble');
print('converted: $strInt, $fixedDec');
}dart run numbers.dartparsed: 100, 12.34 converted: 42, 3.1
Dartでは、文字列リテラル内に $変数名 や ${式} を埋め込むことができます。シングルクォート ' とダブルクォート " のどちらでも記述可能です。
void main() {
String language = 'Dart';
int version = 3;
// 文字列補間
String greeting = 'Welcome to $language $version!';
String calc = '1 + 1 = ${1 + 1}';
// 複数行文字列(トリプルクォート)
String multiLine = '''
1行目のテキスト
2行目のテキスト
3行目のテキスト''';
print(greeting);
print(calc);
print(multiLine);
}dart run strings.dartWelcome to Dart 3! 1 + 1 = 2 1行目のテキスト 2行目のテキスト 3行目のテキスト
Dartには一般的な言語と同様の算術・比較・論理演算子に加えて、整数除算や型判定などDart特有の便利な演算子が用意されています。
~/)通常の除算 / は常に double を返します。商の整数部分のみを取得したい場合は ~/(整数除算演算子)を使います。
void main() {
int a = 10;
int b = 3;
print('加算 (+): ${a + b}');
print('通常除算 (/): ${a / b}'); // double (3.3333333333333335)
print('整数除算 (~/): ${a ~/ b}'); // int (3)
print('剰余 (%): ${a % b}'); // int (1)
}dart run operators_arithmetic.dart加算 (+): 13 通常除算 (/): 3.3333333333333335 整数除算 (~/): 3 剰余 (%): 1
オブジェクトが特定の型であるかを判定するには、is や is! を使います。
is: 指定した型であれば true(スコープ内で自動的にスマートキャストされる)is!: 指定した型でなければ truevoid main() {
Object value = 'Dart Programming';
if (value is String) {
// ifスコープ内では value が String にスマートキャストされる
print('文字列の長さ: ${value.length}');
}
// 三項条件演算子
int score = 85;
String result = score >= 60 ? '合格' : '不合格';
print('判定: $result');
}dart run type_test.dart文字列の長さ: 16 判定: 合格
この章では、Dartの基本構文と型システムの基本を学びました。
var を使うと初期値から静的型が自動推論される。型を明示することも可能。dynamic と Object: dynamic は型チェックを無効化し、Object は全オブジェクトの基底型として安全に扱える。final と const: final は実行時に一度だけ初期化される不変変数、const はコンパイル時に確定する完全な定数。int, double, num, String, bool が基本。文字列補間 ${} が便利。~/ や型判定 is によるスマートキャストを活用する。次の 第2章 では、Dartを特徴づける最も重要な機能の1つである Null Safety について詳しく学びます。
以下の仕様を満たすDartプログラムを作成してください。
pi を const で定義(値は 3.14159)。radius を var で定義し、初期値 5.0 を代入。createdAt を final で定義(DateTime.now() を代入)。createdAt と共に文字列補間を使って出力する。void main() {
// ここにコードを書いてください
}dart run practice1_1.dart文字列として受け取った価格と数量から、合計金額と一人あたりの支払額を計算するプログラムを作成してください。
priceStr = "1280" と quantityStr = "3" を定義する。int.parse() で int 型に変換する。total = price * quantity を計算する。~/ 演算子で求め、「余り(端数)」を % 演算子で計算して出力する。void main() {
// ここにコードを書いてください
}dart run practice1_2.dart