#20 Kotlinで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Kotlinの関数、もう基本は書けるようになってきたでしょうか。今回はもう一歩進んで、関数をより便利に使うための2つのテクニック「デフォルト引数」と「可変長引数」を紹介します。どちらもコードをシンプルに保つための機能で、Kotlinらしさが感じられる部分でもあります。少しずつ確認していきましょう。

デフォルト引数とは

関数を呼び出すとき、いつも「毎回同じ値を渡しているな」と感じる引数(関数に渡す値のこと)はありませんか。そんなときに便利なのが「デフォルト引数」です。これは、引数に「もし呼び出し側が値を指定しなかったら、この値を使う」というあらかじめ決まった初期値を設定できる機能です。

基本の書き方

例えば、挨拶のメッセージを作る関数を考えてみましょう。

fun greet(name: String, greeting: String = "こんにちは") {
    println("$greeting、$name さん")
}

greet("田中")              // こんにちは、田中 さん
greet("鈴木", "おはよう")  // おはよう、鈴木 さん

引数の後ろに = 値 と書くだけで、デフォルト値を設定できます。greetingを省略すれば自動的に「こんにちは」が使われ、指定すればその値が優先されます。JavaやC言語のように、同じ処理を複数のパターンで用意する「オーバーロード」(同名の関数を引数の数や型違いで複数定義すること)を書く必要がありません。この手軽さも、Kotlinの大きなメリットです。

名前付き引数と組み合わせる

デフォルト引数を持つ関数が増えてくると、「後ろの引数だけ指定したい」という場面が出てきます。そんなときは「名前付き引数」を使いましょう。これは、引数名を明示して値を渡す書き方です。

fun greet(name: String, greeting: String = "こんにちは", punctuation: String = "!") {
    println("$greeting、$name さん$punctuation")
}

greet(name = "佐藤", punctuation = "。")

途中のgreetingを飛ばしてpunctuationだけ指定できました。引数の順番を気にせず、必要なものだけを明示的に渡せるので、コードの意図がとても読み取りやすくなります。

可変長引数とは

次は「可変長引数」です。これは、関数を呼び出すときに渡す引数の「個数」を自由に変えられる仕組みです。「合計を計算したいけど、数値が2個の時も5個の時もある」といった場面で活躍します。

vararg キーワードを使う

Kotlinでは、引数の型の前にvarargというキーワードを付けることで可変長引数を宣言できます。

fun sum(vararg numbers: Int): Int {
    var total = 0
    for (n in numbers) {
        total += n
    }
    return total
}

println(sum(1, 2, 3))       // 6
println(sum(10, 20, 30, 40)) // 100

関数の中では、numbersは配列(値を順番に並べて格納するデータの入れ物)のように扱えます。呼び出す側は、カンマ区切りでいくつでも値を渡せるというわけです。JavaScriptなどにも似た機能はありますが、Kotlinでは型(数値なのか文字列なのかといった値の種類)がきちんと決まっています。そのため、間違った型を渡すとコンパイル時に(実行前の段階で)エラーとして教えてくれる点が安心です。

配列を展開して渡す

すでに配列やリストにまとまっているデータを可変長引数の関数に渡したいこともありますよね。そんなときは、配列の前に*(スプレッド演算子)を付けます。

val numbers = intArrayOf(5, 15, 25)
println(sum(*numbers)) // 45

この*を忘れると「配列そのものを1つの引数として渡そうとしている」とみなされ、エラーになってしまいます。最初はうっかり忘れがちなので、気をつけましょう。

デフォルト引数と可変長引数を組み合わせるときの注意

この2つの機能は同じ関数の中で併用することもできますが、可変長引数は基本的に引数リストの最後に置くのがルールです。もし可変長引数の後ろに別の引数を置きたい場合は、名前付き引数を使って明示的に指定する必要があります。エラーが出て戸惑ったときは、まず引数の並び順を疑ってみてください。

まとめ

今回は、Kotlinの関数をより柔軟に使うための「デフォルト引数」と「可変長引数」を紹介しました。デフォルト引数は同じ処理を何度も書かずに済ませてくれる機能、可変長引数は引数の数を自由にできる機能でしたね。どちらも、他の言語では少し回りくどく書く必要がある処理を、Kotlinではすっきり書けるようにしてくれる便利な仕組みです。基本の関数の書き方に慣れてきたら、ぜひ実際のコードに取り入れてみてください。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

Kotlinをもっと学びたい方には「やさしいKotlin入門」がおすすめです。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本