문서비공식 한국어 번역
GitHub문서

중첩된 클래스와 안쪽 클래스

 이 페이지의 마지막 수정: 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

이 페이지가 도움이 되셨다면, 원문 페이지에 방문해 엄지척을 해주세요!