今回はKotlinの関数の基礎として、基本的な関数定義の方法、そしてその関数定義構文に何が記述されているのかを解剖しながら、関数定義に関する理解を深めていきたいと思います。
関数を定義する
最初に基本的な関数を定義してみましょう。
fun main() {
println(bless("半分","青い"))
}
private fun bless(input: String, name: String): String {
return "$input、$name"
}
//半分、青い
コード上部はmain関数、関数の呼び出しの結果を標準出力する処理が含まれます。
実行結果を除く下側の3行に注目してみましょう。こちらが基本的な関数定義の構文になります。
関数ヘッダを解剖する
可視性修飾子 fun 関数名(パラメータ): 戻り値の型{処理内容}
関数定義のうち、処理内容を含まない最初の1行を関数ヘッダと呼びます。ここからはその関数ヘッダに何が記述されているのか見ていきましょう。
可視性修飾子
まず「private」ですが、これは可視性修飾子。可視性修飾子には4種類あり、この関数がどこから呼び出せる(見える)のかを設定しています。
それぞれの修飾子の説明は次の通りです。
修飾子 | どこからアクセス可能か |
---|---|
public (デフォルト) | どこからでも |
private | そのファイル内のみ |
internal | 同じパッケージ内 |
protected | internal+サブクラス |
とりあえずpublicであれば他のファイルからでも呼び出せて、privateにすると同じファイル内からしか呼び出せないということだけ押さえておきましょう。
この可視性修飾子は省略可能。デフォルトではpublicです。この修飾子の記述を省略した場合、プログラム内のどこからでも呼び出せる関数になります。
fun 関数名
続いて「fun 関数名」です。この「fun」はキーワード。通常の関数定義であればこの「fun」が必要です。
関数名はある程度自由に決められますがキャメルケースで表記するのが一般的です。
小文字で始めて、単語が複数になる場合は2単語目以降の頭文字は大文字で表記しましょう。アンダースコアなどは使いません。
ちなみに他の記法もクラス宣言などでは使います。記法の名称は触れることが多いので、ここで軽くまとめておきましょう。他にもありますが、使用頻度が高めなのはこのあたりです。
名称 | 意味 | 記述 |
---|---|---|
コンスタントケース | 全て大文字。単語はアンダースコアでつなげる | GET_MARRIED |
キャメルケース | 最初は小文字、後の単語の最初は大文字 | getMarried |
アッパーキャメルケース (パスカルケース) | 単語の最初は大文字 | GetMarried |
スネークケース | 単語をアンダースコアでつなげる | get_married |
ケバブケース(チェインケース) | 単語をハイフンでつなげる | get-married |
キャメルは「ラクダ」の意味。ラクダのコブから来ている名前だと考えると、イメージしやすいですね。
パラメータ
次に来る(input :String, name: String)は関数のパラメータと呼びます。厳密に言えば「引数」ではありません。
ここに書いている「input」や「name」はあくまで仮の引数であって、プログラムの中で実際に渡されている引数は"半分"、"青い"という2つの文字列です。そのため「仮引数」とも呼ばれます。
ここもある程度自由に名前は決められます。表記は関数名と同様にキャメルケース、2つ以上ある場合はカンマ(,)でつなげましょう。
その仮の引数名の後には引数として渡される値の型を指定しています。変数や定数宣言では省略可能な型指定ですが、ここでは省略できないので注意です。
型指定はアッパーキャメルケース(パスカル記法)です。Javaに慣れている方、「int」ではありません。「Int」です。気を付けましょう。
戻り値の型
最後に戻り値の型を指定しています。関数の最後にreturnがあるのであればその値の型を、println()などで終わり、戻り値が無い場合は「Unit」を指定します。
Unitは「Unit」しか値が無い特別な型です。Javaで言えば「void」。こちらの方が馴染み深い方も多いと思います。
ただUnitは省略可能です。ここが省略されている場合、「この関数の戻り値は無い」と考えてかまいません。
関数定義の省略構文 – 単一式関数
上記が基本的な関数定義の構文ですが、よく使う省略構文もありますのでご紹介しておきます。
fun main() {
println(speech("ここから","お嫁にいけばいい"))
}
fun speech(x: String, y: String) = x+y
//ここからお嫁にいけばいい
処理的には文字列をつなげるという意味で最初のコードとあまり変わりありませんが、パラメータの後の「=」に注目してください。
このように処理が1つの式である場合、処理内容を収める{}は省略でき、パラメータと処理内容は=でつなぎます。さらに、戻り値の型が推論できる型であれば、戻り値の型を記述しなくてもOKです。
式が1つしか無い関数ということで単一式関数と呼ばれます。これもよく見る関数定義構文です。