カテゴリ: Kotlin 更新日: 2026/01/16

Kotlinのネストクラス・内部クラス・匿名クラスの使い方を初心者向けにわかりやすく解説!

Kotlinのネストクラス・内部クラス・匿名クラスの使い方
Kotlinのネストクラス・内部クラス・匿名クラスの使い方

先生と生徒の会話形式で理解しよう

生徒

「Kotlinでクラスの中に別のクラスを書くことができるって聞いたんですが、ネストクラスとか内部クラスって何が違うんですか?」

先生

「とても良いポイントですね。ネストクラス、内部クラス、匿名クラスは、それぞれ使い方が違います。順番に、初心者の方にも分かりやすく解説しますよ。」

生徒

「ありがとうございます!コードも見ながら理解したいです。」

先生

「それでは、ネストクラスから順番に学んでいきましょう。」

1. ネストクラス(Nested Class)とは?

1. ネストクラス(Nested Class)とは?
1. ネストクラス(Nested Class)とは?

Kotlinのネストクラス(nested class)とは、クラスの中にさらに別のクラスを入れられる仕組みです。ポイントは、ネストクラスは外側のクラスに自動ではアクセスできないということです。同じファイルに置ける関連コードを1つにまとめたい時に便利です。

イメージしやすい例として、「会社」の中に「部署」がある形を考えてみましょう。部署は会社の一部ですが、部署単体でも動けるイメージです。


class Company {
    // ネストクラス
    class Department {
        fun detail() {
            println("部署クラスが動いています")
        }
    }
}

fun main() {
    // ネストクラスは外側のクラスを作らなくても呼び出せる
    val d = Company.Department()
    d.detail()
}

部署クラスが動いています

このように、Company.Department()のように直接呼び出せるのが特徴です。外側の値に自動アクセスしないため、独立した小さなクラスとして扱いやすく、プログラムの見通しも良くなります。

2. 内部クラス(Inner Class)とは?

2. 内部クラス(Inner Class)とは?
2. 内部クラス(Inner Class)とは?

次に紹介するのが内部クラス(inner class)です。ネストクラスと見た目は似ていますが、違いは外側のクラスにアクセスできることです。

Kotlinでは、innerというキーワードを使って定義します。


class Outer {
    private val outerMessage = "これは外側のメッセージです"

    inner class Inner {
        fun printMessage() {
            println(outerMessage)
        }
    }
}

fun main() {
    val inner = Outer().Inner()
    inner.printMessage()
}

これは外側のメッセージです

このように、innerクラスでは外側のOuterクラスの変数にアクセスできます。

3. 匿名クラス(Anonymous Class)とは?

3. 匿名クラス(Anonymous Class)とは?
3. 匿名クラス(Anonymous Class)とは?

次は少し特殊な匿名クラスです。これは名前のないクラスで、あるインターフェースや抽象クラスをその場で実装するときに使います。

一度しか使わないような処理に便利です。


interface ClickListener {
    fun onClick()
}

fun main() {
    val listener = object : ClickListener {
        override fun onClick() {
            println("ボタンがクリックされました")
        }
    }

    listener.onClick()
}

ボタンがクリックされました

このようにobject : インターフェース名と書いて、その場でクラスを作っています。

Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。

基礎からわかるKotlinをAmazonで見る

※ Amazon広告リンク

4. ネストクラス・内部クラス・匿名クラスの違いまとめ

4. ネストクラス・内部クラス・匿名クラスの違いまとめ
4. ネストクラス・内部クラス・匿名クラスの違いまとめ

3つのクラスを簡単に比較してみましょう。

種類 外部クラスにアクセス 使い方
ネストクラス できない 構造を整理したいとき
内部クラス できる 外の変数や関数を使いたいとき
匿名クラス ケースによる 1回限りの簡易クラス

このように、それぞれのクラスには役割と使い道の違いがあります。場面に応じて使い分けるのがポイントです。

5. Kotlinでの活用シーンをイメージしてみよう

