【Kotlin】レッスン2-03:when文による分岐処理を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:比較演算子と論理演算子

この記事の練習問題を解くために必要な知識:
基礎文法(レッスン1)比較演算子と論理演算子、if文による分岐処理、when文による分岐処理、スマートキャスト、for文による繰り返し処理、while文による繰り返し処理、繰り返しの制御、エラーメッセージ、例外処理

<<前のページ Kotlin記事一覧 次のページ>>

Kotlinの文法「when文」とは

ここではwhen文の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



プログラムの中で条件に応じた処理を行うことは非常に重要です。

Kotlinには複雑な条件分岐を簡潔に記述できるwhen文があります。

この節ではwhen文の使い方を学び、柔軟な分岐処理を実現する方法を解説します。

when文とは?

when文はKotlinで複数の条件に基づいて異なる処理を実行するための分岐構文です。

これは他のプログラミング言語におけるswitch文に似ていますが、Kotlinのwhen文はより強力で柔軟です。

値や式だけでなく、型や範囲にも基づいて条件分岐を行うことができます。

when文の基本構文

when文は次のような構文で記述します。

when (式) {
    値1 -> 処理1
    値2 -> 処理2
    else -> デフォルト処理
}
  1. whenの後に評価する式を置きます。
  2. 各条件(値 -> 処理)を列挙し、elseブロックでデフォルトの処理を定義します。
  3. 条件が満たされた場合、その処理が実行されます。

例:簡単な値の条件分岐

fun main() {
    val number = 3
    when (number) {
        1 -> println("One")      // numberの値が1ならばOneと出力
        2 -> println("Two")      // numberの値が2ならばTwoと出力
        3 -> println("Three")    // numberの値が3ならばThreeと出力
        else -> println("Other") // どの条件にも該当しないならOtherと出力
    }
}

このコードを実行すると、"Three"と出力されます。

when文の使用例

when文を使用した条件分岐の例を3つ紹介します。

1. 条件に基づいた処理

when文は単純な値の条件だけでなく、範囲や型の判定にも利用できます。

fun main() {
    val age = 25
    when (age) {
        in 0..17 -> println("Child")   // ageの値が0から17の間ならchildと出力
        in 18..64 -> println("Adult")  // ageの値が18から68の間ならAdultと出力
        else -> println("Senior")      // どちらの条件にも当てはまらないならSeniorと出力
    }
}

この例ではageが範囲演算子(..)を使用して分類され、"Adult"と出力されます。

2. 型判定に基づく処理

when文は型を判定して処理を行うこともできます。

fun main() {
    val obj: Any = "Hello"
    when (obj) {
        is String -> println("This is a String") // objの型がString型なら"This is a String"と出力
        is Int -> println("This is an Integer")  // objの型がInt型なら"This is an Integer"と出力
        else -> println("Unknown type")          // どちらの条件にも当てはまらないなら"Unknown type"と出力
    }
}

この例ではobjString型であるため、"This is a String"と出力されます。

3. 複数条件のグループ化

複数の条件をまとめて記述することも可能です。

fun main() {
    val char = 'A'
    when (char) {
        'A', 'E', 'I', 'O', 'U' -> println("Vowel") // charの値がA,E,I,O,Uのどれかであれば"Vowel"と出力
        else -> println("Consonant")                // 上記の条件に当てはまらないなら"Consonant"と出力
    }
}

この例ではcharが母音に一致する場合、"Vowel"と出力されます。

まとめ

when文はKotlinの条件分岐を簡潔に記述するための強力なツールです。この構文を使えばコードの読みやすさと効率が向上します。

次回はスマートキャストを用いた高度な型判定について学びましょう。

when文による分岐処理の練習問題

ユーザーに1から7までの数字を入力してもらい、対応する曜日を出力するプログラムを作成してください。

1は「月曜日」、2は「火曜日」…7は「日曜日」とします。

この問題の要件

