【Kotlin】レッスン2-3:when文でスマートな条件分岐を実現しよう

一つ前のページではif文による分岐処理について学習しました。
今回は when文による分岐処理 について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:if文による分岐処理を理解しよう
・Lesson2-3:when文による分岐処理を理解しよう ◁今回はココ
・Lesson2-4:スマートキャストを理解しよう
・Lesson2-5:for文による繰り返し処理を理解しよう
・Lesson2-6:while文による繰り返し処理を理解しよう
・Lesson2-7:繰り返しを制御しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理を理解しよう
・確認問題2-☆1:ハイアンドローゲームを作ろう
・確認問題2-☆2:数字当てゲームを作ろう
・確認問題2-☆3:簡単なじゃんけんゲームを作ろう
Lesson3:関数編
Lesson4:コレクション編
Lesson5:オブジェクト指向編
when文とは何か|柔軟な条件分岐を学ぼう
when文 は複数の条件に基づいて異なる処理を実行するための分岐処理構文です。
これは他のプログラミング言語におけるswitch文やcase文に該当しますが、Kotlinのwhen文はより強力で柔軟です。

when文による分岐処理の基本構文と使用例
when文による分岐処理の基本構文は以下の通りです。
when (値) { // 値が 値1 -> 処理1 // 値1なら処理1を実行する 値2 -> 処理2 // 値2なら処理2を実行する else -> デフォルト処理 // どれにも該当しないならデフォルト処理を実行する }
when
の後に評価する値や式を置きます。- 各条件(
値 -> 処理
)を列挙し、else
ブロックでデフォルトの処理を定義します。 - 条件が満たされた場合、その処理が実行されます。
when文の使用例を見てみましょう。
fun main() { val number = 3 when (number) { // 定数numberの値が、 1 -> println("One") // 1ならばOneと出力 2 -> println("Two") // 2ならばTwoと出力 3 -> println("Three") // 3ならばThreeと出力 else -> println("Other") // どの条件にも該当しないならOtherと出力 } }
numberには3が格納されているので、このコードを実行すると"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"と出力 } }
この例ではobj
がString
型であるため、"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独自の強力な構文です。if文を何度もネストする必要がなく、見やすくスッキリしたコードを書くことができます。
また、値だけでなく、型や範囲、複数の値にも柔軟に対応できるのも大きな特徴です。
分岐処理を書くときは、ぜひ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までの数字を入力してください。") } }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
ユーザーに数字を入力させる
print("1から7までの数字を入力してください: ") val input = readLine() val day = input?.toIntOrNull()
最初に、
print
関数を使ってユーザーに1から7までの数字を入力するよう促します。readLine()
関数でユーザーの入力を受け取り、それをtoIntOrNull()
メソッドで整数に変換します。もし入力が数字でなかった場合、このメソッドはnull
を返します。入力値が有効かどうか確認する
if (day != null) {
次に、
if
文を使用して、day
がnull
でないことを確認します。これは、ユーザーが有効な数字を入力したかどうかをチェックするためです。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までの数字を入力してください。") }
day
がnull
の場合、つまりユーザーが有効な数字を入力しなかった場合、else
ブロック内のエラーメッセージが表示されます。これにより、ユーザーは再入力を促されます。
- サイト改善アンケート & ご指摘/ご質問
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。また記事の内容に関する ご指摘 や ご質問 もお待ちしています。