[코틀린기초] 24. super와 this
super는 상위 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드
- super.메서드이름
- super.프로퍼티
- super()
this는 현재 클래스의 메서드, 프로퍼티, 생성자를 사용하는 키워드
- this.메서드이름
- this.프로퍼티
- this()
## 바깥 클래스 접근하기
이너클래스는 inner 키워드를 사용하여 선언하며, @ 기호를 이용하여 @기호 옆에 바깥 클래스 명을 작성해 호출한다.
open class Base{
open val x: Int = 1
open fun f() = println("Base Class f()")
}
class Child : Base(){
override val x: Int = super.x + 1
override fun f() = println("Child Class f()")
inner class Inside{
fun f() = println("Inside Class f()")
fun test(){
f() // 현재 이너 클래스의 f() 접근
Child().f() // 바로 바깥 클래스의 f() 접근
super@Child.f() // Child의 상위클래스인 Base클래스의 f() 접근
println("[Inside] super@Child.x: ${super@Child.x}") // Base의 x접근
}
}
}
fun main(){
val c1 = Child()
c1.Inside().test() // 이너 클래스 Inside의 메서드 test() 실행
}
## 앵글브라켓을 사용한 이름 중복 해결
open class A{
open fun f() = println("A Class f()")
fun a() = println("A Class a()")
}
interface B{
fun f() = println("B Interface f()") // 인터페이스는 기본적으로 open이다
fun b() = println("B Interface b()")
}
class C :" A(), B{ // ,를 사용해 클래스와 인터페이스 지정. 상속은 단 한개만 가능
override fun f() = println("C Class f()")
fun test() {
f() //현재 클래스의 f()
b() //인터페이스의 b()
super<A>.f() // A 클래스의 f()
super<B>.f() // B 인터페이스의 f()
}
}
fun main(){
val c = C()
c.test()
}