5. Kotlinでの活用シーンをイメージしてみよう
5. Kotlinでの活用シーンをイメージしてみよう

Kotlinのクラス構造を整理するために、これらのクラスはとても役立ちます。以下のようなシーンが考えられます:

  • ネストクラス:関連の深いクラスを一つにまとめたい(例:図形とサイズ)
  • 内部クラス:親クラスの状態と密接に関係する(例:アプリの設定と項目)
  • 匿名クラス:一時的なイベント処理(例:クリックイベントやボタン処理)

プログラミング初心者でも、「入れ子構造」や「一度だけ使う小さな仕組み」として理解すれば、使いやすくなります。

まとめ

まとめ
まとめ

Kotlinにおけるネストクラス・内部クラス・匿名クラスの違いと使い分け方を学ぶことで、クラス構造の理解がぐっと深まりました。クラスの中にさらにクラスを定義するという発想は最初は難しく感じるかもしれませんが、実際には「関係のある情報をまとめるための整理術」として非常に実用的です。

まずネストクラスは、外側のクラスに依存せずに使えるため、処理をきれいに分けて再利用性を高めたいときに便利です。データ構造を整理する場面やユーティリティ的なクラスに向いています。一方で、外部のプロパティや関数にアクセスできないため、独立性の高いロジックに限られます。

続いて内部クラス(inner class)は、外側のクラスの状態やプロパティにアクセスできるという特徴があり、密接に関連する機能を分けたいときに使います。特に外部のデータに依存する操作を整理するとき、内部クラスを活用することで見通しのよいコード設計ができます。たとえば、アプリケーションの設定を管理する構造や、外側のデータと強く連動する処理を切り出す場面で効果を発揮します。


// 外側と連携する内部クラスの例
class User(private val name: String) {
    inner class Profile {
        fun showName() {
            println("ユーザー名は $name です")
        }
    }
}

fun main() {
    val profile = User("さくら").Profile()
    profile.showName()
}

最後に紹介した匿名クラスは、ボタンのクリック処理や一度限りのカスタム処理など、簡単な処理をその場で書きたいときにとても便利です。Kotlinではobject : インターフェースという書き方で即席のクラスを定義できるため、冗長なクラス名を省略しつつ機能的な記述が可能になります。特にイベントリスナーや一時的な処理において活躍するでしょう。

Kotlinのこのようなクラス設計機能を理解することで、複雑なコードも読みやすく保ちつつ、再利用性・保守性の高いプログラムを書けるようになります。それぞれのクラスの役割を整理しながら実践を積み重ねることで、自然と効果的な使い分けができるようになります。

先生と生徒の振り返り会話

生徒

「ネストクラス、内部クラス、匿名クラスって、見た目は似てるけど使い方が全然違うんですね!」

先生

「その通りです。ネストクラスは独立性重視、内部クラスは外部との連携、匿名クラスは一時的な使い切り処理というふうに分けて覚えると、実際の開発でも使いやすくなりますよ。」

生徒

「たとえば、アプリの設定とかメニュー処理なら内部クラスが便利そうですね。匿名クラスはクリックイベントとかに使える感じで。」

先生

「いい観察ですね。今回の内容はKotlinの設計力に直結するので、繰り返し書いて慣れることが大切です。」

生徒

「はい!たくさん書いてみて、場面に合わせて使い分けられるようにしたいです。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Kotlinのネストクラスと内部クラスの違いがよく分かりません。どう使い分ければいいですか?

Kotlinのネストクラスは外側のクラスにアクセスできない独立したクラスですが、内部クラスはouterというキーワードを使って外側のクラスのプロパティや関数にアクセスできます。外側の情報が必要なら内部クラス、それ以外はネストクラスで構造を整理するのが基本です。
関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の短絡評価(ショートサーキット)を使った条件式の工夫をやさしく解説!初心者でも理解できる基本知識
New2
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New3
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New4
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Kotlin
Kotlin DSLとGroovy DSLの違いをやさしく解説!初心者でもわかるGradleスクリプトの使い分け
No.8
Java&Spring記事人気No8
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク