【第37章】ネストクラスについて詳しく解説

【第37章】ネストクラスについて詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのネストクラスを記述する方法を解説するピヨ!

この第37章では、プログラミング言語であるKotlinのネストクラスについて、一緒に勉強していきましょう。

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

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

スポンサーリンク

【Kotlin】ネストクラスとは?

ネストクラスとは?

ではネストクラスについて勉強していきましょう。Kotlinのネストクラスとはどういったものなんでしょうか?

クラスの中にクラスを定義

Kotlinでは、クラスの中にクラスを定義することができ、これをネストクラスと言います。

ネストクラスは、入れ子のクラスとも呼びます。

特定のクラスからしか呼ばれないクラスがある時に便利

例えば2つのクラス「a」と「b」があり、クラスaはクラスbからしか呼ばれなかったりクラスaがクラスbに依存している場合があります。

こうなるとクラスaはクラスb以外からのアクセスをできないようにするのが仕様上いいかと思いますが、こういった時にネストクラスを使うことで可能となります。

リンコ
リンコ

ネストクラスはクラスの中にクラスを定義することピヨ!

【Kotlin】ネストクラスのコードを記述してみよう

ネストクラスのコードを記述してみよう

ネストクラスについて少し理解したところで、実際にコードを記述していってみましょう。

ネストクラスの書式

ネストクラスの書式は以下のようになります。

class 外側のクラス名{
    private class 内側のクラス名 {
    
    }
    
}

ネストクラスで外側のクラスからしかアクセスできないようなコードを記述したい時は、このように内側のクラス定義の先頭に「private」という修飾子を付けます。
※ネストクラス自体は入れ子のクラスのことを言います

実際にネストクラスのコードを記述してみよう

では実際に、ネストクラスを使ったコードを記述していきましょう。

サンプルコード

以下のサンプルコードでは、クラスBの中にクラスAを定義しているネストクラスです。

fun main(){
    val b = B()
    b.direction()
}

class B {
    private class A {
        fun greet() {
            println("aはbのネストクラスです")
        }
    }
    
    fun direction() {
        val a = A()
        a.greet()
    }
}

出力

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

aはbのネストクラスです

このコードでは、クラスBの中にprivate修飾子をつけたクラスAを入れ、クラスAにはクラスBからしかアクセスできないようにネストクラスにしています。

class B {
    private class A {
        fun greet() {
            println("aはbのネストクラスです")
        }
    }

「direction」はクラスBの関数です。このクラスBのdirection関数で、クラスAをインスタンス化してクラスAのgreet関数を呼び出していることがわかります。

    fun direction() {
        val a = A()
        a.greet()
    }

そしてmain関数で、アウタークラスのクラスBをインスタンス化し、direction関数を呼び出して全体を動かしていることがわかります。

fun main(){
    val b = B()
    b.direction()
}

また、この入れ子になっている2つのクラスの内、外側のクラスのことを「アウタークラス」と呼びます。

リンコ
リンコ

内側のクラスの先頭にprivate修飾子をつけるとアウタークラス以外からアクセスできなくなるピヨ!

【Kotlin】内側から外側のクラスにアクセスするには?

内側から外側のクラスにアクセスするには?

ここまででネストクラスの基本は勉強できました。

しかしprivate修飾子を使うと、アウタークラスから内側のクラスにアクセスし他からアクセスできませんが、内側のクラスからアウタークラスにもアクセスができなくなります。

内側のクラスからアウタークラスにアクセスしたい場合は、「inner」という修飾子を使ってインナークラスとして内側のクラスを定義します。

インナークラスの書式

ネストクラスでインナークラスを使う場合は、以下のような書式になります。

class 外側のクラス名{
    inner class 内側のクラス名 {
    
    }
    
}

先程、privateだった箇所をinnerにする感じですね。

実際にインナークラスを使ったコードを記述してみよう

では実際に、インナークラスを使ったネストクラスのコードを記述していきましょう。

サンプルコード

以下のサンプルコードでは、インナークラスのインスタンスを生成し、インナークラスからアウタークラスを呼び出しています。

fun main(){
    val a = B().A()
    a.printA()
}

class B {
    inner class A {
        fun printA() {
            println("クラスAの関数が動いています")
            val b = B()
            b.printB()
        }
    }
    
    fun printB() {
        println("クラスBの関数が動いています")
    }
}

出力

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

クラスAの関数が動いています
クラスBの関数が動いています

このコードではまず、main関数でインナークラスのクラスAのインスタンスを生成します。

インナークラスAのインスタンスを生成する際にアウタークラスのB()と付いていますが、これはアウタークラスのコンストラクタです。

インナークラスのインスタンスは、アウタークラスのインスタンス経由でしか生成できないことに注意しましょう。

インスタンス生成後、インスタンスaのprintA関数を呼び出します。

fun main(){
    val a = B().A()
    a.printA()
}

内側のクラスAは、inner修飾子がついてインナークラスになっています。

    inner class A {

インナークラスのprintA関数が動き、文字列を出力した後、アウタークラスのクラスBのインスタンスを生成してprintB関数を呼び出し、インナークラスからアウタークラスにアクセスしています。

        fun printA() {
            println("クラスAの関数が動いています")
            val b = B()
            b.printB()
        }
    }

そしてprintB関数が動き、文字列が出力されるようになります。

    fun printB() {
        println("クラスBの関数が動いています")

このように、内側のクラスから外側のクラスにアクセスするにはinner修飾子を使うようにします。

リンコ
リンコ

内側からアウタークラスにアクセスするには、inner修飾子を使うピヨ!

まとめ

まとめ

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

  • クラスの中にクラスを定義することをネストクラスと言う
  • 内側のクラスに「private」をつけることで他からアクセスできなくなる
  • 入れ子のクラスの外側のクラスをアウタークラスと言う
  • 内側から外側のクラスにもアクセスしたい場合は「inner」をつける
  • インナークラスのインスタンスは、アウタークラスのインスタンス経由でしか生成できない

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

リンコ
リンコ

次回の記事では「拡張関数」について勉強していくピヨ!

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

コメント

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