Kotlin

[Kotlin] 코틀린 내부 클래스(inner class)와 중첩 클래스(nested class) 좀 더 쉽게 이해하기 : Java와 반대(?)

코틀린 개발에 앞서 내부 클래스와 중첩 클래스에 대해 반드시 확실하게 이해하고 넘어가야한다. 자바랑 다르기 때문이다. 자바에서는 가령, A 클래스 안에 B 클래스를 정의하면 B 클래스는 자동으로 A클래스의 내부 클래스가 되어서 A클래스 안의 객체를 참조할 수 있다. 하지만 코틀린에서는 반대이다. 코틀린에서는 기본적으로 중첩클래스가 된다. 내부 클래스로 만들고 싶다면 inner 키워드를 사용하여 클래스를 선언해야 한다. 내부 클래스는 기본적으로 외부 클래스를 참조하여 객체에 접근이 가능하지만 중첩 클래스는 그렇지 않다. 코틀린 공식 문서의 예시를 보자

//Nested 
class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2




//inner class
class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

코틀린 공식 문서를 보면 내부 클래스(inner class)는 이해가 가지만 중첩클래스(nested class)의 예시는  이해가 쉽게 가지 않는다.  그래서 좀 더 쉽게 알아보자. 아래 예시를 보자

Nested()클래스는 중첩 클래스로 선언하였음으로 Outer().Nested().foo()에서 오류가 발생한다. Nested()는 Outer()클래스의 내부클래스가 아니기 때문에 참조 불가라는 오류가 발생하는 것이다. 그리고 Nested()클래스는 Outer()클래스의 내부 클래스가 아니기 때문에 bar 멤버변수에 접근할 수 없다. 그래서 bar 변수에 빨간색으로 표기되고 있다.

그럼으로 아래와 같이 접근해야한다. Outer()가 아닌 Outer로 접근해야한다.

fun main() {
    
    //중첩 클래스 (nested class)
    val demo2 = Outer.Nested().foo() // == 2
    println(demo2)
    
}

[REFERENCE]
코틀린 공식문서Nested and Inner Classes – Kotlin Programming Language
kotlinlang.org

Leave a Reply

error: Content is protected !!