覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - 関数の基礎

「Kotlinイン・アクション」 を読みながら写経してます。(Javaと比較しながら)

Kotlinイン・アクション

Kotlinイン・アクション

  • 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/10/31
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る


Kotlinにおける関数宣言

Kotlin で関数を宣言するには以下の構文で基本的に記述します。

fun <関数名>(<仮引数名>: <引数の型>): <戻り値の型> {
    <関数本体>
}

具体的な関数で記述すると以下のようになります。

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

引数や戻り値が無い場合は以下のようになります

fun hello() {
    println("Hello World!")
}


関数の宣言を見た場合に、Javaと比較して以下のような違いを見ることができます

  • 関数の宣言には fun というキーワードを付ける
  • 引数の型は、その引数名の後ろに宣言する(これは変数の宣言などでも同様)
  • 戻り値の型は、仮引数のリストの後ろにコロンで区切られて記述する
  • 関数はファイルのトップレベルに宣言することができる。クラスの中に置く必要はない
  • 行末のセミコロンは不要


関数をファイルのトップレベルに置くことができるので以下のような書き方をして実行することが可能です

package net.yyuki.sandbox

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

fun hello() {
    println("Hello World!")
}

fun main() {
    println(max(1, 2))

    hello()
}

実行結果

2
Hello World!


if は式

Kotlin では if は結果となる値を返す式となっていることが Java とは異なります。
上述のmax関数のif 式の内容は、Java では 三項演算子 で (a > b) ? a : b と書くことになります。

Kotlin では if は式であり、文ではありません。

  • 式は、別の式の一部として使用できる値を持つものです
  • 文は、常にブロックに囲まれたトップレベルの要素でそれ自身の値を持ちません

Kotlin では繰り返し文を除くほとんどの制御構造は式で成り立っています。

一方 Java では値の割り当ては式であるのに対して、Kotlin では文になります。
これにより、比較と割り当てのミスでの混乱というのを避けることができます。
例えば、Javaでは ifの条件で == と書きたい場所で誤って以下のように = と書いてしまうことが可能ですが、これはKotlinではコンパイルエラーとなります。

// 本当は flg == true と書きたかった
if (flg = true)


関数の簡略化

上述のmax関数は、関数の本体が1つの式で構成されており、このような場合は波括弧とreturn 文を省略して、その式を関数の本体として使用できます。(以下のように記述できます)

fun max(a: Int, b: Int): Int = if (a > b) a else b


さらに、戻り値の型を省略して以下のようにシンプルに記述することも可能です

fun max(a: Int, b: Int) = if (a > b) a else b

全ての変数と式には型があり、全ての関数には戻り値の型があります。
しかし、明示的に型を指定していなくても、式本体の関数についてはコンパイラが関数の本体として使われる式を解析して、その型を関数の戻り値の型として使用します。 このような型の解析は一般的に 型推論(type interface) と呼ばれます。

ただし、戻り値の型を省略できるのは式本体の関数に対してのみ許可されています。
値を返すブロック本体を持つ関数の場合、戻り値の型を指定してretrurn文を明示的に記述する必要があります。
関数は今回のような単純なものだけではなく、長い記述になるものもあり複数のreturn 文を含む場合もあります。
そのような場合に戻り値の型と明示的なreturn文が書かれる事で、その関数が何を返すのかをすぐに把握できます