対象バージョン:Android Studio v4.1, Kotlin v1.4
フロー制御
今回はKotlinのフロー制御を確認していきます。
ただし、全てをみるというよりは、他の言語で利用するようなフロー制御をKotlinでどうやって記述するかがメインとなります。
前置き
ここで紹介している内容は、僕自身がKotlinでプログラミングする上で必要と思う事を記載しています。(ほぼ備忘録です)
間違いや、不足部分、正しくない使い方も多々あると思いますので、記載内容に疑問がある場合はKotlinの正式なサイトや、他の方の記事も参考にしてみてください。
条件分岐
とりあえず、必ず使うであろう条件分岐から確認していきます。
if文
必ず使うであろうif文です。
一般的な使い方
条件分岐については、他言語と使い方はほぼ同じです。
val a = 0
val b = 1
if(a == b)
{
editTextResult.append("a is equal to b" + System.lineSeparator())
if(a == 0 && b == 0)
{
editTextResult.append("Both a and b are zero" + System.lineSeparator())
}
}
else if(a > b)
{
editTextResult.append("a is bigger than b" + System.lineSeparator())
}
else
{
editTextResult.append("a is smaller than b" + System.lineSeparator())
}比較演算子
比較演算子は、他の言語とほぼ同じです。
| 演算子 | 意味 | 例 |
|---|---|---|
| == | 等しい | a == b 「aとbは等しい」 |
| != | 等しくない | a != b 「aとbは等しくない」 |
| > | より大きい | a > b 「aはbより大きい」 |
| >= | 以上 | a >= b 「aはb以上」 |
| < | より小さい | a < b 「aはbより小さい」 |
| <= | 以下 | a <= b 「aはb以下」 |
※Kotlinにはイコール記号を3つ使った「===」(identity equality)というものも存在しているので、タイプミスには気を付けましょう。
また、符号付き(Signed)の数字と、符号無し(Unsigned)の数字の比較はエラーになるので注意しましょう。
論理演算子
論理演算子は他の言語と変わりはないです。
| 演算子 | 意味 | 例 |
|---|---|---|
| && | AND(論理積) | a == 0 && b == 0 (a==0 かつ b == 0) |
| || | OR(論理和) | a == 0 || b == 0 (a==0 または b == 0) |
| ! | NOT(否定) | !(a==0) (a==0でない) |
※Kotlinには「and」「or」がありますが、こちらはビット演算子なので間違えない様にしましょう。
if文で値を返す
Kotlinで面白いのは、if文が値を返す事が出来るという事です。
上の条件分岐でメッセージ(文字列)を返すような形に置き換えると、下記の様になります。
val a = 0
val b = 1
val msg = if(a == b)
{
if(a == 0 && b == 0)
{
"Both a and b are zero"
}
else
{
"a is equal to b"
}
}
else if(a > b)
{
"a is bigger than b"
}
else
{
"a is smaller than b"
}
editTextResult.append(msg + System.lineSeparator())注意として、if文のすべての条件分岐で同じ型を返す様にする必要があります。
Kotlinには「(a > b?a:b)」の様な三項演算子はありませんが、if文で代用する事が出来ます。
//val c = (a>b?a:b) // 三項演算はない val c = if(a > b) a else b // a,b の大きい方を設定
条件式はBoolean型のみ
整数型の変数を用いて「0以外ならtrue、0ならfalse」の様な使い方は出来ません。

