目次
対象バージョン: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(コレクション) |