This 식
현재 리시버를 나타내기 위해 this 표현식을 사용한다.
- 클래스 멤버에서 this 는 해당 클래스의 현재 객체를 나타낸다
- 확장 함수 또는 리시버를 지정한 확장 리터럴에서 this 는 점의 왼쪽에 전달되는 리시버 파라미터를 나타낸다.
this 제한자가 없으면 가장 안쪽에 있는 scope를 가리킨다. 다른 scope에서 this를 참조하려면 레이블 제한자를 사용한다.
제한된 this
바깥쪽 scope (클래스 또는 확장 함수 또는 레이블이 있는 리시버를 사용하는 함수 리터럴)에서 this 에 접근하려면 this@label
을 쓰고, @label
은 this 로 접근하려는 scope 에 대한 레이블이다.
class A { // implicit label @A
inner class B { // implicit label @B
fun Int.foo() { // implicit label @foo
val a = this@A // A의 this
val b = this@B // B의 this
val c = this // foo()의 receiver인 Int
val c1 = this@foo // foo()의 receiver인 Int
val funLit = lambda@ fun String.() {
val d = this // funLit의 receiver
}
val funLit2 = { s: String ->
// 둘러싼 람다 식이 리시버를 갖지않으므로
// foo() receiver
val d1 = this
}
}
}
}