기본적으로 자바의 경우 클래스 내부에 클래스를 선언하면 자동적으로 inner 클래스로 묶이는데, 코틀린은 그렇지 않다. 아무런 조치 없이 내부에 선언되는 경우, 두 인스턴스를 공유하지 않고 그저 따로 움직이는 클래스가 된다.
예시를 보자.
package nestedClassExample
class Outer {
class Nested{
fun hello() = println ("중첩된 클래스")
}
}
fun main() {
val instance : Outer.Nested = Outer.Nested()
instance.hello()
}
Outer 클래스 내부에 Nested 클래스가 선언된 상태이다. 호출할때는 외부클래스.내부클래스 순서로 호출하면 내부클래스를 호출 할 수 있다. 결과가 어떻게 나올까?
결과 :
중첩된 클래스
근데 이렇게 부를 수 있다고 해서 인스턴스를 공유하는 것이 아닌게..
외부 클래스의 프로퍼티를 내부 클래스에서 호출하려고 찾으면 찾아지지 않는다. 정말.. 인스턴스가 따로 논다.
그렇다면 자바처럼 따로 놀지 않는 인스턴스를 만들려면 어떻게 해야할까?
중첩되는 내부 클래스 앞에 inner 키워드를 붙여주면 된다.
package nestedClassExample
class Outer(private val value: Int) {
fun print() {
println(this.value)
}
inner class Inner(private val innerValue: Int){
fun print(){
this@Outer.print()
println(this.innerValue + this@Outer.value)
}
}
}
fun main() {
val instance : Outer = Outer(610)
val innerInstance : Outer.Inner = instance.Inner(40)
innerInstance.print()
}
내부 클래스를 보자. 저기서 보는 this는 내부 클래스의 value고, this@Outer로 외부 클래스의 value를 가져올 수 있다.
Nested class 와 다르게 외부 클래스에 접근을 할 수 있다는 것에 큰 차이가 있다.
반응형
'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글
Kotlin] 31. 함수 리터럴 (0) | 2020.12.10 |
---|---|
Kotlin] 30. 데이터 클래스 (0) | 2020.12.10 |
Kotlin] 28. 다이아몬드 문제 (0) | 2020.12.10 |
Kotlin] 27. lateinit (0) | 2020.12.10 |
Kotlin] 26. const (0) | 2020.12.10 |