kotlin
코틀린(Kotlin) 클래스(Class) : 중첩 클래스 와 내부 클래스 (Nested and Inner Classes)
iosroid
2019. 12. 31. 18:35
코틀린의 중첩 클래스(nested class) 와 내부 클래스(inner class) 에 대해 알아보자.
원문 https://kotlinlang.org/docs/reference/nested-classes.html 을 보며 정리.
Nested classes
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
Inner classes
중첩 클래스는 inner 로 표시하고 외부클래스(outer class) 에서 멤버의 접근이 가능하다.
내부 클래스는 외부 클래스의 오브젝트 레퍼런스를 가지고 있다.
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
Qualified this expressions 을 통해 내부 클래스에서 this 의 타겟을 명확하게 할 수 있다.
Qualified this
외부에 class, extension function, labeled function with receiver 들을 접근하기 위해 사용한다.
this@label 형식으로 사용한다.
class A { // implicit label @A
inner class B { // implicit label @B
fun Int.foo() { // implicit label @foo
val a = this@A // A's this
val b = this@B // B's this
val c = this // foo()'s receiver, an Int
val c1 = this@foo // foo()'s receiver, an Int
val funLit = lambda@ fun String.() {
val d = this // funLit's receiver
}
val funLit2 = { s: String ->
// foo()'s receiver, since enclosing lambda expression
// doesn't have any receiver
val d1 = this
}
}
}
}
Anonymous inner classes
Anonymous inner class 의 인스턴스는 object expression 을 사용하여 생성한다.
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})
JVM 에서, 오브젝트가 functional java interface 의 인스턴스 일때, interface 타입을 prefix 로 lambda expression 을 사용하여 생성할 수 있다.
val listener = ActionListener { println("clicked") }