[코틀린인액션] 코틀린과 자바의 내부 클래스와 중첩 클래스

자바의 내부 클래스

  • 자바의 클래스 내부에서 다른 클래스를 정의하면
    • 기본적으로 내부 클래스가 된다.
    • 내부클래스는 외부 클래스에 대한 인스턴스 참조를 자동으로 가지게 된다.

코틀린에서의 내부 클래스

  • 외부 클래스와 내부 클래스는 서로 접근 권한이 없다
    • 코드의 캡슐화나 정의를 사용하는 곳에 가깝게 두는 것에 유용한 편이다.

중첩 클래스의 사용 예제

  • View 인터페이스와 State 인터페이스를 예로
    • View 의 상태를 직렬화하는 경우에 중첩 클래스를 사용하면 편리하다.
  • Button 클래스의 상태를 저장하는 클래스는 Button 클래스의 내부에 선언하면 편리하다.
  • State 인터페이스를 구현한 ButtonState 클래스를 정의하여 Button에 대한 구체적인 정보를 저장한다.
class Button : View {
    override fun getCurrentState(): State = ButtonState()

    override fun restoreState(state: State) {
        super.restoreState(state)
    }

    class ButtonState : State { /*...*/ }
}

interface View {
    fun getCurrentState(): State
    fun restoreState(state: State) {}
}

interface State : Serializable

중첩 클래스와 내부 클래스의 차이점

  • 코틀린의 중첩 클래스는 자바의 static 중첩 클래스와 동일하다
    • 바깥 클래스에 대한 참조를 포함하지 않는다.
  • 내부 클래스로 변경하려면 inner 키워드를 사용하며, 바깥 클래스에 대한 참조롤 포함하게 된다.
class Outer {
    inner class Inner {
        fun getOuterReference(): Outer = this@Outer // 바깥 클래스 참조에 접근
    }
}

class Outer2 {
    class Inner {
        fun getOuterReference(): Outer2? = null // 바깥 클래스 참조에 접근 불가능하다.
    }
}


Uploaded by N2T