Dartの概要 | 特徴や機能を紹介!!
今日はFlutterで採用されているプログラミング言語であるDartについて紹介していきます!!
DartはJavaScriptの代替言語としてGoogleが開発し、2011年に登場しました。Java/Python/JavaScriptなどのモダン言語の特徴を捉えておりこれらの言語を使ったことがある方には扱いやすい言語であると言えます。
当初はマイナー言語として定着しましたが、Flutterのプログラミング言語として採用され、再び注目を集めることになります。
Dartの特徴
主な特徴として
- UIように最適化されている - UIのために非同期・イベント駆動を組み合わせられる。Null Safetyやコレクション・スプレッド演算を使ったUIの構築が可能。
- 生産性の高い開発ができる – ソースコードのホットリロード(即時反映)ができる。プロファイリング、ロギング、デバッグができる。
- 全てのプラットフォームで高速に動作する – 事前のコンパイルでネイティブマシンコードに変換できる。JavaScriptJavaScript用にコードが最適化出来る。
ことがあげられます。
その他の特徴としては
- オブジェクト指向を含むマルチパラダイム言語
- 型推論ありの静的型づけ言語
- Null Safetyに対応
- すべてのクラスは、Objectクラスのサブクラス
- 式(値を返す)と文(値を返さない)の両方を持つ
- コンパイラはエラーと警告を報告し、エラーはコンパイル時と実行時がある
- 関数はオブジェクト(第一級関数)
ことがあげられます。
Dartの機能
続いて、Dartが備えている細かい機能についてみていきましょう!
演算子と型
下記のような演算子及び型が利用できます。
- 演算子
- 四則演算 : +、-、*、/、%
- インクリメント、デクリメント : ++、–
- AND、OR、NOT : &&、||、!
- null判定 : ??など
- 複合代入 : +=など
- 型キャスト、型チェック : as、is
- カスケード記法 : ..
- メソッドを連続で呼び出す。
// カスケード記法なし
var list1 = new List();
list1.add(1);
list1.add(2);
// カスケード記法あり
var list2 = new List()..add(1)..add(2)
- スプレッド演算: …
- 要素を展開する。
void main() {
var list = [10, 20];
var list2 = [0,1, ...list];
print(list2);
}
// 出力結果
// [0, 1, 10, 20]
- 変数修飾子
- 再代入不可 : final
- 定数 : const
- 遅延初期化 : late
- 型
- 整数、実数 : int、double
- 文字列 : String
- ブーリアン : bool
- オブジェクト : Object
- コレクションなど
- 配列 : [ ]
- 列挙型 : enum
- リスト、集合、キーバリュー : List、Set、Map
- ジェネリクス : クラス<型>
- アノテーション
- オーバーライド : @override
- 非推奨 : @deprecated
制御構文
条件分岐、ループ、例外処理などの基本的な制御構文ももちろん使うことができます。
- 条件分岐 : if、else
- 多分岐 : switch、case
- ループ : for、while、forEach、for in、do while
- 制御 : break、continue
- 例外 : try、catch、finally、throw
関数/メソッド
関数では、一般的な定義の他にオプション引数/名前つき引数/必須引数が設定できます。
// オプション引数
// 引数がなくても呼び出せる(デフォルトの値が使われる)
void func1(String param1, [int param2=0]){
print("$param1,$param2");
}
// 名前つき引数
// 名前を指定して呼び出せる
void func2({String? param1, int? param2}){
print("$param1,$param2");
}
// 必須引数
// 必ず引数を渡すことを強制できる
void func3({required String param1, required int param2}){
print("$param1,$param2");
}
void main() {
func1("func1");
func2(param1:"func2");
func3(param1:"func3",param2:3);
}
// 出力結果
// func1,0
// func2,null
// func3,3
第一級関数の性質により、関数を引数として取り扱えるため下記のようなことも可能です。
void hello() => print('Hello');
void func(f) => f(); //引数となっている関数を引数なしで実行する
void main() {
func(hello);
}
// 出力結果
// Hello
匿名関数(無名関数)も利用できます。
void main(){
// 動作確認の関係上、一旦変数に入れる
Function hello = (name){
return "Hello,$name";
};
print(hello("kazutxt"));
}
// 出力結果
// Hello,kazutxt
アロー演算子による関数定義も可能です。
void func(String? param1, int param2) => print('$param1 / $param2');
void main() {
func("data",20);
}
// 出力結果
// data / 20
オブジェクト指向
オブジェクト指向の概念(クラス/メソッド/継承/カプセル化など)が使えます。
クラス
- クラス定義 : class
- コンストラクタ : (クラス名と同名のメソッド)
- インスタンス生成時に呼ばれる。
- インスタンスの生成 : new
- 継承 : extends
- 親クラスを1つのみ指定し利用できる。
- 抽象クラス : abstruct
- 継承での利用を前提とした、インスタンス化できないクラスを作成する。
- Mixin:with
- 継承をせずに、他クラスのフィールドやメソッドが使える。
フィールド/メソッド
- プライベートフィールド/メソッド : _xxx
- _で始めるとスコープがプライベートになる。
- staticフィールド/メソッド : static
- クラスに属するフィールド/メソッドになる。
- setter/getter : get/set
- setter/getterでフィールドにアクセスする。
// クラス定義
class Hoge{
int _data=0;
int get data => _data; //getter
set data(int data){this._data = data;} //setter
}
// 定義したクラスを利用
void main() {
Hoge hoge = Hoge();
hoge.data = 10;
print(hoge.data);
}
// 出力結果
// 10
その他
外部で定義されたパッケージの利用や非同期処理も可能です。
- パッケージの利用 : import、as、show、hide
- 非同期処理 : await、async、Future
まとめ
今日はDartについて紹介していきました!!
次回は環境構築について紹介していきたいと思います。
良きFlutterライフを!!
2025-02-21
0件のコメント
コメントはまだありません。最初の一人になりましょう!