以下の要件に従ってプログラムを作成してください。

  • readLine()を使用してユーザーからの入力を取得し、それを整数に変換してください。
  • if文を使って、ユーザーが有効な数字(1から7)を入力したかどうかをチェックしてください。
  • when文を使って、入力された数字に対応する曜日を表示してください。
  • 無効な入力に対して適切なメッセージを表示してください。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

1から7までの数字を入力してください: 3
水曜日
1から7までの数字を入力してください: 9
無効な入力です。1から7までの数字を入力してください。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:main関数の定義
  □ ユーザーに「1から7までの数字を入力してください: 」と出力
  □ ユーザーの入力をreadLineで取得し、input変数に代入
  □ inputをtoIntOrNullで数値に変換し、day変数に代入
  □ if文でdayがnullでないことを確認
  □ □ when文による分岐開始
  □ □ □ case 1:「月曜日」と出力
  □ □ □ case 2:「火曜日」と出力
  □ □ □ case 3:「水曜日」と出力
  □ □ □ case 4:「木曜日」と出力
  □ □ □ case 5:「金曜日」と出力
  □ □ □ case 6:「土曜日」と出力
  □ □ □ case 7:「日曜日」と出力
  □ □ □ default:「無効な入力です。1から7までの数字を入力してください。」と出力
  □ else文で「無効な入力です。1から7までの数字を入力してください。」と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

fun main() {
    // ユーザーに1から7までの数字を入力してもらうように指示
    print("1から7までの数字を入力してください: ")
    val input = readLine()
    val day = input?.toIntOrNull()

    // 入力された数字に対応する曜日を出力するためのwhen文
    if (day != null) {
        /* 【穴埋め問題1】
        ここでwhen文を使ってdayの値に対応する曜日を出力するコードを書いてください。
        例: dayが1なら「月曜日」を出力する
        */
    } else {
        println("無効な入力です。1から7までの数字を入力してください。")
    }
}

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

fun main() {
    // ユーザーに1から7までの数字を入力してもらうように指示
    print("1から7までの数字を入力してください: ")
    val input = readLine()
    val day = input?.toIntOrNull()

    // 入力された数字に対応する曜日を出力するためのwhen文
    if (day != null) {
        when (day) {
            1 -> println("月曜日")
            2 -> println("火曜日")
            3 -> println("水曜日")
            4 -> println("木曜日")
            5 -> println("金曜日")
            6 -> println("土曜日")
            7 -> println("日曜日")
            else -> println("無効な入力です。1から7までの数字を入力してください。")
        }
    } else {
        println("無効な入力です。1から7までの数字を入力してください。")
    }
}

正解コードの解説

このKotlinプログラムは、ユーザーに1から7までの数字を入力してもらい、その数字に対応する曜日を表示するプログラムです。

コードの各部分を順に説明します。

ユーザーに数字を入力させる

print("1から7までの数字を入力してください: ")
val input = readLine()
val day = input?.toIntOrNull()

最初に、print関数を使ってユーザーに1から7までの数字を入力するよう促します。

readLine()関数でユーザーの入力を受け取り、それをtoIntOrNull()メソッドで整数に変換します。もし入力が数字でなかった場合、このメソッドはnullを返します。

入力値が有効かどうか確認する

if (day != null) {

次に、if文を使用して、daynullでないことを確認します。これは、ユーザーが有効な数字を入力したかどうかをチェックするためです。

when文で曜日を判定する

when (day) {
    1 -> println("月曜日")
    2 -> println("火曜日")
    3 -> println("水曜日")
    4 -> println("木曜日")
    5 -> println("金曜日")
    6 -> println("土曜日")
    7 -> println("日曜日")
    else -> println("無効な入力です。1から7までの数字を入力してください。")
}

when文を使って、dayに対応する曜日を判定し、println関数で結果を表示します。

elseブロックでは、1から7以外の数字が入力された場合にエラーメッセージを表示します。

エラーメッセージの表示

} else {
    println("無効な入力です。1から7までの数字を入力してください。")
}

daynullの場合、つまりユーザーが有効な数字を入力しなかった場合、elseブロック内のエラーメッセージが表示されます。これにより、ユーザーは再入力を促されます。

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlin練習問題集へ戻る
    トップページへ戻る