Skip to content

制御フロー

他のプログラミング言語と同様に、Kotlinはコードの評価が真であるかどうかに基づいて判断を下すことができます。このようなコードは条件式と呼ばれます。Kotlinはループを作成して反復処理することもできます。

条件式

Kotlinは条件式をチェックするためにifwhenを提供します。

ifwhenのどちらかを選択する必要がある場合、whenの使用をお勧めします。なぜなら、whenは以下の利点があるためです。

  • コードを読みやすくします。
  • 別の分岐を追加しやすくなります。
  • コード内の間違いを減らすことができます。

If

ifを使用するには、条件式を丸括弧()内に、結果が真である場合に実行するアクションを波括弧{}内に追加します。

kotlin
fun main() {
    val d: Int
    val check = true

    if (check) {
        d = 1
    } else {
        d = 2
    }

    println(d)
    // 1
}

Kotlinには三項演算子 condition ? then : else はありません。代わりに、ifは式として使用できます。各アクションにコードが1行しかない場合、波括弧{}はオプションです。

kotlin
fun main() { 
    val a = 1
    val b = 2

    println(if (a > b) a else b) // 値を返します: 2
}

When

複数の分岐を持つ条件式がある場合は、whenを使用します。

whenを使用するには、以下の手順を実行します。

  • 評価したい値を丸括弧()内に配置します。
  • 分岐を波括弧{}内に配置します。
  • 各分岐で->を使用して、各チェックと、チェックが成功した場合に実行するアクションを区切ります。

whenはステートメントとしても式としても使用できます。ステートメントは何も返さず、代わりにアクションを実行します。

whenをステートメントとして使用する例を以下に示します。

kotlin
fun main() {
    val obj = "Hello"

    when (obj) {
        // objが"1"と等しいかどうかをチェックします
        "1" -> println("One")
        // objが"Hello"と等しいかどうかをチェックします
        "Hello" -> println("Greeting")
        // デフォルトのステートメント
        else -> println("Unknown")     
    }
    // Greeting
}

すべての分岐条件は、いずれかが満たされるまで順番にチェックされることに注意してください。したがって、最初に合致する分岐のみが実行されます。

は、後でコードで使用できる値を返します。

whenを式として使用する例を以下に示します。when式は変数に即座に割り当てられ、その変数は後でprintln()関数で使用されます。

kotlin
fun main() {
    val obj = "Hello"    
    
    val result = when (obj) {
        // objが"1"と等しい場合、resultを"one"に設定します
        "1" -> "One"
        // objが"Hello"と等しい場合、resultを"Greeting"に設定します
        "Hello" -> "Greeting"
        // 以前の条件が満たされない場合、resultを"Unknown"に設定します
        else -> "Unknown"
    }
    println(result)
    // Greeting
}

ここまで見てきたwhenの例は、どちらもobjというサブジェクト(対象)を持っていました。しかし、whenはサブジェクトなしでも使用できます。

この例では、サブジェクトなしのwhen式を使用して、一連のBoolean式をチェックします。

kotlin
fun main() {
    val trafficLightState = "Red" // これは「Green」、「Yellow」、または「Red」になります

    val trafficAction = when {
        trafficLightState == "Green" -> "Go"
        trafficLightState == "Yellow" -> "Slow down"
        trafficLightState == "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)
    // Stop
}

ただし、trafficLightStateをサブジェクトとして同じコードを記述することもできます。

kotlin
fun main() {
    val trafficLightState = "Red" // これは「Green」、「Yellow」、または「Red」になります

    val trafficAction = when (trafficLightState) {
        "Green" -> "Go"
        "Yellow" -> "Slow down"
        "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)  
    // Stop
}

サブジェクト付きでwhenを使用すると、コードが読みやすくなり、保守も容易になります。when式でサブジェクトを使用すると、Kotlinがすべての可能なケースが網羅されているかを確認するのにも役立ちます。そうしない場合、つまりwhen式でサブジェクトを使用しない場合は、else分岐を提供する必要があります。

条件式の練習

演習1

2つのサイコロを投げて同じ目が出たら勝ちとなるシンプルなゲームを作成してください。サイコロの目が一致したらYou win :)を、そうでなければYou lose :(ifを使って出力してください。

TIP

この演習では、Random.nextInt()関数を使用してランダムなIntを取得できるように、パッケージをインポートします。パッケージのインポートに関する詳細については、パッケージとインポートを参照してください。

ヒント
サイコロの結果を比較するために、等価演算子 (==)を使用してください。
kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    // Write your code here
}
解答例
kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    if (firstResult == secondResult)
        println("You win :)")
    else
        println("You lose :(")
}
演習2