まぁ、本来論理式が入る部分で、バグが入り込みやすいから、横着するなという事でしょう^^;
switch文(はありません)
Kotlinにswitch文はありません…。(個人的にはよく使うのですが…)
代わりに(?)、When文が存在します。
when文
KotlinのWhen文は、他の言語のSwitch文に似た使い方になるかと思います。
when文の構文
ざっくりとしたWhen文の構文は下記の様になります。(若干怪しいですが…^^;)
when(変数)
{
値1 -> { (ブロック1) }
値2 -> { (ブロック2) }
else -> { (ブロック3) }
}
※個人的には「->」の書き方は、比較演算子と似ているので、あまり好きではないのですが、Kotlinではいろんな所に出てくるので、慣れるしかにですね…^^;
上記では、
『「変数」の値が「値1」なら「ブロック1」を実行し、
「変数」の値が「値2」なら「ブロック2」を実行し、
「変数」の値がそれ以外なら「ブロック3」を実行する』
というような動作になる事をしめしています。
ブロック内が1行の処理なら、カッコ{}は省略できます。
val a : Int = 0
when(a)
{
0 -> editTextResult.append("a is 0" + System.lineSeparator())
1 -> editTextResult.append("a is 1" + System.lineSeparator())
2 -> editTextResult.append("a is 2" + System.lineSeparator())
else -> editTextResult.append("a is other" + System.lineSeparator())
}値の評価部分は、型チェックを記載する事も出来ますが、個人的にはあまり使い道が思い浮かびません…^^;
is Int -> editTextResult.append("a is Int" + System.lineSeparator())
when文も値を返す
if文と同様に値を返すwhen文も記述する事が出来ます。
val a : Int = 0
val msg : String =
when(a)
{
0 -> "a is 0"
1 -> "a is 1"
2 -> "a is 2"
else -> "a is other"
}
editTextResult.append( msg + System.lineSeparator())※値を返す場合は、「else」行が必須になります。
複数の値の評価
他の言語のswitch文で下記の様な「値が値1か値2だった場合に、この処理をする」みたいな使い方は、Kotlinのwhen文では値を「,」(カンマ)で並べて記載します。
switch(a)
{
// 0 または 1の時の処理
case 0:
case 1:
editTextResult.append("a is 0 or 1" + System.lineSeparator())
break;
case 2:
editTextResult.append("a is 2" + System.lineSeparator())
break;
default:
editTextResult.append("a is other" + System.lineSeparator())
break;
}when(a)
{
// 0 または 1の時の処理
0, 1 -> editTextResult.append("a is 0 or 1" + System.lineSeparator())
2 -> editTextResult.append("a is 2" + System.lineSeparator())
else -> editTextResult.append("a is other" + System.lineSeparator())
}Javaのコードと並べると、Kotlinがコードが簡潔に書けるようになっている事が分かりますね。(良い事ととるか、悪い事ととるかは人それぞれでしょうけど…)
ループ処理
プログラミングに欠かせないループ処理の記述の方法について見ていきます。
forループ
繰り返し処理を行うためのループ処理です。
昇順の繰り返し
例えば1から100までの和を求めるような処理の場合は、下記の様になります。
var sum : Int = 0
for(i in 1..100)
{
sum += i
}
editTextResult.append("SUM = " + sum + System.lineSeparator())for()の「i」には「var」や「val」は不要です。
また、forの中で「i」の値を割り当てる事は出来ません。

「in 1..100」部分で繰り返しの範囲を指定します。
開始値と終了値を変数で与える事も可能です。
var sum : Int = 0
val from = 1
val to = 10
for(i in from..to)
{
sum += i
}下記の注意点があります。
- 開始値、終了値に浮動小数点は指定できません。
- 開始値または終了値にLong型を指定すると、「i」の型はLongになります。Long以外の場合は、「i」はInt型になります。
- 符号無し整数を指定する場合、開始値・終了値とも同じ型を指定する必要があります。また「i」は開始値・終了値に指定した型になります。
降順の繰り返し
「100から1まで」の様に降順の繰り返し処理を行う場合は、「for(i in 100..1)」ではなく、「downTo」を使って下記の様に記述します。
var sum : Int = 0
for(i in 100 downTo 1)
{
sum += i
}開始値・終了値の注意点は、昇順の場合と同じです。
ステップの指定
刻みちを指定する場合は、昇順・降順問わず「step <刻み値>」を追加します。
for(i in 1..100 step 2)
{
sum += i
}
for(i in 100 downTo 1 step 2)
{
sum += i
}刻み値は1以上の整数を指定します。(マイナスを指定するとアプリが落ちます…T_T;)
※forループの使い方は、上記の他に、配列やリストなど、iteratorを持つクラスの要素を取り出す使い方もありますが、それについては別途記載します。
whileループ、do-whileループ
whileループ、do-whileループは他の言語と同じです。
// while loop
var a : Int = 0
while (a < 10)
{
editTextResult.append("a = " + a + System.lineSeparator())
a++
}
// do-while loop
a = 0
do{
editTextResult.append("a = " + a + System.lineSeparator())
a++
} while(a < 10)
Kotlinのフロー制御の特徴としては…
- switch文はなく、when文が追加されている
- if文、when文は値を返す事ができる
- forループの書き方は独特(pythonとかに近い)
と言った感じでしょうか?
また、型が異なると比較や演算でエラーになるので、その辺はなれるまで、もやもやしそうです…^^;
次回予告
次回はコレクション(配列、リストなど)について見ていこうと思います。
| 前の記事 | 次の記事 |
|---|---|
| No.04(変数の宣言) | No.06(コレクション) |