【Kotlin-CodeLabs】2/7 〜 Kotlinの基本 (Array，List，for文)〜



2019年にGoogleから，Web上でKotlinを学べるコースが提供されました．([Kotlin-BootCamp](https://developer.android.com/courses/kotlin-bootcamp/overview/))
この記事では，そのコースを実際にやってみてアウトプットしてみるといった内容です．
何かツッコミなどあれば編集リクエストかコメントかTwitterでいただければ修正いたします :pray:


#今回学ぶこと
・Kotlinの基本を学ぶ
・ブール値(論理値)と条件を使用する方法
・nullable変数とnon-nullable変数の違い
・Kotlinでの配列，リスト，ループの仕組み

#知っておくべきこと
・オブジェクト指向

#ステップ
###1. if文の条件に範囲を使える

```
val fish = 50
if(fish in 1..100) {
    println(fish)
}
```

###2. when文がif文よりも冗長でない

if文

```
if (numberOfFish == 0) {
    println("Empty tank")
} else if (numberOfFish < 40) {
    println("Got fish!")
} else {
    println("That's a lot of fish!")
}
```

when文(JavaのSwitch文に似ている)

```
when(numberOfFish) {
    0 -> println(“Empty tank”)
    in 1..39 -> println(“Got fish!”)
    else -> println(“That's a lot of fish!")
}
```

###3. nullableについて

nullを含むプログラミングエラーは，無数のバグの原因となっています．
Kotlinは，nullを許可しない変数を導入することにより，バグを減らすことを目指しています．

デフォルトでは、変数をnullにすることはできない

```
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
```

型の後に`?(疑問符演算子)`を使用して，変数がnullになる可能性があることを示します．`Int?`を宣言してnullを割り当てます．

```
var marbles: Int? = null
```

リストなどの複雑なデータ型がある場合：
・リストの要素をnullにすることができる
・リストをnullにすることもできますが，nullでない場合，その要素をnullにすることはできない
・リストまたは要素の両方をnullにすることができる

?演算子を使ってnullをテストできるため，if文を記述する手間が省ける

```
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
```

もし`fishFoodThreads`がnullならば，`dec()`メソッド(デクリメント)が実行される処理です

```
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
```

###4. リストを作成

不可変なリスト

```
val school = listOf("mackerel", "trout", “halibut")
println(school)
```
実行結果
-> [mackerel, trout, halibut]

可変なリスト

```
val myList = mutableListOf("tuna", "salmon", “shark")
myList.remove(“shark”)
println(myList)
```
実行結果
-> [tuna, salmon]

###5. 配列を作成

Arrayの場合，サイズは固定です．

```
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
```
実行結果
-> [shark, salmon, minnow]


`arrayOf`で宣言した配列(array)は型を混在させることができます．

```
val mixArray = arrayOf("fish", 2)
```
実行結果
-> [fish, 2]


全ての要素に対し，１つの型で配列を指定することができる

```
val mix = intArrayOf(1, 2, 3)
println(mix[2])
```
実行結果
-> 3


###6. ループを作成

配列を作成し，for文を使って要素を出力します．

```
val school = arrayOf("shark", "salmon", "minnow")
for (i in school) {
    print(i + " ")
}
```
実行結果
-> shark salmon minnow 

またKotlinでは，indexと要素を同時にループできます．

```
val school = arrayOf("shark", "salmon", "minnow")
for ((index, i) in school.withIndex()) {
    println("index:$index\n要素:$i\n")
}
```
実行結果
-> 
index:0
要素:shark

index:1
要素:salmon

index:2
要素:minnow

他にも範囲指定ができます

```
for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..12 step 2) print(i)
⇒ 
3
5
7
9
11

for(i in 'a'..'z') print(i)
⇒ abcdefghijklmnopqrstuvwxyz
```

#まとめ
・Kotlinでは，原則変数がnullにできません．?変数を使うとNullが使えるようになる
・Kotlinでは，for文内でインデックスと配列の要素を同時にループできる
・Kotlinでは，valは定数なので一度しか割り当てることができない


#クイズ
>1問目
次のうち、変更できない文字列のリストを宣言しているのはどれですか？

▢ val school = arrayOf("shark", "salmon", "minnow")
▢ var school = arrayOf("shark", "salmon", "minnow")
▢ val school = listOf("shark", "salmon", "minnow")
▢ val school = mutableListOf("shark", "salmon", "minnow")

>2問目
次のコードの出力はどうなりますか？

for (i in 3..8 step 2) print(i)
▢345678
▢468
▢38
▢357

>3問目
このコードの?(疑問符)の目的は何ですか？
`var rocks: Int? = 3`

変数rocksの型は固定されていません
変数rocksはnullに設定できます
変数rocksをnullに設定することはできません
変数rocksをすぐに初期化しないでください


###クイズの正解

1問目    val school = listOf("shark", "salmon", "minnow”)
2問目    357
3問目    変数rocksはnullに設定できます


#参考資料
###CodeLabs by Google
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-welcome/#1
![スクリーンショット 2020-02-05 4.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/3ad2d3c9-d57f-1b4b-85cf-1c92a57b464b.png)