조용한 담장

코틀린(Kotlin) 클래스(Class) : 중첩 클래스 와 내부 클래스 (Nested and Inner Classes) 본문

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") }

 

Comments