Coding Memo
Kotlin 중첩 / 내부 클래스 본문
코틀린은 Java와 100% 호환되는 언어이므로 클래스 안에 클래스가 있는 형태가 가능하다.
마찬가지로 중첩 클래스와 내부 클래스가 있다.
중첩 클래스 (Nested Class)
중첩 클래스는 그 클래스를 포함하고 있는 외부 클래스의 변수나 함수를 공유할 수 없다.
즉, 외부 클래스 안에 있는 중첩 클래스지만 실제적으로는 다른 클래스로 봐도 될 것 같다.
다만 사용은 (외부 클래스 명).(중첩 클래스 명)으로 외부 클래스를 참조하여 사용한다.
형식은 단순히 클래스 안에 다시 클래스를 선언하는 형식이다.
fun main() {
OuterClass().printOuter()
println(OuterClass().a)
OuterClass.NestedClass().printNested()
println(OuterClass.NestedClass().a)
}
class OuterClass {
var a: String = "OuterClassProperty"
fun printOuter() {
println(a)
}
class NestedClass {
var a: String = "NestedClassProperty"
fun printNested() {
println(a)
//println(this@OuterClass.a) <- Nested Class에서는 불가
}
}
}
NestedClass를 참조하려면 OuterClass를 통해 참조해야 하고 그 안에 있는 속성도 마찬가지이다.
NestedClass에서 OuterClass의 속성을 참조는 this@OuterClass.a 로 할 수 없다.
내부 클래스 (Inner Class)
내부 클래스는 중첩 클래스와 달리 외부 클래스의 자원(속성, 함수)을 사용할 수 있다.
아래 형식을 이용한다.
this@(외부 클래스 명).(참조할 자원)
따라서 외부클래스를 통해 참조할 때는 외부 클래스가 생성이 되어야만 한다.
형식은 클래스 안에 다시 클래스를 선언하는 형식이지만 추가적으로 내부 클래스에는 inner라는 키워드가 붙는다.
fun main() {
OuterClass().InnerClass().printInner()
OuterClass().InnerClass().printOuter()
OuterClass().InnerClass().printOuter2()
val outer = OuterClass()
val inner = outer.InnerClass()
inner.changeOuterA("changed")
outer.printOuter()
}
class OuterClass {
var a: String = "OuterClassProperty"
fun printOuter() {
println(a)
}
inner class InnerClass {
var a: String = "InnerClassProperty"
fun printInner() {
println(a)
}
fun printOuter() {
println(this@OuterClass.a)
}
fun printOuter2() {
this@OuterClass.printOuter()
}
fun changeOuterA(str: String) {
this@OuterClass.a = str
}
}
}
참조를 통해 값을 변경 할 수 도 있다. (changeOuterA() 함수)
참고: OuterClass를 생성을 안 하고 했을 경우 (Nested Class에서는 아래 방법이 가능했다.)
중첩 클래스와 내부 클래스는 컴파일 시 '$'로 구분되어 파일 명이 생성된다.
'Language > Kotlin' 카테고리의 다른 글
Kotlin 데이터 클래스 (0) | 2021.01.08 |
---|---|
Kotlin 열거형 클래스 (0) | 2021.01.08 |
Kotlin 함수 파라미터 (0) | 2021.01.06 |
Kotlin null 값 (0) | 2021.01.06 |
Kotlin 제네릭 (0) | 2021.01.06 |