【kotlin/Android】アクセス修飾子の種類と違いとは?protected/private/internal
この記事からわかること
- Kotlinのアクセス修飾子の使い方
- 種類と違い
- public/internal/protected/private
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Narwhal Feature Drop
- Kotlin:2.1.10
- AGP:8.9.2
- Gradle:8.11.1
- Mac M1:Sequoia 15.6.1
Kotlinのアクセス修飾子とは?
他のプログラミング言語にもあるようにKotlinにもオブジェクトや変数、関数などのアクセスをコントロールするためのアクセス修飾子が用意されています。アクセスをコントロールできることにより、外部(他のクラスなど)に公開したくない情報をオブジェクト内に閉じ込めておけたり、特定の処理のみを外部から利用可能にするといったことが可能になります。
Kotlinでアクセスを制御できるのはクラス、データクラス、列挙型、プロパティ、メソッド、トラクタなどとなっています。
アクセス修飾子の種類
Kotlinではアクセスコントロールを行うために4種類のアクセスレベルが提供されています。
| アクセスレベル | 概要 |
|---|---|
| public | どんなソースファイルからでもアクセス可能。Kotlinのデフォルトアクセスレベル。 |
| internal | 同一モジュール内でのみアクセス可能。 |
| protected | クラス自身とそのサブクラスからのみアクセス可能。 |
| private | 同じクラス内 or 同じファイル内からのみアクセス可能。 |
そしてこれらのアクセスレベルを指定するためにpublic、internal、protected、privateという修飾子が用意されています。
public
- どこからでもアクセス可能
- デフォルトアクセスレベル(未指定の場合はpublicになる)
- 明示的に記述しても同じ
- Javaとの違い:Javaは「デフォルト(package-private)」は存在しない
// public class と同じ
class Person {
var name: String = "Taro"
// 明示的に定義しても同じ
public var age: Int = 20
}
internal
- 同じモジュール内からのみアクセス可能
- モジュール = 一緒にコンパイルされる単位(Gradle の :app, :library など)
- ライブラリを作るときに「外部公開したくないけどモジュール内では使いたい」場面で活用
// 同じモジュール内ならアクセス可能
internal class InternalHelper {
fun doSomething() {}
}
protected
- クラス自身とそのサブクラスからのみアクセス可能
- ファイル直下(トップレベル)では使えない(クラス専用)
- Javaとの違い:Javaのprotectedは「同一パッケージ内のクラス」からもアクセス可能だがKotlinでは継承関係だけが対象
open class Animal {
protected fun breathe() {
println("呼吸中")
}
}
class Dog : Animal() {
fun run() {
breathe() // ✅ サブクラスなのでアクセス可能
}
}
class Cat {
fun meow() {
// breathe() ❌ 他のクラス(未継承)なので呼べない
}
}
private
- 同じクラス内 or 同じファイル内からのみアクセス可能
- トップレベル(ファイル直下)でも使える
- クラスに付けた場合はそのクラスの中だけで使える
private val secret = "このファイル内だけで使える"
class User {
// このクラス内だけ
private var password: String = "1234"
fun printPassword() {
println(password)
}
}
まとめ
| 修飾子 | 同クラス内 | サブクラス | 同一ファイル | 同一モジュール | 他モジュール |
|---|---|---|---|---|---|
| public | ✅ | ✅ | ✅ | ✅ | ✅ |
| internal | ✅ | ✅ | ✅ | ✅ | ❌ |
| protected | ✅ | ✅ | ❌ | ❌ | ❌ |
| private | ✅ | ❌ | ✅ | ❌ | ❌ |
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






