KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

関数

関数の基本的な使い方

Kotlinでは、「fun」キーワードで関数を宣言します。


fun 関数名(引数1: 引数1の型, 引数2: 引数2の型): 戻り値の型 {
    // 処理
    return 戻り値
}

引数や戻り値は、それらがなければ省略することができます。


fun 関数名() {
    // 処理
}

また、戻り値がないことは「Unit」を使って明示することもできます。

fun 関数名(): Unit { // 処理 }

それでは、サンプルプログラムを見てみましょう。


fun main(args: Array) {
    println("${plus(10, 20)}")
    printDouble(100)
    printHalf(23)
}

fun plus(a: Int, b: Int): Int {
    return a + b
}

fun printDouble(a: Int) {
    println("Double: ${a * 2}")
}

fun printHalf(a: Int): Unit {
    println("Half: ${a.toDouble() / 2.0}")
}

30
Double: 200
Half: 11.5

デフォルト引数

関数の引数にはデフォルトの値を設定できます。
デフォルト引数は、関数を呼び出すときに別の値を渡す必要がなければ省略できます。


fun main(args: Array) {
    println("${plus(5)}")
}
    
fun plus(a: Int, b: Int = 10): Int {
    return a + b
}

15

デフォルト引数は、デフォルトの値を持たない引数の前にあっても問題ありません。
ただし、関数を呼び出すときに、引数名をつけて値を渡す必要があります。


fun main(args: Array) {
    println("${plus(b = 30)}")
}

fun plus(a: Int = 5, b: Int): Int {
    return a + b
}

35

名前付き引数

上記のデフォルト引数のところでも紹介しましたが、関数を呼び出すときに、 引数名を指定して値を渡すことで、特定の引数だけに値を渡すことができます。
たくさんあるデフォルト引数のうちの一部だけ別の値を指定したい時などに便利です。


fun main(args: Array) {
    plus(isPrint = true)
}

fun plus(a: Double = 1.0, b: Double = 1.0, isPrint: Boolean = false): Double {
    val result = a + b

    if (isPrint) {
        println("a = ${a}, b = ${b}, a * b = ${result}")
    }

    return result
}

a = 1.0, b = 1.0, a * b = 2.0

式が一つだけの関数

関数にしたい式が一つだけの場合、{}やreturn記述を省略する子ができます。


fun main(args: Array) {
    println("${plus(10.0, 5.0)}")
}

fun plus(a: Double, b: Double): Double = a + b

15.0

可変長引数

vararg修飾子を引数につけることで、可変個の引数を関数に渡すことができます。
可変長引数は、関数の中では配列になります。


fun main(args: Array) {
    println("${plus(10.1, 20.2, 30.3, 40.4)}")
}

fun plus(vararg args: Double): Double {
    var sum = 0.0

    for (elem in args) {
        sum += elem
    }

    return sum
}

101.0

Infix

Infixと呼ばれる表記を関数にすることで、関数を2項演算子のように使うことができます。
引数を一つ持つことと、クラスのメンバ関数かエクステンションであることが条件です。


fun main(args: Array) {
    val result = 12 append 345

    println(result)

    // 普通に関数として呼び出すこともできます
    val result2 = 12.append(345)

    println(result2)
}

// Intに拡張関数を作る
infix fun Int.append(x: Int): Int {
    val origin = toString()
    val arg = x.toString()

    val appended = origin + arg

    return appended.toInt()
}

12345
12345