Dart言語の基礎 #02 - クラスとインスタンス、アルゴリズムの基礎

Flutterでアプリを開発するにあたって開発言語であるDartについて理解する必要があると考えたので、Dartの基礎を学習しはじめました。

https://www.udemy.com/course/flutter-dart/

今回はオブジェクト指向な書き方に欠かせないクラスとインスタンス、
for文・if文などの基本のアルゴリズムについて学んでみました。

# クラスとインスタンス

処理の流れをより簡潔にするには、変数・メソッドを１つのクラスに纏めるというオブジェクト指向を用いるのが便利です。クラスは1つのデータ型の様に扱うことができ、リスト型のデータ型として代入することもできます。

```dart
void main(){
  Person PersonAOT = Person("Elen", 15);
  
  print(PersonAOT.name);
  print(PersonAOT.age);
  
  //リスト型のデータにもできる
  List<Person> personList = [
    Person("Elen", 15),
    Person("Mikasa", 15),
    Person("Armin", 15),
  ];
  
  print(personList[0].name);
  
}

class Person{
  String name;
  int age;
  
  //コンストラクター - クラスがインスタンス化されるときに呼び出される
  Person(this.name, this.age);
}
```

```dart
Elen
15
Elen
```
## static（静的な型）
staticという宣言を使えば、変数をインスタンス化しなくてもクラス変数を呼び出せるようになります。

```dart
void main(){
  print(Person.name);
}

//staticという宣言を使えば、インスタンス化することなくクラスに特有の変数を宣言できる
class Person{
  static String name = "Gabi";
  static int age = 12;
  
  //コンストラクター - クラスがインスタンス化されるときに呼び出される
  //Person(this.name, this.age);
}
```
```dart
Gabi
```
## finalとconst（定数）

finalとconstは定数を定義するのに使います。数学での変数・定数と同じで、final・constで定義した値は後から変更することができません。finalがコードを実行する際に値を入れる必要があるのに対し、constは定数を定義した時点で値が代入されていないといけません。コードを通して変更したくない値を定義するのに使います。

```dart
void main(){
  int number = 123;
  final number02 = number;
  const number03 = 456;
  
  print(number);
  print(number02);
  print(number03);
}
```
```dart
123
123
456
```
# アルゴリズムの基礎
## 比較演算子とif文
条件分岐の処理を行うには、他のプログラミング言語と同様比較演算子とif文を組み合わせます。

```dart
void main(){
  int num = 0; 
  
  if(num == 0){
    print("numの値は " + num.toString()   + " です。");
    
  }else if(num > 0){
    print("numの値は " + num.toString() + " 、正の値です。");
    
  }else{
    print("numの値は " + num.toString() + " 、負の値です。");
    
  }
}
```
```dart
numの値は 0 です。
```
## 論理演算子
条件分岐の処理をより複雑にするには、論理演算子を使います。
`&&`は論理積を、`||`は論理和を表します。

```dart
void main(){
  String name = "Elen";
  int age = 15;
  
  if(age >= 12 && name == "Elen"){
    print("名前は "+name+"、 年齢は "+age.toString()+" です。");
    
  }else if(age <= 10 || age >= 20){
    print("名前は "+name+"、 年齢は10代ではありません。");   
    
  }else{
  }
}
```
```dart
名前は Elen、 年齢は 15 です。
```
## switch文
条件分岐の記述には、switch文も活用できます。switchでは論理演算子ではなく、変数の値がケースに一致しているかを直接判定します。

```dart
void main(){
  int num = 2; 
  switch(num){
    case 0:
      print("numの値は " + num.toString()   + " です。");
      break;
      
    case 1:
      print("numの値は " + num.toString()   + " です。");
      break;
      
    default:
      print("numの値は、どのケースにも当てはまりません。");
      break;
  }
}
```
```dart
numの値は、どのケースにも当てはまりません。
```
## for文
繰り返し処理の記述には、for文を使います。
Pythonと同様、イテレーターに使う変数、条件、処理終了時の動作を記述します。


for文を有効活用する方法として、`for...in`構文を使ってリストの様子全てに同じ処理をするという繰り返し構文・リスト型を組み合わせた処理があります。`for...in`構文と同じ処理は、リストの長さを取得しイテレーターに使うことでも実装できます。

```dart
void main(){
  List<String> nameList=["Elen","Mikasa","Armin"];
  
  for(String name in nameList){
    print(name);
  }
  for(int i = 0; i < nameList.length; i++){
    print(nameList[i]);
  }
}
```
```dart
Elen
Mikasa
Armin
Elen
Mikasa
Armin
```
while文
繰り返し処理の記述には、while文も使えます。
for文とちがい、処理終了時の動作はコードブロック内に直接記述します。

```dart
void main(){
  int num = 5;
  while(num > 0){
    print(num);
    num--;
  }
}
```
```dart
5
4
3
2
1
```
## try-catchーfinally文
エラー判定に便利なのが、try-catchーfinally文です。
ネットワーク処理などでエラーが発生した場合でも確実に次の処理に移りたい場合等に使います。try段階でエラーが起こると後の処理は実行せずcatchの処理にうつり、どの状態でもfinallyを必ず実行します。

```dart
void main(){
  try{
    int num = 0;
    throw("エラー発生→catchへ移ります");
    
  }catch(e){
    //throwの中身を表示する
    print(e);
    print("catchの内容です");
    
  }finally{
    print("処理完了");
    
  }
}
```
```dart
エラー発生→catchへ移ります
catchの内容です
処理完了
```