중첩된 클래스와 안쪽 클래스
이 페이지의 마지막 수정: 2024년 8월 22일
...
클래스들은 다른 클래스들 안에 중첩될 수 있습니다:
1class Outer {
2 private val bar: Int = 1
3 class Nested {
4 fun foo() = 2
5 }
6}
7
8val demo = Outer.Nested().foo() // == 2
9
중첩 구조에 인터페이스도 사용할 수 있습니다. 모든 클래스와 인터페이스의 중첩 구조가 허용됩니다: 인터페이스 안에 클래스, 클래스 안에 인터페이스, 인터페이스 안에 인터페이스 까지도요.
1interface OuterInterface {
2 class InnerClass
3 interface InnerInterface
4}
5
6class OuterClass {
7 class InnerClass
8 interface InnerInterface
9}
10
안쪽(inner) 클래스
inner
로 표기된 클래스가 다른 클래스 안쪽에 중첩되면, 그 바깥쪽 클래스의 멤버 필드에 접근할 수 있습니다.
안쪽 클래스가 바깥쪽 클래스 오브젝트의 래퍼런스를 가지고 있습니다:
1class Outer {
2 private val bar: Int = 1
3 inner class Inner {
4 fun foo() = bar
5 }
6}
7
8val demo = Outer().Inner().foo() // == 1
9
안쪽 클래스의 this
모호성에 대해 더 알아보기 위해 꼬리표가 붙은 this 표현을 살펴보세요.
익명 안쪽 클래스
익명 안쪽 클래스의 인스턴스들은 object 표현을 통해 생성됩니다:
1window.addMouseListener(object : MouseAdapter() {
2
3 override fun mouseClicked(e: MouseEvent) { ... }
4
5 override fun mouseEntered(e: MouseEvent) { ... }
6})
7
JVM 에서, 오브젝트가 함수형 자바 인터페이스(단 하나의 추상 메서드를 가지는 자바의 인터페이스)라면 인터페이스의 타입 뒤에 뒤따르는 람다 표현을 사용하여 오브젝트를 만들 수도 있습니다:
1val listener = ActionListener { println("clicked") } 2
이 페이지가 도움이 되셨다면, 원문 페이지에 방문해 엄지척을 해주세요!