【第38章】拡張関数について詳しく解説

【第38章】拡張関数について詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでの拡張関数を記述する方法を解説するピヨ!

この第38章では、プログラミング言語であるKotlinの拡張関数について、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlinの拡張関数について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】拡張関数とは?

拡張関数とは?

まずそもそも拡張関数とは何かについて勉強していきましょう。

拡張関数は、クラスの継承を行わずにそのクラスに関数を追加できる機能のことを言います。

例えばopenとついていないクラスは継承ができませんが、こういった場合に拡張関数を使うことで関数を追加する(ように見せる)ことができます。

チームでプログラミングをしている時、別のプログラマーが作ったクラスに新しい関数を独自に付け加えたいけどファイルを書き換えないでと言われることがあるかもしれませんが、こういった時に拡張関数は便利ですね。

リンコ
リンコ

拡張関数はあるクラスを継承することなく、そのクラスに関数を追加する機能ピヨ!

【Kotlin】拡張関数を使ってみよう

拡張関数を使ってみよう

拡張関数について理解してきたところで、実際に拡張関数の記述方法について学んでいきましょう。

拡張関数の書式

まず、拡張関数の書式は以下のようになります。

fun 拡張するクラス名.追加関数名(引数:型,..): 戻り値の型{処理}

このように拡張関数では、追加したい関数名の手前に「拡張するクラス名.」という風に記述します。

リンコ
リンコ

追加したい関数の名前の手前に「拡張したいクラス名.」と記述すると拡張関数が使えるピヨ!

実際に拡張関数を使ったコードを記述してみよう

では実際に拡張関数を使ったコードを記述して、勉強していきましょう。

サンプルコード

以下のサンプルコードでは、名前と年齢しかないRinkoクラスに「飛ぶ」という関数を追加しています。

fun main(){
    val rinko = Rinko(10)
    //拡張関数の呼び出しです。Rinkoクラスにfly関数が存在するかのように記述しています。
    rinko.fly()
}

class Rinko(val age: Int) {
    var name = "リンコ"
}
//以下が拡張関数です。Rinkoクラスにfly関数があるかのように追加しています。
fun Rinko.fly() {
    //拡張関数では、thisを経由してRinkoクラスのプロパティを参照しています。
    println("${this.name}です、${this.age}歳ピヨ!")
}

出力

サンプルコードを実行すると、以下のように出力されます。

リンコです、10歳ピヨ!

このコードでは、リンコという値が入ったnameプロパティのみを持つRinkoクラスが定義されています。

class Rinko(val age: Int) {
    var name = "リンコ"
}

そのRinkoクラスに拡張関数を使って、fly関数を追加しています。この時「this」という文言がありますが、これは拡張するクラスのプロパティを指すので、今回の場合はRinkoクラスのことを指しています

fun Rinko.fly() {
    println("${this.name}です、${this.age}歳ピヨ!")
}

そしてmain関数で、Rinkoクラスを使ってインスタンスを生成し、拡張関数の呼び出しであたかもRinkoクラスにfly関数が存在するかのように記述しています。

fun main(){
    val rinko = Rinko(10)
    rinko.fly()
}
リンコ
リンコ

拡張関数を使っている時はthisを経由してプロパティを参照するピヨ!

【Kotlin】「private」として定義されているものには拡張関数を使えない

「private」として定義されているものには拡張関数を使えない

このようにopenがついていない継承不可のクラスにも関わらず、fly関数を追加することができました。

ただし、クラスやプロパティが「private」として定義されている場合は、追加ができないので注意しましょう。

クラスがprivateとして定義されている場合

まずはクラスがprivateとして定義されている場合を確認してみましょう。

サンプルコード

以下のサンプルコードでは、先程のコードのRinkoクラスに「private」を付けています。

fun main(){
    val rinko = Rinko(10)

    rinko.fly()
}

private class Rinko(val age: Int) {
    var name = "リンコ"
}

fun Rinko.fly() {

    println("${this.name}です、${this.age}歳ピヨ!")
}

出力

サンプルコードを実行すると、以下のように出力されます。

'public' member exposes its 'private' receiver type Rinko

このように、Rinkoクラスがprivateとして定義されているため、エラーが出てしまいました。

プロパティがprivateとして定義されている場合

続いて、プロパティがprivateとして定義されている場合を確認してみましょう。

サンプルコード

以下のサンプルコードでは、先程のコードのRinkoクラスのnameプロパティにprivateを付けています。

fun main(){
    val rinko = Rinko(10)

    rinko.fly()
}

class Rinko(val age: Int) {
   private var name = "リンコ"
}

fun Rinko.fly() {

    println("${this.name}です、${this.age}歳ピヨ!")
}

出力

サンプルコードを実行すると、以下のように出力されます。

Cannot access 'name': it is private in 'Rinko'

プロパティでもprivateをつけるとエラーが出てしまいましたね。

このように拡張関数では、privateで定義されているものに対しては使えないので注意しましょう。

リンコ
リンコ

privateとして定義されている場合は拡張関数が使えないので注意ピヨ!

まとめ

まとめ

この記事では、プログラミング言語であるKotlinの拡張関数について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • 拡張関数はクラスを継承することなく、関数を追加する(ように見せる)機能
  • 追加したい関数の名前の手前に「拡張するクラス名.」と記述する
  • 「this」は拡張するクラスのオブジェクトを表している
  • 「private」として定義されたクラスやプロパティに拡張関数は使えない

今回勉強した「拡張関数」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「パッケージ」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました