【Kotlin】while文とは - ループ処理の基本をサンプルコードと共に解説
Kotlinで任意の処理を繰り返したい場合にはwhile文を使うと、コードの記述力が少なくて済むKotlinのメリットを生かすことができます。ループ処理を行う際のfor文との違いも解説しながら、while文を紹介していきます。
Kotlinで任意の処理を繰り返したい場合にはwhile文を使うと、コードの記述力が少なくて済むKotlinのメリットを生かすことができます。ループ処理を行う際のfor文との違いも解説しながら、while文を紹介していきます。
スキルアップ
2020/12/14 UP
- プログラミング
- SE資格・スキル
- Kotlin
Kotlinは近年Googleから公式にサポートされたAndroid開発で今注目されている言語です。オブジェクト指向言語であり、Javaに近い感覚で使うことができますが、Javaに比べてコードの記述量が少なくて済むと言われています。
Kotlinで任意の処理を繰り返したい場合にはwhile文を使うと、コードの記述力が少なくて済むKotlinのメリットを生かすことができます。ループ処理を行う際のfor文との違いも解説しながら、while文を紹介していきます。
なお、Kotlinについて詳しく知りたい方は、こちらの記事をご確認ください。
Kotlinのwhile文とは
繰り返し処理はJavaと同様に、whileとdo whileの2つで表現できます。
サンプルコードのtestWhileFunctionがwhile、testDoWhileFunctionがdo whileのサンプルとなっています。どちらも変数iが初期値0から、10より小さい間処理が実行されることは変わりません。違うのは条件判定のタイミングです。
do whileのほうは条件判定が後に来るので、iの値に関わらず必ず1回は処理が実行されます。
while の場合
fun testWhileFunction() { var i = 0 while (i < 10) { println(i) ++i } }
do while の場合
fun testDoWhileFunction() { var i = 0 do { println(i) ++i } while (i < 10) }
条件はboolean型
while文で使う条件式は、trueかfalseで判定できるboolean型で記載しなければなりません。以下のサンプルコードはiに対して何の条件判定もないので、boolean型で値を返すことができず、エラーとなります。
なお、条件式で使える比較演算子と論理演算子については以下の記事をご参照ください。
【Kotlin】ifで条件分岐する書き方 - whenと合わせてサンプルコードで解説
fun testWhileFunction() { var i = 0 while (i) { println(i) ++i } }
KotlinとJavaの違い
同じ処理をJavaとKotlinの両方で記載して比較すると以下の通りとなります。
Kotlinは関数を定義する際に、クラス無しで実行することが可能です。また文末のセミコロン(;)はなくても問題ありません。
Javaで同じ書き方をしてしまうと、どちらもコンパイルエラーになるので注意しましょう。
Javaの場合
public class TestClass { public void testWhileMethod() { int i = 0; while (i < 10) { System.out.println(i); ++i; } } }
Kotlinの場合
fun testWhileFunction() { var i = 0 while (i < 10) { println(i) ++i } }
Kotlinでのwhile文の書き方
Kotlinでのwhile文の書き方を、サンプルを列挙しながら解説していきます。終了条件を満たすまでループ処理が継続するのがwhile文の特徴です。
while文の基本形
ループ条件を判定し、一致しなければwhileを抜けるのが基本の処理です。以下のサンプルコードでは、変数msgが「テスト2」の間、while文が回ります。
ここでは、冒頭でmsgに『テスト1』を代入しているため、while文は1度も実行されず、「終了」のみが出力されます。
var msg = "テスト1" while (msg == "テスト2") { println(msg) } println("終了")
do while文の基本形
do while文はループ内の処理を実行してから、条件判定をするため、while文の条件に該当しなくても1回は処理が実行されます。
次のサンプルコードではmsgが「テスト2」のときwhile文が実行されるという条件になっていますが、do whileでは最初に1回処理を実行するため、まず「テスト1」が出力されます。1回処理された後の条件判定でwhile文を抜け出し、最後の「終了」が出力されるので、出力結果はwhile文のときとは違って「テスト1」「終了」の2つとなります。
var msg = "テスト1" do { println(msg) } while(msg== "テスト2") println("終了")
breakでwhileを終了する
breakを使うことでループを抜け、処理を終了させることができます。
次のサンプルコードはwhile文とdo while文、どちらも同じ結果が出ます。変数iが初期値0から始まり、iが3になったところでループを抜け、最後に「終了」を出力します。
whileの場合
var i = 0 while(i < 5) { if (i == 3) break println(i) ++i } println("終了")
do whileの場合
var i = 0 do { if (i == 3) break println(i) ++i }while(i < 5) println("終了")
なお、breakの代わりにもう一つreturn@を使うことも可能です。return@は、「@」の後ろにラベルを記載することで、任意の関数まで戻ることができるものです。ラベルを貼らないと直近の関数へ戻ってしまうため、関数を入れ子で使用している際など、複数の処理が必要な場面では重宝します。
continueで次のwhileループへ
continueを使うことで、そのループ処理をスキップすることができます。continueの条件に該当したときだけ、処理をスキップするので、whileのループ自体は止まらずに再度ループ処理が実行されます。
次のサンプルコードでは、変数iが3のときだけcontinueでPrintInの処理がスキップされます。そのため3は出力されません。
whileの場合
var i = 0 while(i < 5) { if (i == 3) { ++i continue } println(i) ++i } println("終了")
do whileの場合
var i2 = 0 do { if (i2 == 3) { ++i2 continue } println(i2) ++i2 } while (i2 < 5) println("終了")
無限ループをわざと作る
while(1)やwhile(true)のように常に条件が成立している状態を作ると、ループは無限に回り続けます。いたずらに処理が回り続けるとメモリを圧迫するなど、エラーの原因となるので、意図せず無限ループしないように注意しましょう。
fun testInfiniteWhileFunction() { while (true) { // 処理 } }
fun testInfiniteDoWhileFunction() { do { // 処理 } while (true) }
while文とfor文の使い分け
ループを回せるという意味ではwhile文もfor文も同じですが、主に終了条件が明確に決まっているかで使い分けがされます。状況に応じて適切なほうが使えるようになるのが一番です。具体的な例を、サンプルを列挙して解説します。
while文のほうがよい場合
while文はループ回数が決まっていないときの処理に適しています。do while文も考慮に入れると必ず1度処理を実行したい場合にも対応できます。冒頭に必ず同じものを出力したいときなどには便利です。
次のサンプルはtextがnullの間はwhile文が回り、データを代入します。データが代入され、nullではなくなったら変数の値を出力して終了します。何回目にnullでなくなるかは、この処理だけでは分かりません。
もしfor文でこの処理をしようとすると、先に終了条件となる値の数を数えた上で、この処理に入る必要があり、ひと手間増えてしまいます。
var text: String? val data = "テスト" do { text = data if (text != null){ println(text) break } } while (text == null) println("終了")
なおこの処理では、変数text に必ず変数data(テストという文字列)を代入していますので、必ずnullにはなりません。したがって、ループは1回だけ回り、終了します。
for文のほうがよい場合
for文のループは回数が決まっているときに使うのが便利です。以下のサンプルは配列の数分だけループさせ、配列の順番と、配列の中の要素が一致しているかを確認していきます。一致していなければ「順番がずれています」を出力してループから抜けます。
forの場合
var array = arrayOf("0番目","1番目","3番目") var num =0 for (i in array){ if (i == "${num}番目"){ println(i) ++num continue } else { ++num println("順番がずれています") } } println("終了")
Kotlinのwhile文をマスターしよう
while文はループ処理の基本です。ループ回数が決まっていない場合はwhileかdo whileが、逆にループ回数が決まっているときにはfor文がおすすめです。
また、whileとdo whileは条件判定のタイミングが異なります。必ず実行されてほしい処理があるかを考えるとdo while文を使うタイミングが見えてきます。
同じようにループが回せるwhile do while forを比較し、場面にあわせてより適したほうを使っていきましょう。