Kotlinの基本文法➁ ～演算子・制御構文・コレクション～

## 演算子

* 単項演算子

```kotlin
var count: Int = 1

println(count++) // 1 (値を表示された後にインクリメント)
println(count--) // 2 (値を表示された後にデクリメント)

println(++count) // 2 (値を表示させる前にインクリメント)
println(--count) // 1 (値を表示させる前にデクリメント)

println(!true) // false (真偽値の反転)
```

* 範囲を指定する演算子

```kotlin
// 数値
for(i in 1..5) {
    println(i) // 1 2 3 4 5
}

// Char型
for(s in 'a'..'e' ) {
    println(s) // a b c d e
}
```

* 代入演算子

```kotlin
var result = 10

// result = result + 5と同義
result += 5
println(result) // 15

// result = result - 5と同義
result -= 5
println(result) // 10

// result = result * 5と同義
result *= 5
println(result) // 50

// result = result / 5と同義
result /= 5
println(result) // 10

// result = result % 5と同義
result %= 5
println(result) // 0
```

* 比較演算子

```kotlin
println("abc" == "abc") // true
println("abc" != "abc") // false
```

```kotlin
data class User(
    val id: Int
)

-------------------------------------

val user1 = User(id = 1)
val user2 = User(id = 1)

println("user1 == user2 : ${user1 == user2}") // true
println("user1 === user2 : ${user1 === user2}") // false 参照先が異なるため
```

* when式

```kotlin
val color: String = "red"

when(color) {
    "red" -> "赤" // 改行ごとの「,」は不要
    "blue" -> "青"
    "green" -> {
        "緑"
    } // 処理が複数行に及ぶ場合は「 {} 」を記述する
}
```

```kotlin
// 戻り値を返す場合
val choiceColor = when(color) {
    "red" -> "赤" // 改行ごとの「,」は不要
    "blue" -> "青"
    "green" -> 1 // 型推奨にすれば値によって返す型を返ることもできる
    else -> "白" // 「else」に該当なしの場合の戻り値を記述（必須）
}
```

```kotlin
// enumクラスを条件に指定して全ての条件を網羅した場合、「else」は不要
val enumColor = when (Subject.MATH) {
    Subject.MATH -> "数学"
    Subject.ENGLISH -> "英語"
    Subject.SCIENCE -> "化学"
}
```

* for文

```kotlin
for(i in 1..100) {
    println(i) // 1から100まで出力される
}

for(i in listOf("あ","い","う")) {
    println(i) // あ　い　う
}

/*
  ラベル
  ラベルを付けることにより、forが2つ以上ある場合にラベル付のfor文に対してbreakやcontinueが指定できる
*/
loop@ for(a in 1..5) { // ルートのfor文にloop@ラベルを指定する
    for(b in 1..5) {
        if(a == 2 && b == 5) {
            break@loop
        }
        println("a:$a b:$b")
    }
}
```

* while文

```kotlin
var i = 10

while(i > 0) {
    println(i)
    i-- // 10から1まで出力
}


i = 10
do {
    println(i)
    i-- // 10から1まで出力
} while(i > 0)

```

## コレクション

* 要素の変更はバグの原因となりやすいため、いずれのコレクションでもイミュータブルなリストの使用を推奨

* リスト
    

```kotlin
/*
  通常のリスト（イミュータブル）
    ・要素の追加・削除ができない
*/
val iMutableList = listOf(1,2,3)
println("iMutableList : $iMutableList") // 1,2,3

iMutableList += 4  // イミュータブルなので要素の追加は行えない
iMutableList -= 3  // イミュータブルなので要素の削除は行えない

/*
  ミュータブルリスト
    ・要素の追加・削除が可能
*/
val mutableList = mutableListOf(1,2,3,3)
mutableList += 4 // 要素の追加(最後尾に追加する値を直接指定)
mutableList -= 3 // 要素の削除(値と一番最初に一致した要素を削除)
println("mutableList : $mutableList") // 1,2,3,4
```

*セット

```kotlin
/*
  セット
    ・一意の要素を保持できる
*/
val iMutableSet = setOf(1,2,3,3)
println("iMutableSet : $iMutableSet") // 1 2 3 (一意の要素を保持)

val mutableSet = mutableSetOf(1,2,3,3)
mutableSet += 4 // 要素の追加(最後尾に追加する値を直接指定)
mutableSet -= 3 // 要素の削除(値と一番最初に一致した要素を削除)
println("mutableSet : $mutableSet") // 1,2,4 (一意の要素を保持)
```

* マップ

```kotlin
/*
  マップ
  ・  キーと値のペアのセットを持つコレクション
*/
 
val iMutableMap = mapOf("phone" to "000-111-222", "address" to "123")
iMutableMap["address"] = "1234" // イミュータブルなので値の変更ができない

val mutableMap = mutableMapOf("phone" to "000-111-222", "address" to "123")
mutableMap["address"] = "1234"
println("mutableMap : $mutableMap")
```