はじめに
本記事ではAndroidアプリを開発するための言語として使われるKotlinについての条件分岐や、ループ処理などをを学びます。変数、関数、クラスなどを読んでいない方はこちらからご覧ください。
Kotlin : 分岐処理
分岐処理とは
分岐処理とは条件判定を行い、その結果によって異なる処理を実行することです。単純に条件を満たす/満たさないの判定を行い、処理を判定する二分岐型や、条件判定により異なる複数の中から1つの処理を選択する多分岐型などがあります。
例えば、「りんご」が机の上に「ある/ない」で条件を判定をし、その結果によって「食べる/食べない」を実行する場合は二分岐型となります。
一方、多分岐は「りんが」机の上に「ある/ない」に加えて、バナナが「ある/ない」での条件も加えて多数の分岐に分かれて、複数の条件から1つの処理を実行することを多分岐型と呼びます。
Kotlinでは分岐処理の方法として、if文とwhen文があります。
Kotlin : if文
if文とは、英語で言うと「〜もし」と読みますが、プログラミング言語では「〜もし〇〇ならば」の〇〇の部分を条件として判定するための構文になります。実際に引数として渡された値の最大値を返すif文を作成してみましょう。
Kotlinの動きを見るために下記サイトで試してみてください。
fun main() {
println("0と42の大きい方は${maxOf(0, 42)}")
}
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
ここではmaxOfという最大値を返す関数を作成していますが、その中身の条件判定としてif文を使っています。if(a > b)というのは、「もしaよりbが大きいならば」という意味で、elseというのはifの場合ではない、すなわち「aよりbが大きくない」場合を意味しています。
つまり、maxOf関数全体としては「aよりbが大きい場合」はaを返し、「aよりbが大きくない場合」はbを返すという処理になっています。
Kotlin : if文で式を扱う
続いて、if文で式を扱う方法について見ていきましょう。 Kotlinではそれぞれの構文は式として使うことができ、if文によって行われた判定結果を変数に代入できます。実例を見てみましょう。
fun main() {
val a = 42
val b = 0
val max = if (a > b) a else b
println("0と42の大きい方は$max")
}
ここでも先程と同じように最大値を返す処理を行っていますが、違いとしてはif文で書いた結果をmaxという変数に代入している点となります。こうすることで、maxOf関数のif文よりも簡素され読みやすくなったと思いますので、使える場面では使うようにしましょう。
Kotlin : when文
when文とは条件分岐を行う点ではif文と同じですが、少し書き方違います。if文では1つ1つの条件を設定しますが、when文では1つの条件に対しての結果を複数の条件に分岐させ処理を実行させる方法になります。
※他のプログラミング言語だと「switch」という関数になっていることが多いです。実際の例を見てみましょう。
fun printNumber(number : Int){
when (number) {
0 -> {
println("0です")
}
1, 2 -> {
println("1か2でした")
}
else -> {
println("0より小さく、2より大きい数字です")
}
}
}
fun main() {
printNumber(0)
printNumber(2)
printNumber(-5)
}
ここでは、printNumberという関数を作成しています。printNumber関数の中身はwhen文でnumberという値によって、表示する内容を変えるというものになります。
when文は(number)という1つの条件に対して、numberの値によって表示する内容を変えていて、0の場合に実行したい処理がある場合は、0 -> {実行したい処理} のような書き方となります。
Kotlin : ループ処理
Kotlin : for文
for文とは条件が正しい場合に処理を実行し続けるような処理を行いたいときに使用します。例えばゴールまでが100mで、ロボットが1m進むという処理があったとすると、ロボットはゴールにたどり着くまでに1m進む処理を100回行う必要があります。このような時に100回処理を書くのではなく、for文で100回ループさせることにより実現します。それでは実際に書いてみましょう。
fun main() {
var robotProgress = 0
for(i in 1..100){
robotProgress += 1
println("ロボットが${robotProgress}mまで進みました")
}
}
robot_progressという変数はロボットの進み具合を示したもので、for文でiという変数を定義し、「in 1..100」としています。このin以降の数字は、iという変数が1から100まで変わるということを意味していて、100回ループするという処理になります。for文の中身としてはロボットが「+=1」すなわち1mずつ進むということ意味しているので、合計100m進むことになります。
Kotlin : while文
while文もfor文と同様にループさせるという点では同じになりますが、使い分けとしてはループを終了させるときの条件が定まっていない時などに利用するのが良いです。
例えば、ロボットが富士山まで登ることをゴールとして、ロボットがだんだん早くなって進むという処理があった場合、富士山までどのくらいの時間かかるか分からないので、終了条件として富士山までの距離を定義し、山頂についたらループ処理を終了させるような処理に使います。では、例を見てみましょう。
fun main() {
val mtFuji = 3776
var robotProgress = 0
while(mtFuji > robotProgress){
val randomProgress = (0..10).random()
robotProgress += randomProgress
println("ロボットは${robotProgress}mまで進みました。")
}
}
今回の例では3776mある富士山を登るという処理で、ロボットはrandomProgress = (0..10).random()でランダムに0から10mのいずれかを進むものとしています。この場合ロボットはいつ富士山を登り切るか分からないので、whileの条件文(mtFuji > robotProgress)という処理、すなわちロボットが富士山を超えていない場合に処理をし続けるという中身になっています。
Kotlin : Ranges
in
inとはデータの範囲を示すもので、for文のときにも軽く触れましたが、例えばinの後に
「1..10」のようにつけると1から10までの数字を示します。またfor文だけでなくif文などの他の関数にも利用でき、if文の場合では()内の条件が inの範囲に属するかを判定することができます。
分かりづらいと思いますので例を見せたいと思います。
fun main() {
checkNumber(7)
checkNumber(12)
checkNumber(-4)
}
fun checkNumber(x : Int){
if(x in 0..11){
println("${x}は0から11の範囲の数字です。")
}else{
println("${x}は0から11の範囲の数字ではありません。")
}
}
checkNumber関数は、引数に渡された数字が、0から11までの範囲に属するかを判定する処理になっています。if(x in 0..11)とあるようにxとして渡された値が、0から11の場合と、そうでない場合で条件分岐をしていて、inの後ろがデータの範囲になっていることがわかると思います。
step
step関数とはfor文などの時によく用いられ、inの後ろに1..10などをつけた場合に、1から10までの値を利用するのではなく、1,3,5,7,9のように値を飛ばしたい場合などに利用します。
fun main() {
for (x in 1..10 step 2) {
println("xの値は${x}です")
}
println()
for (x in 1..10 step 3) {
println("xの値は${x}です")
}
}
1つ目のfor文はstep 2としていて、1から10までのデータの範囲で、stepがない場合だとxは1つずつ変わっていきますが、step 2としているので1,3,5,7,9のように2ずつ変わっていっています。
同様に2つ目のfor文ではstep 3としていて1,4,7,10のように3ずつ変わっていくことがわかると思います。
Kotlin : Collections
コレクションとは、皆さん集めているフィギュアなどを例にすると分かりやすいかもしれませんが、好きなフィギュアが10体いるとすると、それを1つずつ眺めていき、それぞれに対して処理を行っていくようなものになります。
例としてリスト型の変数があり、その中にフルーツがたくさん入っているとすると、それらのフルーツに対して処理をするものを書いてみます。
fun main() {
var fruit = listOf("apple","banana","meron")
for (i in fruit){
if(i == "apple"){
println("これはりんごです(${i})")
}else{
println("これはりんごではありません。(${i})")
}
}
}
apple,banana,meronという果物が入った果物リストに対して、for文で1つ1つを判定している処理になっています。具体的には1つ1つ取り出したものが、りんごであるかどうかを判定しており、実際の中身に関しては()の中に表示するようにしています。
このようにコレクションは、複数のまとまりのデータに対して、1つずつ見ていき処理を行っていくというものになります。
Kotlin : まとめ
今回は分岐処理、ループ処理、Range、Collectionを見ていきました。
前回の「Kotlin(コトリン)の基礎を学ぼう-その1-」の記事と合わせて、Kotlin言語の基本的な部分は押さえていますので、これぐらい覚えておけばAndroidアプリ開発が出来るようになりますので、ぜひ理解しておいてください。
※ちなみにif文やfor文の使い方を覚える必要はなく、あくまで使い方を理解し、都度調べれば大丈夫です。この他にも書き方はたくさんあるので一度に覚えようとすると大変です…..
Kotlinを覚えたところで、Androidアプリを作ってみたい方は下記を参照してください。