💭

Nested Class vs Inner Class

に公開

自分の技術メモをAIで記事化しているため、一部間違いがある可能性があります。ご了承ください。

✨ Nested ClassとInner Classとは?

Kotlinには「Nested Class」と「Inner Class」という2種類のクラススコープを制御する機能が用意されています。それぞれの目的や使い方、制約について見ていきましょう。

🔒 Nested Class

Nested Classは、親クラスに一切アクセスできない静的なクラスです。主にクラスの名前空間を整理するために使われます。

📝 制約

  • 親クラスには一切アクセスできない

🎯 目的

  • 論理的に意味のある階層構造を作ってクラスの名前空間を管理したい

💡 活用例

  • DTO(Data Transfer Object)
  • 定数
  • Enum(列挙型)

🖥️ サンプルコード

class Button {

    // Nested(static)クラス
    class Style(
        val backgroundColor: String,
        val textColor: String
    )

    // Button 自体のプロパティ
    var text: String = "Click me!"

    // Button に適用するスタイルを外から受け取る
    fun applyStyle(style: Style) {
        println("Apply: bg=${style.backgroundColor}, text=${style.textColor}")
    }
}

fun main() {
    // Outer インスタンスとは独立して Style を生成できる
    val darkStyle = Button.Style("#333", "#FFF")

    val button = Button()
    button.applyStyle(darkStyle)
}


🔗 Inner Class

Inner Classは、親クラスの関数やフィールドにアクセス可能なクラスです。親クラスのインスタンスに依存するロジックを実装する際に便利です。

📝 制約

  • 親クラスの関数やフィールドにアクセス可能

🎯 目的

  • あるクラスの中で、外側インスタンスに依存するロジックの塊をスコープを区切りながら実装することができる

💡 活用例

  • Androidのイベントリスナで利用

🖥️ サンプルコード

class Playlist(private val name: String) {

    private val songs = mutableListOf<String>()

    // inner にすると this@Playlist にアクセスできる
    inner class Editor {
        fun addSong(song: String) {
            songs += song            // 外側のフィールドに直接アクセス
            println("Added to $name: $song")
        }
    }

    fun showSongs() = println("$name$songs")
}

fun main() {
    val playlist = Playlist("Morning Chill")

    // Editor は playlist インスタンスにひも付く
    val editor = playlist.Editor()
    editor.addSong("Lofi Beat")
    editor.addSong("Lo-Fi Study")

    playlist.showSongs()           // => Morning Chill → [Lofi Beat, Lo-Fi Study]
}


🔗 Nested ClassとInner Classの違いを比較

特徴 Nested Class Inner Class
親クラスへのアクセス 不可 可能
主な目的 名前空間の整理 親クラスに依存するロジックの実装
活用例 DTO、定数、Enum Androidイベントリスナ、親子関係のロジック

📚 参考リンク

Kotlin公式ブログや技術記事を参考にして、さらに理解を深めましょう。

Discussion