본문 바로가기

TEKHIT ANDROID SCHOOL

[TEKHIT] Any & This Super

출처 : Tekhit Android App School / Soft campus 윤재성 강사님

🎉 Any

  • Kotlin에서 사용하는 모든 클래스의 부모 클래스입니다.
  • 클래스 작성시 상속 관계를 설정하지 않으면 자동으로 Any Class를 상속합니다.
  • 모든 객체는 Any Type에 담을 수 있습니다.
  • 자바의 Object와 같은 기능을 합니다.
fun main(){
    val a1:Any = TestClass1()
    val a2:Any = TestClass2()
}

// 상속 관계를 설정하지 않았지만 Any를 상속받는다.
class TestClass1
class TestClass2

🎉 This

  • 객체 자기 자신을 가르키는 키워드
  • 클래스의 프로퍼티와 매개변수의 이름이 같은 경우 이를 구분하기 위해 사용
fun main(){
    val t1 = TestClass1()
    t1.testMethod1(1)
}

class TestClass1{
    var value1 = 100

    fun testMethod1(value1: Int){
        println("value1 : $value1")
        println("this.value1 : ${this.value1}")
    }
}
  • TestClass1 의 프로퍼티 value1의 이름과 testMethod1() 메소드의 매개 변수의 이름이 같은 경우 프로퍼티에 접근하고 싶다면 this를 통해 접근합니다.

  • 멤버 메서드와 메서드 내부의 메서드를 구분할 때 사용
fun main(){
    t1.testMethod2()
}

class TestClass1{
    fun testMethod2(){

        fun innerMethod1(){
            println("innerMethod1 호출")
        }

        innerMethod1()

        fun testMethod3(){
            println("testMethod2 메서드의 내부 메서드 testMethod3")
        }

        testMethod3()

        this.testMethod3()
    }

    fun testMethod3(){
        println("나는 TestClass1의 testMethod3")
    }
}
  • 클래스의 멤버 메소드와 testMethod3() 동일한 이름을 가진 내부 메소드 testMethod3()을 생성
  • this를 사용하여 멤버 메소드 testMethod3()을 호출

  • 다른 생성자를 호출하는데 사용합니다.
  • 클래스에 주 생성자가 정의되어 있다면 무조건 주 생성자를 호출해줘야 합니다.
fun main(){
    val t2 = TestClass2()
    println("t2 : $t2")
}

class TestClass2{
    constructor() : this(100){
        println("매개 변수가 없는 생성자 호출")
    }

    constructor(a1:Int){
        println("매개 변수가 있는 생성자 호출")
        println("a1 : $a1")
    }
}

🎉 Super

  • 부모 영역을 지칭
  • 객체가 가지고 있는 property(변수)와 부모가 가지고 있는 property(변수)를 구분하기 위해 사용
open class SuperClass1{
    open var superValue1 = 100

    constructor(){
        println("SuperClass1의 생성자")
    }

    constructor(a1:Int){
        println("매개 변수를 가지고 있는 SuperClass1의 생성자")
        println("a1 : $a1")
    }
}


class SubClass1: SuperClass1{
    override var superValue1 = 200

    constructor():super(1000){
        println("SubClass1의 생성자 호출")
    }
}
  • 부모 클래스에 정의된 프로퍼티와 동일한 이름의 프로퍼티를 만들고자 한다면 부모가 가지고 있는 프로퍼티 중에 open 프로퍼티만 가능하며 앞에 override 키워드를 붙혀줘야 한다.
  • 자식 클래스에서 동일한 이름의 프로퍼티를 만드는 것을 허용하겠다면 open을 붙혀준다.
  • 코틀린의 모든 클래스는 생성자에서 부모 클래스의 생성자 호출을 명시하지 않으면 자동으로 부모의 생성자 중 매개변수가 없는 생성자가 호출된다.
  • 호출되는 부모의 생성자를 명시적으로 지칭하겠다면 super를 사용한다.
open class SuperClass1{
    open var superValue1 = 100

    constructor(){
        println("SuperClass1의 생성자")
    }

    constructor(a1:Int){
        println("매개 변수를 가지고 있는 SuperClass1의 생성자")
        println("a1 : $a1")
    }

    // 자식 클래스에서 메서드를 재 구현(overriding)을 허용하겠다면 open을 붙혀준다.
    open fun superMethod2(){
        println("SuperClass1의 superMethod2")
    }
}

class SubClass1: SuperClass1{
    
    override var superValue1 = 200
    
    constructor():super(1000){
        println("SubClass1의 생성자 호출")
    }

    fun subMethod1(superValue1:Int){
        println("superValue1 : $superValue1")
        println("this.superValue1 : ${this.superValue1}")
        println("super.superValue : ${super.superValue1}")
    }

    override fun superMethod2() {
        println("SubClass1의 superMethod2")
    }

    fun subMethod2(){
        superMethod2()
        super.superMethod2()
    }
}
  • 매개변수의 이름이나 맴버 프로퍼티의 이름이 부모의 프로퍼티 이름과 동일할 경우 super를 통해 부모의 프로퍼티에 접근합니다
  • 부모의 메서드를 자식에서 재 구현한 경우 부모의 메서드를 호출하고자 한다면 super를 사용합니다.

GIT HUB

 

GitHub - chanho0908/Tekit_Android_App_School: Tekit Android App School Kotlin Study

Tekit Android App School Kotlin Study. Contribute to chanho0908/Tekit_Android_App_School development by creating an account on GitHub.

github.com