티스토리 뷰

코틀린에서는 클래스 내부에 클래스를 둘 수 있는 중첩 클래스를 지원한다.

중첩 클래스: 하나의 클래스가 다른 클래스의 기능과 강하게 연관되어 있다는 의미를 전달하기 위해 만들어진 형식

사용할 때는 외부 클래스의 이름 . 내부 클래스로 사용할 수 있다.

class Outer {
        class Nested {  // Outer.Nested() 로 사용 가능

        }
}

이때 중첩 클래스가 아니라 내부 클래스로 사용할 수 있는데, 다음과 같이 코드를 작성하면 된다.

class Outer {
        inner class Nested { 

        }
}

이때 Nested는 혼자서는 객체를 만들 수는 없고 외부 클래스의 객체가 있어야만 생성과 사용이 가능하다.

그러면 왜 내부 클래스를 사용하는가?

중첩 클래스는 서로의 내용을 공유할 수 없으나

내부 클래스는 서로의 내용을 공유할 수 있다. 즉 외부 클래스의 함수나 속성을 사용할 수 있다.

다음의 코드를 봐보자.

fun main(args: Array<String>) {
    Outer.Nested().introdue() // Nested Class

    val outer = Outer()
    val inner = outer.Inner()

    inner.introduceInner() // Inner Class
    inner.introduceOuter() // Outer Class

    outer.text = "Changed Outer Class"
    inner.introduceOuter() // Changed Outer Class
}

class Outer {
    var text = "Outer Class"

    class Nested {
        fun introdue() {
            println("Nested Class")
        }
    }

    inner class Inner {
        var text = "Inner Class"

        fun introduceInner() {
            println(text)
        }

        fun introduceOuter() {
            println(this@Outer.text) // 위와 같이 외부 클래스를 참조하면 됨
        }
    }
}

참조를 어떻게 하는지 확인할 수 있다. 중첩과 내부클래스는 함수나 객체의 속성을 접근할 수 있는가?에 차이가 있으므로 이를 이용하여 코드의 의미를 파악할 수 있다.