Kotlinプログラミング

クリエイター・プログラマーを目指している人のためのメディアくりぷろメディア-クリエイター・プログラマーを目指している人のためのメディア

2021.10.19更新

【JavaとKotlinの違うところ】範囲を表すデータ型Rangeについて

【JavaとKotlinの違うところ】範囲を表すデータ型Rangeについて

Kotlinのデータ型には「範囲」を表すタイプが存在します。

例えば「年齢が0から20歳までであれば未成年、それ以外は成人である」という判断を行うプログラムを記述する場合、
「0から20」という範囲を表す変数として、次のような定義を行うことができます。

val minors:IntRange=0..20

IntRange型が「整数の範囲」を表すデータ型です。

そして、IntRange型の変数であるminorsに代入しているのは「0..20」です。

「0..20」は、「0から20の範囲」を表しています。

ではこのminorsを使って、成人かどうかを判断するプログラムを作成してみましょう。

範囲(IntRange)を使って判断するプログラム inを使う

では、次のプログラムを入力して確認してみましょう。

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}

結果は「たけしは未成年」とだけ表示されると思います。

まず、

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}

0から20の範囲を表すminorsを宣言しています。

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}

たけしの年齢としての変数takesiを用意し、20を代入しています。

けいこの年齢として、変数keikoに21を代入しています。

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}

takesiに代入されている20が0から20の範囲であれば、このifの条件はtrueになります。

takesiは20なので、0から20の範囲内であるため、trueとなり、

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}
println("たけしは未成年")

が実行されます。

keikoも同様に比較をしていますが、keikoは21が代入されているため、20までの範囲外となりますので、

fun main(){
    val minors:IntRange=0..20
    val takesi=20
    val keiko=21
    if(takesi in minors){
        println("たけしは未成年")
    }
    if(keiko in minors){
        println("けいこは未成年")
    }
}

は実行されません。

範囲外を判断する場合のプログラム !inを使う

次に「範囲外である」という判断を行う場合を考えます。

この場合は、「!in」を使えば可能です。

val minors:IntRange=0..20
val takesi=20
val keiko=21
if(takesi !in minors){
    println("たけしは成年")
}
if(keiko !in minors){
    println("けいこは成年")
}

このプログラムを実行した場合、「けいこは成年」と表示されます。

用意している変数は同じなのですが、

val minors:IntRange=0..20
val takesi=20
val keiko=21
if(takesi !in minors){
    println("たけしは成年")
}
if(keiko !in minors){
    println("けいこは成年")
}

で判断しているプログラムが先ほどの例と違います。

「!in」を使うことで、変数minorsの範囲外であるかを判断しています。

takesiには20が代入されているので、0..20の範囲内です。
なのでfalseとなり、

val minors:IntRange=0..20
val takesi=20
val keiko=21
if(takesi !in minors){
    println("たけしは成年")
}
if(keiko !in minors){
    println("けいこは成年")
}

は実行されません。

逆に、keikoには21が代入されているので、0..20の範囲外です。
なので、trueとなり、

val minors:IntRange=0..20
val takesi=20
val keiko=21
if(takesi !in minors){
    println("たけしは成年")
}
if(keiko !in minors){
    println("けいこは成年")
}

は実行されます。

整数値以外の範囲を表す変数型 LongRangeとCharRange

範囲を表すデータ型は、整数だけではありません。

Long型とChar型の範囲を表すデータ型が用意されています。

val range_l:LongRange=0..999999999L
val range_c1:CharRange='A'..'F'
val range_c2:CharRange='あ'..'お'

val result1 = 500 in range_l
val result2='B' in range_c1
val result3='う' in range_c2
println(result1)

println(result2)
println(result3)

このプログラムを実行した結果は、すべてtrueになります。

500は0から999999999の範囲内ですし、
「B」は「A」から「F」の範囲にありますし、
「う」は「あ」から「お」の範囲にあります。

なのですべてtrueです。

判断以外にも使える範囲

これまでご紹介した範囲を表すデータ型は、ifで条件分岐するだけではなく、forやwhenなどの構文で利用可能です。

val x=10
for(i in 1..5){
   println(x+i)
}

このプログラムを実行すると、
11
12
13
14
15
というように、10に1から5までの数字を足し算した結果が表示されます。

val x=10
for(i in 1..5){
   println(x+i)
}

の部分が、iを1から5まで増加させながら代入し、繰り返しの処理を行っているのです。

範囲を表すデータ型はとても便利です。
様々な場面で利用できるように、使いこなしていきましょう!