Dartの基礎を勉強しました(3)

<h1>これまで勉強してきたもの</h1>
これまで、投稿してきたものはぁ！！！！！
・基本的な操作、[Hello World!]の出力
・変数
・条件分岐
上記の三つですね。

これだけでは、まだまだ作れるものは少ないですね。
はい、という訳で今回はリスト、Set、Mapについてやっていきましょうか。
ここから、Dartのバージョン変更で導入された[Null-safety]というものがあります。
Null-safetyが嫌ダァ！！という方もいれば、便利やん！！という方もいます。

**まぁ、一緒に慣れていきましょう!!!!**

※本段に入る前にNull-safetyに触れていきましょうか。

<h2>Null-safetyとは？</h2>
さて、Dartの公式サイトや様々なサイトを見て解説していきましょう。
※解説というより、引用が近いかな。。。？

まぁ、いいでしょう。初めていきましょう。

<h3>null-safetyを簡単に表すと</h3>

>実行時に、Nullが原因のエラー NullPointerExceptionを発生させない仕組みのことです。Null安全とも。

https://gaprot.jp/2021/04/27/flutter-sound-null-safety/

これを見るに、ヌルポを起こさせないように、導入した機能のようですね。

次に、Null safetyは以下の三つの設計原則に基づいているそうです。

>○変数はデフォルトでNon-Null
○段階的に採用可能
　・同じプロジェクト内で、Nullable と Non-Nullを混在させながら段階的に移行可能。
　・移行のツールも用意されている。
○健全生
　・DartのNull Safetyが健全であり、コンパイラの最適化が可能です。
　・プロジェクト全体、また依存関係を Null Safety に移行するとバグの現象以外にも、バイナリサイズ減少、実行速度改善などメリットがある。

こんな感じで概念的なのは「なんとなぁぁぁ。。。。く理解した！！」と思う人も少なくないでしょう。
ですが、実際にやってみると「何でこんなとこでエラーが。。。？」と思うこともありますので実際にやっていきましょう。

<h1>リスト(List)</h1>

リストは、簡単に表すと「一連の値を格納しておくための変数」です。
え、なにそれ。。。と言われると思う方もいますよね。
もっと簡単にいると、要素を書いた紙のようなものを考えるとわかりやすいかもしれませんね。
実際にコードを書いて見える化していきましょう。

<h2>リストのコードを書いてみよう</h2>
リストのコードを細かく見ていきましょう。

まずは、リストに値を格納してみましょう。

```dart
void main(){
  var name = ["犬","猫","鳥","魚","牛","豚","粉"];
}
```
リストに格納する場合は[]を使いましょう。
上記の場合は最初からリストに値が格納されている状態に
なります。

では、リストから値を取得しましょう。

```dart
void main(){
  var name = ["犬","猫","鳥","魚","牛","豚","粉"];
  print(name);
  print(name[1]);

//--------出力結果----------
//[犬, 猫, 鳥, 魚, 牛, 豚,粉]
//猫
}
```
このようにして、値を取り出します。
では、なぜこのように出力されるかを解説しましょう。

まず、print(name)はvarで型推論したリスト全体を出力します。
これは、簡単ですね。

次に、print(name[1])です。
これは、nameのリストから何番目の値を取得してくださいという意味です。

プログラミング初心者の方が見ていたら、混乱するかもしれないので記載しておきますが、要素の始まりは[0]からです。

*1, 2, 3, 4, 5, 6, 7, 8, 9, .......*

ではなく

*0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ........*

こうなります。

よって、print(name[1])の時に[猫]が出力されている
というわけです。

され、リストのほうの話に戻りましょう。
先ほどのものはリストに値が格納されている状態でしたが、
今度は**空のリスト**を定義して、そこに値を格納していきましょう。

```dart
void main(){
  var list1 = <int>[];
}
```
こんな感じで、空のリストを定義します。
もう少し解説しましょう。

var list1 = <格納する変数>[];

変数を定義しない場合は<>の部分をなしで以下のように
定義してください。

var list1 = [];

こんな感じですね。
今回格納する変数は、int型にしましょうか。
では、int型で空のリストを定義し、値を格納してみましょう。

```dart
void main(){
  list1.add(123);
  list1.add(456);
  list1.add(789);
  print(list1);
}
//-------出力--------
//[123, 456, 789]

```
こんな感じです。
int型で定義を行なったので、String型などを、入れてしまうと、エラーになってしまうので注意しましょう。

もちろんlistを定義する時に、String型で定義することで使用できます。
逆にString型で定義した時には、int型は格納できません。

さて、追加でリストに一旦追加した値を書き換える方法を解説しましょう。

リストの値を書き換えるのは、単純です。
コードで見ていきましょう。

