super와 this
- 현재 클래스에서 참조의 기능
- 상위 클래스는 super 키워드로 현재 클래스는 this 키워드로 참조가 가능
super
super.프로퍼티명 // 상위 클래스의 프로퍼티 참조
super.메서드명() // 상위 클래스의 메서드 참조
super() // 상위 클래스의 생성자의 참조
this
this.프로퍼티명 // 현재 클래스의 프로퍼티 참조
this.메서드명() // 현재 클래스의 메서드 참조
this() // 현재 클래스의 생성자의 참조
super로 상위 참조
- 상위 클래스의 메서드 실행
open class Bird ( var name : String, var wing : Int, var beak : String, var color : String ) {
fun fly () = println( "Fly wing : $wing" )
open fun sing ( vol : Int ) = println ( "Sing vol : $vol" )
}
class Parrot ( name : String, wing : Int = 2, beak : String, color : String,
var language : String = "natural" ) : Bird ( name, wing, beak, color ) {
fun speak() = println ( "Speak! $language" )
override fun sing ( vol : Int ) { // 1. 부모의 내용과 새로 구현된 내용을 가짐
super.sing ( vol ) // 상위 클래스의 sing()을 먼저 수행
println ( "I'm a parrot! The volume level is $vol" )
speak()
}
}
PersonThisSuper.kt
open class Person {
constructor ( firstName : String ) {
println ( "[Person] firstName : $firstName" )
}
constructor ( firstName : String, age : Int ) { // 3
println ( "[Person] firstName : $firstName, $age" )
}
}
class Developer : Person {
constructor ( firstName : String ) : this ( firstName , 10 ) { // 1
println ( "[Developer] $firstName" )
}
constructor (firstName : String, age : Int ) : super ( firstName, age ) { // 2
println ( "[Developer] $firstName, $age" )
}
}
fun main() {
val sean = Developer ( "Sean" )
}
PersonPriSeconRef.kt
class Person ( firstName : String,
out : Unit = println ( "[primary Constructor] Parameter" ) ) { // 2. 주 생성자
val fName = println ( "[Property] Person fName : $firstName" ) // 3. 프로퍼티 할당
init {
println ( "[init] Person init block" ) // 4. 초기화 블록
}
// 1. 보조 생성자
constructor ( firstName : String, age : Int,
out : Unit = println ( "[Secondary Constructor] Parameter" ) ) : this ( firstName ) {
println ( "[Secondary Constructor] Body : $firstName, $age" ) // 5. 부 생성자 본문
}
}
fun main() {
val p1 = Person ( "Kildong", 30 ) // 1->2 호출, 3->4->5 실행
println()
val p2 = Person ( "Dooly" ) // 2 호출, 3->4 실행
}
바깥 클래스 호출하기
- 엣(@) 기호의 이용
- 이너 클래스에서 바깥 클래스의 상위 클래스를 호출하려면 super 키워드와 함께 엣(@) 기호 옆에 바깥 클래스명을 작성해 호출
InnerClassRef.kt
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 // 부모클래스의 프로퍼티에도 open이 사용되서 하위클래스에서 재정의 할수 있다.
override fun f() = println ( "Child Class f()" )
inner class Inside {
fun f() = println ( "Inside Class f()" )
fun test() {
f() // 1. 현재 이너 클래스의 f() 접근
Child().f() // 2. 바로 바깥 클래스 f()의 접근
super@Child.f() // 3. Child의 상위 클래스인 Base 클래스의 f() 접근
println ( "[Inside] super@Child.x : ${super@Child.x}" ) // 4. Base의 x 접근
}
}
}
fun main() {
val c1 = Child()
c1.Inside().test() // 이너 클래스 Inside의 메서드 test() 실행
}
앵글브라켓을 사용한 이름 중복 해결 - AngleBracketTest.kt
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 { // 1. 콤마( , )를 사용해 클래스와 인터페이스를 지정
// 컴파일되려면 f()가 오버라이딩되어야 함
override fun f() = println ( "C Class f()" )
fun test() {
f() // 2. 현재 클래스의 f()
b() // 3. 인터페이스 B의 b()
super<A>.f() // 4. A 클래스의 f()
super<B>.f() // 5. B 클래스의 f()
}
}
fun main() {
val c = C()
c.test()
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] 변수와 타입 1 (0) | 2019.08.12 |
---|---|
[Kotlin] 언어의 특징 (0) | 2019.08.12 |
[Kotlin] 상속과 다형성 (0) | 2019.08.07 |
[Kotlin] 생성자 (0) | 2019.08.06 |
[Kotlin] 클래스와 객체의 정의 (0) | 2019.08.06 |