코틀린/코틀린인액션
[코틀린인액션] 코틀린과 자바의 내부 클래스와 중첩 클래스
OverTheHorizon3410
2023. 12. 17. 00:16
자바의 내부 클래스
- 자바의 클래스 내부에서 다른 클래스를 정의하면
- 기본적으로 내부 클래스가 된다.
- 내부클래스는 외부 클래스에 대한 인스턴스 참조를 자동으로 가지게 된다.
코틀린에서의 내부 클래스
- 외부 클래스와 내부 클래스는 서로 접근 권한이 없다
- 코드의 캡슐화나 정의를 사용하는 곳에 가깝게 두는 것에 유용한 편이다.
중첩 클래스의 사용 예제
- 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