Kotlinには、Javaのような switch 文はありません。
その代わりに、Kotlinでは when を使って条件分岐を書きます。
ただし、when は単なる switch の代用品ではありません。
Java の switch よりも表現力が高く、値による分岐だけでなく、複数条件・範囲判定・型判定・条件式による分岐まで書けます。
さらに、値を返す式として使えるのも大きな特徴です。
つまり、Kotlinでは「switchがない」というより、switchより柔軟な when があると理解すると分かりやすいです。
Kotlinではswitchの代わりに when を使う
Javaでは、値による分岐に switch を使います。
switch (x) {
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
default:
System.out.println("other");
}
Kotlinでは、これに近い処理を when で書きます。
when (x) {
1 -> println("one")
2 -> println("two")
else -> println("other")
}
対応関係は次のようになります。
switch→whencase→条件 -> 処理default→else
また、Kotlinでは break は不要 です。
基本構文
もっとも基本的な形は次の通りです。
val number = 2
when (number) {
1 -> println("1です")
2 -> println("2です")
3 -> println("3です")
else -> println("それ以外です")
}
number の値に応じて、対応する処理だけが実行されます。
break が不要な理由
Java の switch では、break を書き忘れると次の case に処理が流れる、いわゆるフォールスルーが起こることがありました。
一方、Kotlin の when では、一致した分岐だけが実行されて終了します。
val x = 1
when (x) {
1 -> println("one")
2 -> println("two")
else -> println("other")
}
この場合、x が 1 なら "one" だけが実行され、2 や else の処理には進みません。
そのため、break は必要ありません。
複数の値をまとめて書ける
同じ処理を複数の値に対して行いたいときは、カンマ区切りでまとめて書けます。
val score = 90
when (score) {
100, 90, 80 -> println("高得点です")
70, 60 -> println("合格です")
else -> println("再挑戦です")
}
Java の switch のように複数の case を並べる代わりに、Kotlinではこのように簡潔に書けます。
when は文としても式としても使える
Kotlin の when は、処理を分岐するための文としても、値を返す式としても使えます。
文として使う場合
val signal = "red"
when (signal) {
"red" -> println("止まる")
"yellow" -> println("注意")
"green" -> println("進む")
else -> println("不明")
}
これは単に処理を分けているだけです。
式として使う場合
val signal = "green"
val action = when (signal) {
"red" -> "止まる"
"yellow" -> "注意する"
"green" -> "進む"
else -> "不明"
}
println(action)
この場合、when 全体が1つの値を返し、その結果が action に代入されます。
Kotlinらしい書き方では、この「条件によって値を返す」使い方がとてもよく使われます。
範囲で判定できる
when は、単なる値の一致だけでなく、範囲で判定することもできます。
val age = 25
when (age) {
in 0..12 -> println("子ども")
in 13..19 -> println("ティーン")
in 20..64 -> println("大人")
else -> println("シニア")
}
ここで使っている in は、「その値がその範囲に含まれているか」を調べるための書き方です。
範囲外も判定できる
!in を使えば、「その範囲に含まれない」という条件も書けます。
val number = 150
when (number) {
!in 0..100 -> println("範囲外です")
else -> println("範囲内です")
}
型で判定できる
Kotlin の when は、型によって分岐することもできます。
これは Java の従来の switch にはなかった大きな特徴です。
fun checkType(value: Any) {
when (value) {
is Int -> println("Int型です")
is String -> println("String型です")
is Boolean -> println("Boolean型です")
else -> println("不明な型です")
}
}
is は「その型であるかどうか」を調べるための演算子です。
条件式ベースでも書ける
when は、比較対象となる値を書かずに使うこともできます。
この場合は、if / else if / else に近い使い方になります。
val age = 20
when {
age < 13 -> println("子ども")
age < 20 -> println("未成年")
else -> println("成人")
}
この形は、単純な値の一致ではなく、複雑な条件式で分岐したいときに便利です。
分岐の中で複数行の処理も書ける
1つの分岐で複数の処理を行いたい場合は、波括弧 {} を使います。
val mode = "edit"
when (mode) {
"view" -> {
println("閲覧モードです")
println("編集はできません")
}
"edit" -> {
println("編集モードです")
println("保存できます")
}
else -> {
println("不明なモードです")
}
}
else が必要な場合と不要な場合
ここは少し大事なポイントです。
when を式として使う場合、Kotlin は「必ずどれか1つの結果が返る」ことを求めます。
そのため、すべてのケースを網羅していないなら else が必要です。
val x = 3
val result = when (x) {
1 -> "one"
2 -> "two"
else -> "other"
}
このように else があると、どの値が来ても必ず結果を返せます。
一方で、コンパイラが「全パターンを網羅している」と判断できる場合は、else が不要になることがあります。
代表例は、enum class、sealed class、Boolean などです。
enum の例
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun move(direction: Direction) {
when (direction) {
Direction.NORTH -> println("北へ移動")
Direction.SOUTH -> println("南へ移動")
Direction.EAST -> println("東へ移動")
Direction.WEST -> println("西へ移動")
}
}
この場合、Direction のすべての値を扱っているので else は不要です。
Boolean の例
val flag = true
val result = when (flag) {
true -> "YES"
false -> "NO"
}
これも Boolean の取りうる値をすべて網羅しているため、else は不要です。
when は単なる値比較だけではない
when (対象) と書くと、Java の switch のように「決まった値との一致だけを調べるもの」に見えるかもしれません。
しかし実際には、Kotlin の when はもっと柔軟です。
たとえば次のような条件を書けます。
- 値の一致
- 複数の値
in/!inによる範囲判定is/!isによる型判定
例を分けると分かりやすいです。
値による分岐
when (x) {
0 -> println("zero")
1 -> println("one")
else -> println("other")
}
範囲による分岐
when (x) {
in 1..10 -> println("1〜10")
else -> println("それ以外")
}
型による分岐
when (value) {
is String -> println("文字列です")
is Int -> println("整数です")
else -> println("その他です")
}
この点で、when は switch よりかなり表現力があります。
Javaのswitchとの主な違い
Kotlin の when と Java の switch の違いを整理すると、次のようになります。
Kotlin の when
switchの代わりに使うbreakが不要- フォールスルーしない
- 式として値を返せる
- 複数の値をまとめられる
- 範囲判定ができる
- 型判定ができる
- 網羅性チェックがある
Java の従来の switch
- 値による分岐が中心
breakが必要だった- フォールスルーに注意が必要
- Kotlin の
whenほど柔軟ではない
実務でよくある使い方
ステータス文字列の変換
fun getStatusMessage(status: String): String {
return when (status) {
"draft" -> "下書きです"
"published" -> "公開中です"
"archived" -> "アーカイブ済みです"
else -> "不明なステータスです"
}
}
点数の判定
fun judgeScore(score: Int): String {
return when (score) {
in 90..100 -> "S"
in 80..89 -> "A"
in 70..79 -> "B"
in 60..69 -> "C"
in 0..59 -> "D"
else -> "無効な点数"
}
}
型ごとの処理
fun printValue(value: Any) {
when (value) {
is Int -> println("整数: $value")
is Double -> println("小数: $value")
is String -> println("文字列: $value")
else -> println("その他: $value")
}
}
if と when の使い分け
if が向いている場面
- 2分岐程度で十分なとき
- 条件が単純なとき
- 真偽値をそのまま判定したいとき
if (x > 0) {
println("正の数")
} else {
println("0以下")
}
when が向いている場面
- 分岐が3つ以上あるとき
- 値ごとに処理を分けたいとき
- 範囲や型で分けたいとき
- 条件分岐を見やすく整理したいとき
when (x) {
1 -> println("one")
2 -> println("two")
3 -> println("three")
else -> println("other")
}
まとめ
Kotlinには、Javaのような switch 文はありません。
その代わりに when を使って条件分岐を書きます。
ただし、when は単なる switch の置き換えではなく、より高機能です。
- 値による分岐ができる
- 複数の値をまとめられる
- 範囲判定ができる
- 型判定ができる
- 条件式ベースでも書ける
- 式として値を返せる
breakが不要- 網羅性チェックがある
そのため、Kotlinでは「switchがない」ではなく、「switchより柔軟な when がある」と理解するのが最も自然です。
以上、Kotlinのswitch文についてでした。
最後までお読みいただき、ありがとうございました。










