this가 쓰이는 상황 | this의 의미 |
클래스 안 | 클래스의 현재 객체를 참조 |
확장 함수 안 | 점의 왼쪽에 전달 된 리시버 파라미터를 참조 |
리시버가 있는 함수 리터럴 안 | 점의 왼쪽에 전달 된 리시버 파라미터를 참조 |
Qualified this
- @label 없으면 가장 안쪽에 있는 스코프를 참조한다.
- this를 통해 외부 스코프(클래스, 확장 함수, 리시버가 있는 label 함수 리터럴)에 접근 할려면 this@label로 작성하면 된다.
class A { // label @A
inner class B { // label @B
fun Int.foo() { // label @foo
val a = this@A // A class를 참조하는 this
val b = this@B // B class를 참조하는 this
val c = this // foo()의 리시버 Int
val c1 = this@foo // foo()의 리시버 Int
val funLit = lambda@ fun String.() {
val d = this // funLit의 리시버 String
}
val funLit2 = { s: String ->
val d1 = this // 람다 식 안에 어떤 리시버도 없기 때문에 foo()의 리시버 Int
}
}
}
}
Implicit this
- 클래스 내에서 멤버 함수를 호출할 때는 this를 생략해도 된다.
- 멤버 함수와 같은 이름의 함수가 클래스 외부에 있으면 this를 조심해서 사용해야 한다.
fun printLine() { println("Top-level function") }
class A {
fun printLine() { println("Member function") }
fun invokePrintLine(omitThis: Boolean = false) {
if (omitThis) printLine()
else this.printLine()
}
}
A().invokePrintLine() // Member function
A().invokePrintLine(omitThis = true) // Top-level function
'기타 > Android' 카테고리의 다른 글
[Android] 안드로이드 Go to the documentation to learn how to Fix dependency resolution errors. 에러 해결 방법 (0) | 2023.04.21 |
---|---|
[Android] Android Activity Lifecycle 정리 (0) | 2023.04.13 |
[Kotlin] Sealed class 란? (0) | 2023.02.25 |
[Kotlin] Scope functions(let, run, with, apply, also) 정리 (0) | 2023.02.22 |
[Android] RecyclerView 스크롤을 특정 위치로 이동 (0) | 2022.11.19 |