情報と電子とおおかた遊び

プログラムの備忘録を綴りつつ、適当に遊びも記載するゆるいブログ

Kotlinのいろは2

今回は条件分岐と、ループ処理を記載しますね。 それが終わればようやくメソッドやら、クラスやら胆の部分に入っていけるかと。

条件分岐

if文

Kotlinのif文は以下のように書くことができます。

//基本の構文
if("条件1"){
    //処理1
} else if("条件2"){
    //処理2
} else {
    //処理3
}

では、実際に書いてみましょう。

//例1: 基本の書き方
var i = 1 

if(i == 1){// Helloが出力される
    println("Hello")
} else if(2){
    println("World")
} else {
    println("Fail")
}

//例2: {}を使わない方法も存在する。一行しか処理は書けない。
if(i == 1){
    println("Hello")

Kotlin特有かなと思ったのは、if文での代入ができることでしょうか? 同じことができる言語はあるのかな?

//例3: if文での代入
var iftest = if(i == 1){
    "Hello"
} else if(i == 2) {
    "World"
} else {
    "Fail"
}
println(iftest) // Helloが出力される

when文

所謂、switch文のKotlin版です。 ただ、微妙に構文が違うのと、一般的なswitch文よりも強力な機能も備えています。

when("比較対象"){

    "条件1" -> "処理1"

    "条件2" -> "処理2"
    .
    .
    .
    //else文は必須
    else -> {
        "該当条件がない場合の処理"
    }
}

では実際に書いてみましょう。

//例1: 基本の書き方
var i = 1 

when(i){
    1 -> { // Hello とdudeが出力される
        println("Hello ")
        println("dude")
    }

    2 -> println("World")  

    else -> {
        println("fail")
    }
}

一般的なswitch文と違うところは、条件に定数以外、例えば関数を指定できること。 つまり、動的に条件を変更できるわけですね。

//例2: 条件に定数以外を指定
var i = 1 

when(i){
    1 -> println("One")

    //ランダムで2か3が返ってくる関数
    randomNumberTwoOrThree() -> println("Two or Three")  
    
    //4から10のレンジで指定
    in 4..10 -> println("Ranged 4 to 10")    
    
    //それ以外
    else -> {
        println("fail")
    }
}

関数を条件にするのは使えるかわからないけど、 4..10のようなレンジ指定は便利ですね。 大量に条件分岐を書かずに済みます。

ループ制御

基本は普通のループですが、Kotlin特有の機能が盛り込まれているようですね。 そこを吸収しつつやっていきましょう。

while文

言わずと知れた、コンディショナルループ。

//一般的なwhile文
while("条件"){
    "処理"
}

//do-while文
do{
    "処理"
} while ("条件")

では、実例をどうぞ(てきとう

// 基本のwhile文
var counter = 0

while (counter < 3){
    println(counter)
    counter++
}

//基本のdo-while
//違いとして、do内部が最低一度は実行される。
counter = 0
do {
    println(counter)
    counter++
} while (counter == 0)

for文

for文は基本は同じですね。
ただ、continueとbreakには少し不思議な仕様がありますね。

for("ループ数に関する処理"){
    "処理"
}

では実例でを見ていきましょう。

// 作成したarrayの要素分だけループする
for(x in arrayOf(1, 2, 3)){
    println(x) // 1 2 3と出力される
}

// 事前に作っておいた配列でループする。
for(i in 1..10){
    println(i) // 1から10まで順に出力される
}

では、件のbreakとcontinueの件ですが、 break@ラベル名やcontinue@ラベル名を指定することにより、 ラベル名の位置まで、スーパーマリオ並みのジャンプをかますことができます。 個人的にはあんまり使わないほうがいい気もしますが・・・ この仕様、C言語のgoto文を彷彿とさせるため、 処理を追っていくのが極端に大変になりそうな予感がします。

start@ for (i in 1..10){
    println("i=" + i)
    for(j in 1..10){
        if(y == 5){
            break@start
        }
        println("j=" + j)
    }
}
println("finish")

説明しずらいので、できれば実際に実行してみてください。 解釈としては、breakを通るとiのループネストでbreakした扱いになるので、 すぐにfinish!が出力されます。 試しに、breakをcontinueにするとまた違った出力結果になります。

まとめ

結構基本的、分岐とループ構文ですが、やはり言語的な特徴が出ていますね。 ただ、大きい意味での仕様は、一般的な構文と大差ないので、 そこまで気にする必要はないと思います。

参照

多くの情報は、この書籍を参考に記載しております。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング