스물세 번째, 중첩과 내부 클래스입니다.
클래스는 다른 클래스에 중첩될 수 있습니다.
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
인터페이스도 중첩할 수 있습니다. 클래스와 인터페이스의 모든 조합이 가능합니다. 즉, 클래스에 인터페이스, 인터페이스에 클래스, 인터페이스에 인터페이스 모두 가능합니다.
interface OuterInterface {
class InnerClass
interface InnerInterface
}
class OuterClass {
class InnerClass
interface InnerInterface
}
내부 클래스
inner 로 표기된 중첩 클래스(내부 클래스)는 외부 클래스의 멤버를 접근할 수 있습니다. 내부 클래스는 외부 클래스 객체의 참조를 가지고(carry) 있습니다.
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
내부 클래스에서의 모호환 this와 관련해서는 여기를 참고하세요.
익명 내부 클래스
익명 내부 클래스 인스턴스는 객체 표현식을 사용하여 만듭니다.
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})
JVM에서, 객체가 함수형 Java 인터페이스(즉, 하나의 추상 메소드만 가진 Java 인터페이스)의 인스턴스이면, 인터페이스 타입을 앞에 붙인 람다 표현식으로 구현할 수 있습니다.
val listener = ActionListener { println("clicked") }
'Kotlin' 카테고리의 다른 글
공식 문서로 배우는 코틀린 - 25. Inline value classes (0) | 2024.03.11 |
---|---|
공식 문서로 배우는 코틀린 - 24. Enum classes (0) | 2024.03.11 |
공식 문서로 배우는 코틀린 - 22. Generics: in, out, where (0) | 2024.03.11 |
공식 문서로 배우는 코틀린 - 21. Sealed classes and interfaces (0) | 2024.03.10 |
공식 문서로 배우는 코틀린 - 20. Data classes (0) | 2024.03.09 |