본문 바로가기

# 02/코틀린

[Kotlin] super와 this의 참조

반응형

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