4.1.5 지역 클래스
자바처럼 코틀린에서도 함수 본문에서 클래스를 정의할 수 있다. 이런 지역 클래스는 자신을 둘러싼 코드 블록 안에서만 쓰일 수 있다.
fun main() { class Point(val x: Int, val y: Int) { fun shift(dx: Int, dy: Int): Point = Point(x + dx, y + dy) override fun toString() = "($x, $y)" } val p = Point(10, 10) println(p.shift(-1, 3)) // (9, 13) } fun foo() { println(Point(0, 0)) // error: unresolved reference: Point }
지역 함수와 비슷하게 코틀린 지역 클래스도 자신을 둘러싼 코드의 선언에 접근할 수 있다. 특히 지역 클래스는 클래스 본문 안에서 자신이 접근할 수 있는 값을 포획(capture)할 수 있고, 심지어는 변경할 수도 있다.
fun main() {
var x = 1
class Counter {
fun increment() {
x++
}
}
Counter().increment()
println(x) // 2
}