前回の振り返り
前回(Day03)では、以下のことを学んだ。
- for文による範囲の繰り返し
- while文による条件付き繰り返し
- FizzBuzzによる実践
今回は、処理をひとまとまりにして再利用できる「関数」について学んでいく。関数を使いこなせるようになると、コードの重複が減り、読みやすさもぐっと上がる。
今回学ぶこと
- 関数の定義と呼び出し
- パラメータと戻り値
- 単一式関数
- デフォルト引数・名前付き引数
関数を定義してみよう
Kotlinの関数はfunキーワードで定義する。
fun greet(name: String) {
println("こんにちは、${name}さん!")
}
呼び出すときは、他の言語と同じように関数名にカッコを付ける。
greet("太郎")
戻り値のある関数
処理の結果を呼び出し元に返したい場合は、戻り値の型を: 型の形で指定し、returnで値を返す。
fun add(a: Int, b: Int): Int {
return a + b
}
val sum = add(10, 5)
println("10 + 5 = $sum")
単一式関数でシンプルに書く
処理が1行で済む場合は、波カッコとreturnを省略して=でつなぐ「単一式関数」が使える。
fun multiply(a: Int, b: Int) = a * b
addとmultiplyはどちらも同じような足し算・掛け算だが、単一式関数の方がすっきり書けることが分かるだろう。
デフォルト引数と名前付き引数
Kotlinの関数は、引数にあらかじめ既定値を設定できる。呼び出し側で値を省略すると、その既定値が使われる。
fun introduce(name: String, age: Int = 20, city: String = "東京") {
println("名前: $name, 年齢: ${age}歳, 出身: $city")
}
💡 ここで
$age歳ではなく${age}歳と波カッコで囲んでいる点に注意しよう。
Kotlinの文字列テンプレートは日本語の文字も識別子の一部として扱えるため、$age歳と書くと「age歳」という一つの変数名として解釈されてしまい、Unresolved reference 'age歳'というコンパイルエラーになる。
変数の直後に日本語などを続ける場合は、必ず${変数名}のように波カッコで囲むこと。
introduce("花子") // 年齢・出身は既定値
introduce("一郎", 25) // 出身のみ既定値
introduce("次郎", 30, "大阪") // すべて指定引数の数が多い関数を呼ぶときは、名前付き引数を使うと可読性が上がる。
introduce(name = "三郎", city = "福岡")実践課題:自己紹介関数を作る
あらかじめsrc/main/kotlin/com/learning/フォルダの中にDay04Functions.ktという名前でファイルを作成しておこう。左側のファイルツリーでcom.learningフォルダを右クリックし、「New File」からファイル名を入力すれば作成できる。
ファイルを作成したら、それをクリックすると中央にエディタが開く。そこに以下のコードを直接書き込んでもよいし、この記事のコードをコピー&ペーストしても構わない。あるいは、筆者のリポジトリからダウンロードしたDay04Functions.ktをそのままファイルツリーにドラッグ&ドロップしてアップロードする方法でもよい。
実行するファイルを切り替えよう
このプロジェクトでは複数のレッスン日のコードが同じsrc/main/kotlin/com/learning/フォルダに入っているため、実行したいファイルをbuild.gradle.ktsのmainClassで指定する必要がある。
application {
mainClass.set("com.learning.Day04FunctionsKt") // 実行したいファイル名に変更
}ファイル名の規則は「ファイル名そのまま+Kt」である。
Day01Variables.kt→Day01VariablesKtDay02Conditionals.kt→Day02ConditionalsKtDay03Loops.kt→Day03LoopsKt- Day04Functions
.kt→Day04FunctionsKt
変更後、保存してから以下のコマンドで実行しよう。
./gradlew run// src/main/kotlin/com/learning/Day04Functions.kt
package com.learning
// 課題1: 基本的な関数
fun greet(name: String) {
println("こんにちは、${name}さん!")
}
// 課題2: 戻り値のある関数
fun add(a: Int, b: Int): Int {
return a + b
}
// 課題3: 単一式関数
fun multiply(a: Int, b: Int) = a * b
// 課題4: デフォルト引数
fun introduce(name: String, age: Int = 20, city: String = "東京") {
println("名前: $name, 年齢: ${age}歳, 出身: $city")
}
fun main() {
println("=== Day 4: 関数の基礎 ===\n")
// 関数の呼び出し
greet("太郎")
// 戻り値の利用
val sum = add(10, 5)
println("10 + 5 = $sum")
val product = multiply(4, 3)
println("4 × 3 = $product")
// デフォルト引数
introduce("花子")
introduce("一郎", 25)
introduce("次郎", 30, "大阪")
}
実行例
> Task :run
=== Day 4: 関数の基礎 ===
こんにちは、太郎さん!
10 + 5 = 15
4 × 3 = 12
名前: 花子, 年齢: 20歳, 出身: 東京
名前: 一郎, 年齢: 25歳, 出身: 東京
名前: 次郎, 年齢: 30歳, 出身: 大阪まとめ
今回は以下のことを学んだ。
- 関数の定義と呼び出し
- 戻り値のある関数
- 単一式関数によるシンプルな書き方
- デフォルト引数・名前付き引数
Day03(ループ処理)と今回のDay04(関数)の2回で、繰り返し処理と処理のまとめ方をひと通り押さえたことになる。ここで一旦区切りとし、次回以降はコレクション(List・Set・Map)やNull安全性、クラスといった、より実践的な内容に入っていく予定である。


コメント