はじめに
スコープ (Scope) とは、変数や関数が「どこから参照できるか」を決める有効範囲のことです。
Kotlinでは以下のスコープが存在します。
- トップレベルスコープ
- ローカルスコープ(関数・ブロック内)
- クラススコープ
- オブジェクトスコープ(object / companion object)
- 拡張関数やスコープ関数による限定スコープ
1. トップレベルスコープ
Kotlinではクラス外(ファイル直下)に変数や関数を定義できます。
val appName = "MyApp" // トップレベル変数
fun greet() { // トップレベル関数
println("Hello from $appName")
}
Javaにはない特徴で、ユーティリティ関数をクラスに入れなくてもOKです。
2. ローカルスコープ(関数・ブロック内)
関数やブロック { ... } 内で宣言された変数は、そのブロック内だけ有効です。
fun main() {
val x = 10 // main 関数スコープ
if (x > 5) {
val y = 20 // if スコープ
println(x + y)
}
// println(y) // ❌ エラー:yは if ブロックの外から参照できない
}
3. クラススコープ
クラスのプロパティやメソッドは、インスタンスを通してアクセスします。
class Person(val name: String) {
fun introduce() {
println("I am $name")
}
}
val p = Person("Anna")
p.introduce()
4. オブジェクトスコープ
object や companion object 内に宣言した変数や関数は、シングルトン的に使えます。
class Config {
companion object {
const val VERSION = "1.0"
fun printVersion() = println("Version: $VERSION")
}
}
Config.printVersion() // Version: 1.0
5. ローカル関数
関数の中に関数を定義すると、その関数のスコープに限定されます。
fun validateUser(name: String, age: Int): Boolean {
fun isValidName(n: String) = n.isNotEmpty()
fun isValidAge(a: Int) = a in 0..120
return isValidName(name) && isValidAge(age)
}
6. スコープ関数(let / run / apply / also / with)
Kotlinには「スコープ関数」と呼ばれる便利な関数群があります。
対象オブジェクトを一時的にスコープ内に閉じ込めて操作できます。
let
val name: String? = "Anna"
name?.let {
println("Length: ${it.length}")
}
apply
val list = mutableListOf<Int>().apply {
add(1)
add(2)
add(3)
}
println(list) // [1, 2, 3]
スコープ関数は「変数の有効範囲を限定する」「チェーン処理をシンプルにする」目的で多用されます。
まとめ
- スコープは変数や関数の有効範囲を決める
- トップレベルスコープ: ファイル直下で宣言可能
- ローカルスコープ: 関数やブロック内の変数は外から参照不可
- クラススコープ: プロパティやメソッドはインスタンスに属する
-
オブジェクトスコープ:
companion objectでクラス単位の定数や関数を提供 - ローカル関数でスコープを限定できる
- スコープ関数(let, run, apply, also, with) で一時的なスコープを作れる