면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

Kotlin의 Inner Class와 Nested Class

skydovesJaewoong Eum (skydoves)||7분 소요

Kotlin의 Inner Class와 Nested Class

코틀린에서는 클래스 내부에 또 다른 클래스를 정의할 수 있으며, inner 키워드의 사용 여부에 따라 동작 방식이 달라집니다. inner 키워드 없이 선언된 nested class는 외부 클래스(enclosing class)에 대한 참조를 보유하지 않으며, Java의 static inner class와 동일하게 동작합니다. 반면 inner 키워드를 사용하여 선언된 inner class는 외부 클래스 인스턴스에 대한 암시적 참조를 보유하므로, 해당 인스턴스의 멤버에 직접 접근할 수 있습니다. 이 두 클래스의 차이를 정확히 이해하는 것은 메모리 관리, API 설계, 그리고 안드로이드 개발에서 빈번하게 발생하는 메모리 누수 방지에 매우 중요합니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • 코틀린에서 nested classinner class의 차이점을 설명할 수 있습니다.
  • inner class가 외부 인스턴스에 대한 참조를 캡처하는 방식을 이해할 수 있습니다.
  • 안드로이드 컴포넌트에서 inner class를 사용할 때 발생할 수 있는 메모리 누수 위험을 파악할 수 있습니다.
  • this@OuterClass 구문을 활용하여 외부 인스턴스를 명시적으로 참조하는 방법을 익힐 수 있습니다.

Nested Classes

inner 키워드 없이 다른 클래스 내부에 선언된 클래스를 nested class라고 합니다. nested class는 외부 클래스의 인스턴스에 대한 참조를 보유하지 않기 때문에, 외부 클래스의 멤버에 접근할 수 없습니다.

class Outer {
    val outerValue = "Outer"

    class Nested {
        fun show() = "No access to outerValue"
    }
}

fun main() {
    val nested = Outer.Nested()
    println(nested.show()) // 출력: No access to outerValue
}

nested class는 외부 클래스의 인스턴스 없이도 생성할 수 있습니다. Outer.Nested()처럼 외부 클래스 이름을 통해 직접 참조하면 됩니다. 컴파일된 바이트코드에서 nested class는 Java의 static inner class와 동일한 형태입니다. 외부 클래스에 대한 암시적 참조가 존재하지 않으므로, 외부 인스턴스의 메모리 보유에 영향을 주지 않습니다. 이러한 특성 덕분에 nested class는 메모리 관리 측면에서 안전한 선택지가 됩니다.

Inner Classes

클래스 내부에 선언된 클래스에 inner 키워드를 추가하면 inner class가 됩니다. inner class는 외부 클래스 인스턴스에 대한 암시적 참조를 보유하며, private 멤버를 포함한 외부 클래스의 모든 멤버에 접근할 수 있습니다.

class Outer(val name: String) {
    private val secret = "Secret Code"

    inner class Inner {
        fun reveal() = "Name: $name, Secret: $secret"
    }
}

fun main() {
    val outer = Outer("OuterName")
    val inner = outer.Inner()
    println(inner.reveal())
    // 출력: Name: OuterName, Secret: Secret Code
}

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기