[Kotlin] 내부 클래스와 중첩클래스 차이

내부 클래스(inner class) 와 중첩 클래스(nested class)

코틀린과 자바의 차이

자바에서는 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를 참조할 수 있다.

좋은 웹페이지 즐겨찾기