when式を使用して、ゲームコンソールのボタン名を入力すると、対応するアクションが出力されるように以下のプログラムを更新してください。

ボタンアクション
Aはい
Bいいえ
Xメニュー
Y何もしない
その他そのようなボタンはありません
kotlin
fun main() {
    val button = "A"

    println(
        // Write your code here
    )
}
解答例
kotlin
fun main() {
    val button = "A"
    
    println(
        when (button) {
            "A" -> "Yes"
            "B" -> "No"
            "X" -> "Menu"
            "Y" -> "Nothing"
            else -> "There is no such button"
        }
    )
}

For

レンジの新しい知識を使って、1から5までの数値を反復処理し、毎回その数値を出力するforループを作成できます。

イテレータとレンジをキーワードinとともに丸括弧()内に配置します。完了したいアクションを波括弧{}内に追加します。

kotlin
fun main() {
    for (number in 1..5) { 
        // numberはイテレータで、1..5はレンジです
        print(number)
    }
    // 12345
}

コレクションもループによって反復処理できます。

kotlin
fun main() { 
    val cakes = listOf("carrot", "cheese", "chocolate")

    for (cake in cakes) {
        println("Yummy, it's a $cake cake!")
    }
    // Yummy, it's a carrot cake!
    // Yummy, it's a cheese cake!
    // Yummy, it's a chocolate cake!
}

While

whileは2つの方法で使用できます。

  • 条件式が真である間、コードブロックを実行する。(while
  • 最初にコードブロックを実行し、その後条件式をチェックする。(do-while

最初のユースケース(while)では:

  • whileループを継続するための条件式を丸括弧()内に宣言します。
  • 完了したいアクションを波括弧{}内に追加します。

以下の例では、cakesEaten変数の値をインクリメントするためにインクリメント演算子 ++を使用します。

kotlin
fun main() {
    var cakesEaten = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    // Eat a cake
    // Eat a cake
    // Eat a cake
}

2番目のユースケース(do-while)では:

  • whileループを継続するための条件式を丸括弧()内に宣言します。
  • 完了したいアクションをキーワードdoとともに波括弧{}内で定義します。
kotlin
fun main() {
    var cakesEaten = 0
    var cakesBaked = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    do {
        println("Bake a cake")
        cakesBaked++
    } while (cakesBaked < cakesEaten)
    // Eat a cake
    // Eat a cake
    // Eat a cake
    // Bake a cake
    // Bake a cake
    // Bake a cake
}

条件式とループに関する詳細および例については、条件とループを参照してください。

Kotlinの制御フローの基本を理解したところで、独自の関数を記述する方法を学ぶ時が来ました。

ループの練習

演習1

ピザが8切れになるまでピザの切れ数を数えるプログラムがあります。このプログラムを以下の2つの方法でリファクタリングしてください。

  • whileループを使用する。
  • do-whileループを使用する。
kotlin
fun main() {
    var pizzaSlices = 0
    // ここからリファクタリングを開始
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    // ここでリファクタリングを終了
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
解答例1
kotlin
fun main() {
    var pizzaSlices = 0
    while ( pizzaSlices < 7 ) {
        pizzaSlices++
        println("There's only $pizzaSlices slice/s of pizza :(")
    }
    pizzaSlices++
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
解答例2
kotlin
fun main() {
    var pizzaSlices = 0
    pizzaSlices++
    do {
        println("There's only $pizzaSlices slice/s of pizza :(")
        pizzaSlices++
    } while ( pizzaSlices < 8 )
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
演習2

Fizz buzzゲームをシミュレートするプログラムを記述してください。あなたのタスクは、1から100までの数を増分しながら出力し、3で割り切れる場合は「fizz」に、5で割り切れる場合は「buzz」に置き換えることです。3と5の両方で割り切れる場合は「fizzbuzz」に置き換えなければなりません。

ヒント1
数を数えるにはforループを、各ステップで何を出力するかを決定するにはwhen式を使用してください。
ヒント2
数を割った余りを返すには剰余演算子 (%) を使用してください。余りがゼロに等しいかどうかをチェックするには等価演算子 (==) を使用してください。
kotlin
fun main() {
    // Write your code here
}
解答例
kotlin
fun main() {
    for (number in 1..100) {
        println(
            when {
                number % 15 == 0 -> "fizzbuzz"
                number % 3 == 0 -> "fizz"
                number % 5 == 0 -> "buzz"
                else -> "$number"
            }
        )
    }
}
演習3

単語のリストがあります。forifを使用して、文字lで始まる単語のみを出力してください。

ヒント
String型には.startsWith()関数を使用してください。
kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    // ここにコードを記述してください
}
解答例
kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    for (w in words) {
        if (w.startsWith("l"))
            println(w)
    }
}