서른여덟 번째, this 표현식입니다.
현재 수신자를 나타내기 위해서 this 표현식을 사용할 수 있습니다.
- 클래스의 멤버에서 this는 클래스의 현재 객체를 나타냅니다.
- 확장 함수나 수신자가 있는 함수 리터럴에서 this는 마침표의 왼쪽 부분으로 지정되는 수신자 매개변수를 나타냅니다.
this에 한정자(qualifier)가 없으면 가장 깊은 단계로 감싸고 있는 유효 범위(scope)를 나타냅니다. 다른 유효 범위(scope)의 this를 나타내개 위해서는 라벨 한정자를 사용합니다.
한정된 this (Qualified this)
바깥 범위(클래스나 확장 함수나 라벨이 있는 수신자 있는 함수 리터럴)의 this를 접근하기 위해서는 this@label 를 사용합니다. @label 부분은 this의 유효범위 라벨입니다.
class A { // 묵시적 라벨 @A
inner class B { // 묵시적 라벨 @B
fun Int.foo() { // 묵시적 라벨 @foo
val a = this@A // A의 this
val b = this@B // B의 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 ->
// 람다 표현식이 어떠한 수신자도 갖지 않기 때문에
// foo()의 수신자
val d1 = this
}
}
}
}
묵시적 this
this의 멤버을 호출할 때는 this. 부분을 생략할 수 있습니다. 만약에 멤버와 이름이 같은 멤버가 아닌 함수가 있는 경우에는 해당 함수가 대신 호출될 수 있기 때문에 this를 주의 있게 사용해야 합니다.
fun main() {
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() // 멤버 함수 printLine()이 실행 됩니다.
A().invokePrintLine(omitThis = true) // 최상위 수준 함수 printLine()이 실행됩니다.
}
'Kotlin' 카테고리의 다른 글
공식 문서로 배우는 코틀린 - 40. Destructuring declarations (0) | 2024.03.17 |
---|---|
공식 문서로 배우는 코틀린 - 39. Annotations (0) | 2024.03.16 |
공식 문서로 배우는 코틀린 - 37. Equality (0) | 2024.03.16 |
공식 문서로 배우는 코틀린 - 36. Null safety (0) | 2024.03.15 |
공식 문서로 배우는 코틀린 - 35. Using builders with builder type inference (0) | 2024.03.15 |