Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[14일차 Kotlin] Overriding(오버라이딩) 본문

Computer/Kotlin

[14일차 Kotlin] Overriding(오버라이딩)

Wise-99 2023. 5. 17. 19:50

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Overriding(오버라이딩)이란?

  • 부모 클래스가 가지고 있는 메서드를 자식 클래스에서 재정의하는 개념이다.
  • 부모가 가지고 있는 메서드의 이름, 매개 변수 형태 모두 동일해야 한다.
  • 만약 객체가 부모형 참조변수에 담겨 있다면 부모 영역에 정의한 멤버 사용할 수 있다.
  • 만약 부모의 메서드를 자식에서 Overriding을 했다면 부모형 참조 변수를 통해 자식의 메서드를 호출 할 수 있다.
  • 이는 이벤트 처리 방식에서 사건이 발생했을 경우 개발자가 만든 메서드를 호출하기 위해 사용하는 매우 중요한 개념이다.

super

  • 메서드를 Overriding한 경우 부모의 메서드를 호출하고자 한다면 super 키워드를 사용한다.
  • super는 상속관계에서 부모를 의미한다.

 

📖 예제 코드

SuperClass1와 SubClass1

open class SuperClass1{
    var superA1 = 100

    fun superMethod1(){
        println("SuperClass1의 superMethod1 입니다")
    }
}

class SubClass1 : SuperClass1(){
    var subA1 = 200

    fun subMethod1(){
        println("SubClass1의 subMethod1 입니다")
    }
}

 

 

 

SuperClass2와 SubClass2

open class SuperClass2{
    var superA2 = 300

    open fun superMethod2(){
        println("SuperClass2의 superMethod2 입니다")
    }
}

class SubClass2 : SuperClass2(){

    override fun superMethod2(){
        // 부모 메서드 호출
        super.superMethod2()
        println("SubClass2의 superMethod2 입니다")
    }
}

✔️ 코드 해석

  • SuperClass2의 superMethod2()
    • 클래스 안에 있는 메서드는 final 메서드로 정의된다.
      • SuperClass1의 superMethod1()도 final 메서드이다.
    • final 메서드는 overriding이 불가능하다.
    • open 키워드를 사용하면 final 메서드가 아닌 메서드로 변환된다.
    • 따라서 overriding을 위해 open 키워드를 사용했다.
  • SubClass2의 superMethod2()
    • Overriding하는 메서드는 overrdide라는 키워드를 붙여주도록 강제하고 있다.
    • 이는 overriding한 메서드라는 것을 명시하기 위함이다.

 

 

 

Main

fun main(){
    val obj1 = SubClass1()

    println("obj1.subA1 : ${obj1.subA1}")
    println("obj1.superA1 : ${obj1.superA1}")
    
    obj1.subMethod1()
    obj1.superMethod1()

    println("---------------------------")

    var obj2:SuperClass1 = SubClass1()
    println("obj2.subA1 : ${obj2.subA1}")     <<< 오류 발생
    println("obj2.superA1 : ${obj2.superA1}")
    obj2.subMethod1()                         <<< 오류 발생
    obj2.superMethod1()

    println("-----------------------------")
    val obj3 = SubClass2()
    obj3.superMethod2()

    println("-----------------------------")

    val obj4:SuperClass2 = SubClass2()
    obj4.superMethod2()
}

✔️ 코드 해석

  • val obj1 = SubClass1() ...
    • SuperClass1()을 상속받은 SubClass1()의 객체이다.
    • 자식 클래스 타입이므로 자신의 멤버와 부모의 멤버 모두 사용이 가능하다.
  • var obj2:SuperClass1 = SubClass1() ...
    • SubClass1의 객체를 부모 클래스인 SuperClass1형 obj2에 담아준다.
    • obj2는 부모클래스 타입이기 때문에 부모 맴버만 사용이 가능하다.
  • obj4.superMethod2()
    • obj4는 부모 클래스(SuperClass2)형의 프로퍼티이다.
    • superMethod2()는 오버라이딩 되어 있기 때문에 부모의 메서드가 아닌 자식의 메서드가 호출된다.