こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのクロージャを記述する方法を解説するピヨ!
この第34章では、プログラミング言語であるKotlinのクロージャについて、一緒に勉強していきましょう。
この記事を読めばプログラミング未経験の方も、Kotlinのクロージャについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。
※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。
【Kotlin】クロージャとは?
まずはクロージャがどういう機能なのかというところから勉強していきましょう。
子関数から親関数の変数を参照
クロージャは、子関数から親関数の変数へアクセスすることを言います。
子関数から親関数の変数を参照することで、値をキープすることができます。
値を関数オブジェクトの中に保管しつづける
上記で説明しているように、ローカル変数に値をずっと保管しておくことができます。
本来、関数にあるローカル変数の寿命はその関数内で、その関数の処理が終わればローカル変数の値は破棄されます。
ですがクロージャの機能を使うことで、子関数から参照される可能性がある親関数のローカル変数は破棄できなくなります。
クロージャは子関数から親関数の変数へアクセスすることで、値をずっと保管できることピヨ!
【Kotlin】クロージャを記述してみよう
クロージャがどういうものか簡単に勉強したところで、実際にクロージャを使ったコードを記述していきましょう。
サンプルコード
以下のサンプルコードでは、関数の呼び出しごとに値が増えるようにしています。
fun main() { //関数を変数保持 val value = count() value() value() } // count()内で宣言した変数 counterの値を+1する「関数オブジェクト(クロージャ)」を返す。 // 親関数 fun count(): () -> Unit { var counter = 0 // ラムダ式の子関数(匿名関数) return { counter++ println(counter) } }
出力
サンプルコードを実行すると、以下のように出力されます。
1 2
このコードではvalueを2回呼び出していますが、結果は「1,1」ではなく「1,2」と値が増えていきました。
通常の関数であれば、関数の処理が終われば変数の値が破棄されるので結果は「1,1」となりますが、この場合は子関数が親関数countの持っているcounterという変数を参照しているため、プログラムが終了するまで参照して保持し続けることができます。
出力結果が、両方1ではなく1と2になったピヨ!
【Kotlin】独立した複数のクロージャを生成してみる
クロージャをを使用する際、複数のクロージャを生成することもできます。
早速コードを見てみましょう。
サンプルコード
以下のサンプルコードでは上記のコードを少し変更して、関数オブジェクトを変数に代入する際に変数名を2種類設定していますが、こうするとどのように出力されるでしょうか?
fun main() { //1つ目のクロージャ val value1 = count() //2つ目のクロージャ val value2 = count() println("1つ目のvalue1の値:" + value1()) println("1つ目のvalue1の値:" + value1()) println("2つ目のvalue2の値:" + value2()) println("2つ目のvalue2の値:" + value2()) println("1つ目のvalue1の値:" + value1()) } fun count(): () -> Int { var counter = 1 return { counter++ } }
出力
サンプルコードを実行すると、以下のように出力されます。
1つ目のvalue1の値:1 1つ目のvalue1の値:2 2つ目のvalue2の値:1 2つ目のvalue2の値:2 1つ目のvalue1の値:3
このコードでは、1つの関数オブジェクトから2種類の変数にそれぞれ代入しprintlnで複数回、値を出力されるようにしました。
するとvalue1とvalue2で別々に値が更新されるようになりました。これによりわかることは、value1とvalue2のそれぞれで独立した変数counterが存在するということです。
つまりvalue1が呼び出された時には、その中に保管されている変数counterの値がインクリメントされますが、その間value2の中に保管されている変数counterには全く影響を受けません。
このようにvalue1とvalue2が互いに独立して、それぞれのcounterという変数を保持していることがわかります。
複数のクロージャがお互い独立して変数を保持しているピヨ!
まとめ
この記事では、プログラミング言語であるKotlinのクロージャについて勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。
- 子関数から親関数の変数へアクセスすることをクロージャという
- クロージャを使うことでローカル変数にずっと値を保管できる
- 独立した複数のクロージャも生成できる
今回勉強した「クロージャ」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。
次回の記事では「ジェネリクス」について勉強していくピヨ!
プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!
コメント