```dart
void main(){
  list1.add(123);
  list1.add(456);
  list1.add(789);
  list1[1] = 109; //リストの1の値を109に書き換え
  print(list1);
  print(list1[1]);

//------出力-------
//[123, 109, 789]
//109
```

このようになりますね。
list[1] = 入れたい値;
リスト名を指定して、入れたい値を記載する。

そうすると、先に格納してあった値と書き変わります。
まぁ・・・だからどうしたぁ！？って感じですが、こういう方法で入れ替えるよって話なので「あぁ、こんなのもあるのね」で構いません。

され、あとはリストで使えるプロパティ、メソッドを書いて
リストの解説は終わりにしましょう。

<h3>プロパティ</h3>
|プロパティ|意味|使用例|
|:---:|:---:|:---:|
|first|Listの先頭の値を戻り値として返す|print(test.first)|
|last|Listの最後の値を戻り値として返す|print(test.last)|
|isEmpty|値がない場合はtrueを、値がある場合はfalseを返します|print(test.isEmpty)|
|length|Listの長さを返します|print(test.length)|
|reversed|Listの値の順番を逆にして返します|print(test.reversed)|

<h3>メソッド</h3>
|メソッド|意味|使用例|
|:---:|:---:|:---:|
|add(値)|Listの最後に新しい値を追加します|test.add(値)|
|addAll(List<変数> 値)|Listの最後に新しいList型の値を追加します|test.addAll([値])|
|insert(listに格納する場所, 値)|Listの指定した番号(index)に値を挿入する|test.indsert(listに格納する場所, 値)|
|insertAll(listの指定した場所, list<変数> 値)|listの指定した場所に新しいlist型の値を挿入する|test.insertAll(listに格納する場所, list<変数> 値)|
|remove(値)|指定した値をListから削除する(複数同じ値がある場合、Listの低い方が削除されます)|test.remove(値)|
|removeAt(listの番号)|指定した場所の値をlistから削除する|test.removeAt(listの番号)|
|removeLast()|listの最後の値を削除し、削除した値を返します|print(test.removeLast())|
|clear()|listの値を全て削除します|test.clear()|
|indexOf(値)|指定した値があるlist場所を返します(複数同じ値がある場合、list場所が低い方が返されます|print(test.indexOf(値))|
|shuffle()|listの値をシャッフルします。|test.shuffle()|


もっと細かい解説を見たい方はこちらを

https://flutternyumon.com/how-to-use-list/

<h1>セット(Set)</h1>

セットです。
セットですね。
セットなんですよ。
・・・セットってなんだよぉ！！
という方も多いと思いますね。
私もそうです。

なので、少し調べて見ました。

>Setを使えば、複数のvalue(データ)を格納し、valueを1つの固まり(コレクション)として操作できます。また格納したvalueを後から置き換えたり、追加したり、削除したりと自由にvalueを操作できます。(同じvalueを複数格納できません)

https://flutternyumon.com/how-to-use-set/

上記の文から私が得た解釈は*複数のデータを格納し、扱える*ということです！！！
...これだとリストと何が違うのかわかりませんよね。
はい...これだと本当にわかりませんね...。

ですが！！コードで書くと違いが、わかりますよ。

さて、では適当に自由型でいきましょう。
型の定義は、後で解説しましょう。

```dart
void main(){
  var set1 = {"重曹", 1.5, 19};
  set1.add("社畜");//セットした値の1番後ろに値を追加します。
  print(set1);
  set1.add("AI");//セットした値の1番後ろに値を追加します。
  print(set1);
  print(set1.elementAt(0));

//------出力--------
//{重曹, 1.5, 19, 社畜}
//{重曹, 1.5, 19, 社畜, AI}
//重曹
}

/*
Set<変数> test = {};
これで、変数を定義したセットも作れます。
*/
```
セットについて少しずつ解説していきましょう。
Setはlistよりも値参照が特殊です。
(おかしいな。。。私には値参照しか、違いがわからない。。。)

上記のコードをよぉーく見てください。
Q.リストとセットで比較すると、どこが違うでしょうか。

A.リストの場合は「print(list[0])」で指定した値を取得できます。
  セットの場合は「print(set.elementAt(0))」で値を取得できます。
この部分がまず違います。

あとはほぼ同じ。。。なんですねぇ。。。はい。。。
解説は以上なんですねぇ。。。はい。。。

では、基本のプロパティとメソッドを書いておきましょうか

<h3>プロパティ</h3>
|プロパティ|意味|使用例|
|:---:|:---:|:---:|
|first|Setの先頭の値を戻り値として返します|print(test.first)|
|last|Setの最後の値を戻り値として返します|print(test.last)|
|isEmpty|値がない場合はtrue、値がある場合はfalseを返します|print(test.isEmpty)|
|length|Setの長さを返します|print(test.length)|

<h3>メソッド</h3>
|メソッド|意味|使用例|
|:---:|:---:|:---:|
|add(値)|Setの最後に新しい値を追加する|test.add(値)|
|addAll(Set<指定する変数> 値|Setの最後に新しいList型のデータを追加|test.addAll({値})|
|remove(値)|指定した値をSetから削除します|test.remove(値)|
|clear()|Setの値を全て削除します|test.clear()|


<h1>マップ(Map)</h1>

さて、マップです。
マップは、値にKey(値が格納される場所の名前)を紐付けて格納する。紐づけられている値をセットとして操作できます。

さて、ではさくっとコードを書いていきましょうか。

```dart
/*
変数を指定しない場合
var map1 = {}

変数を指定する場合(Keyと値をセットにする)
Map<変数(値),変数(Key)> = {} 

空のMapを作る
var Map1 = {};
map1["粉"] = 19;
print(map1);
*/

void main(){
  var map1 = {"粉":19,
              "犬":1,
              "猫":2,
              "鳥":3};
  print(map1);
  print(map1["粉"]);
  map1["粉"] = 109;//ここで、格納してある値を変えます
  print(map1); //ここで、更新されているのがわかります
}
```
こんな感じですね。はい
値とKeyがセットになっているので、いいですね。。。!!
(ワザップではないです。(※ネタを知らない人には申し訳ありません!!))
さて、ここまで来ると作れるものを色々考えてしまいますね。
私の場合は、汎用型AIの作成を生涯の目標としているので、こんな感じで何かに「格納」できる機能は道具の一種としてみてしまいますね。

もっと細かく見たい方はこちらを

https://flutternyumon.com/how-to-use-map/

さて、Mapのプロパティとメソッドを書いて、最後の挨拶を書いてこの記事は終わりになります。

<h3>プロパティ</h3>
|プロパティ|意味|使用例|
|:---:|:---:|:---:|
|isEmpty|値がない場合はtrue, ある場合はfalseを返します|print(test.isEmpty)|
|length|MapのKeyと値のペアの数を返す|print(test.length)|

<h3>メソッド</h3>
|プロパティ|意味|使用例|
|:---:|:---:|:---:|
|addAll(Map型のデータ)|Mapに新しいMap型の値を追加する|test.addAll("hoge")|
|remove(key)|指定したKeyの値をMapから削除する|test.remove("hoge")|
|clear()|Mapの値を全て削除する|test.clear()|

以上です。では、また次回。

<h1>追記：ループ文(2021/11/3 追記)</h1>

ループ文を簡単にいうと、「指定した回数文繰り返す」ですね。
このループ文はやりたい処理を繰り返させるという目的で使われることが多いような気がしますね。

では、さくっとやっていきましょうか

<h3>通常のfor文</h3>
for(条件){ print(実行); }
のように書きますね。

え？これだけじゃわからない？

(えぇ、私もこれだけで説明された「何言ってんだこいつ。。。」と思いますね)

コードで見える化してみましょう

```dart
void main(){
  for (int i = 0; i < 10; i++){
    print(i)
  }
}
```
はい、こんな感じですね。
簡単に解説しますと、iを0から10未満まで繰り返すということですね。
実際にコードを実行すると0~9まで繰り返されます。


<h3>リストを使用したfor文</h3>
では、リストを使ったものをやってみましょうか
簡単にいうと、リストの中身を出力するって感じですね。
コードを書いてみましょうか。

```dart
void main(){
  var names = ["粉","砂糖","塩","小麦粉"];
  for (var name in names){
    print(name);
  }
}
```
このような形になります。

<h3>while文を使用した繰り返し</h3>

これは、whileを使用しているものです。
コードを見れば処理はわかるので、処理内容は解説いらないかもしれませんね。
では、コードで見える化しましょう。

```dart
void main(){
  int i = 0;
  while (i < 10) {
    print(i);
    i++;
  }
}
```

はい、ではループ文の解説は終わりです。

<h1>挨拶</h1>
どうも、組込みエンジニアとして、とある企業におります粉です。

・組込みエンジニアですがAIエンジニア、機械学習エンジニアとして転職したいので、自身でいろいろと勉強を行っております。

・なんでAIエンジニアや機械学習エンジニアになりたいの？と疑問をもたれる方も多いと思いますので、簡単に説明させていただきます。
１、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか？と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
２、ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、最近勉強をはじめました。
３、転職を目指す、自身の夢を叶えたいという願いもありますので、こうやって学んだことを記事しています。

・いろいろとお話ししましたが、まずは、私よりも知識、技術が豊富な先輩方から多くのことを意見、修正点、アドバイスをいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです。

・こんな手法もあるぞ、やり方はこうだ！！などの意見も募集しております。