자바에서는 A클래스 안에 B클래스를 정의하면 B클래스는 자동으로 A클래스의 내부 클래스가 되어 A클래스 안의 객체를 참조할 수 있다.
코틀린에서는 이 경우 기본적으로 ⭐️중첩 클래스⭐️가 된다.
내부 클래스로 만들고 싶으면 inner 를 붙여 클래스를 선언해야 한다.
내부 클래스는 기본적으로 외부 클래스를 참조하여 객체에 접근이 가능하다.
코틀린 공식 문서 예시
class Outer{
private val bar: Int = 2
class Nested{
fun foo() = 2
}
}
val demo1 = Outer.Nested().foo() // =2
//inner class
class Outer{
private val bar: Int = 1
inner class Inner{
fun foo() = bar
}
}
val demo2 = Outer().Inner().foo() // =1
이 코드를 실행 시키면 demo1 에서 오류가 발생한다.
그 이유는 Nested() 클래스가 중첩 클래스이므로
Outer().Nested().foo() 에서 오류가 발생된다. Nested()클래스는 내부 클래스가 아니기에 참조 불가이고, 또한 Outer() 클래스의 멤버변수인 bar에 접근할 수 없다!!
따라서 접근 시 Outer()가 아닌 Outer로 해야한다.
fun main() {
//중첩 클래스 nested class
val demo1 = Outer.Nested().foo() //=2
println(demo1)
}
demo2는 내부 클래스라고 inner키워드를 선언했으므로 외부클래스 Outer()의 멤버 변수 bar를 참조할 수 있다.