Kotlin Overriding

Kotlin Overriding

 Kotlin의 모든 객체는 부모 클래스형 참조 변수에 담을 수 있다. 부모 클래스형 참조 변수를 사용하면 부모 클래스에 정의되어 있는 멤버만 사용이 가능하다.

fun main() {
val obj1:SubClass1 = SubClass1()
val obj2:SuperClass1 = obj1

println("${obj2.superA1}")
obj2.superMethod1()

println("${obj2.subA1}") // obj2 SuperClass 참조 변수이므로, obj1 으로 선언을 했더라고,
                                              부모클래스의 멤버 변수 함수만 사용가능하다.
obj2.subMethod1()
}

open class SuperClass1{
var superA1 = 100

fun superMethod1(){
println("SuerMethod1")
}
}

class SubClass1 : SuperClass1() {
var subA1 = 200

fun subMethod1() {
println("SubClass")
}
}
Kotlin: Unresolved reference: subA1

Overriding

 부모클래스가 가지고 있는 메서드를 자식 클래스에서 재 정의하는 개념이다. 부모가 가지고 있는 메서드의 이름, 매개 변수 형태 모두 동일해야 한다.

fun main() {
val obj1:SubClass1 = SubClass1()
println(obj1.superA1)
obj1.superMethod1()
}

open class SuperClass1{
var superA1 = 100

fun superMethod1(){
println("SuerMethod1")
}
}

class SubClass1 : SuperClass1() {
var subA1 = 200

fun subMethod1() {
println("SubClass")
}
}

 obj1 이 SubClass 이지만, SuperClass1을 상속받은 자식클래스 이므로, 부모 클래스의 변수 및 메서드를 사용 가능하다.

fun main() {
val obj1:SubClass1 = SubClass1()
println(obj1.superA1)
obj1.superMethod1()
}

open class SuperClass1{
var superA1 = 100

open fun superMethod1() { // 메서드에 open 을 사용해서 자식 클래스에서 override 가 가능 하게 한다.
println("SuerMethod1")
}
}

class SubClass1 : SuperClass1() {
var subA1 = 200

override fun superMethod1() {
super.superMethod1()
}
}

 메서드에서 open 을 사용해서 자식클래스에서 override 가능하게 한다. 만약 open 키워드를 적어주지 않으면 아래와 같은 에러가 발생한다.
 
Kotlin: 'superMethod1' in 'SuperClass1' is final and cannot be overridden

 SuperClass 의 메서드는 아무런 키워드를 붙여주지 않으면 final 메서드로 동작을 해서 자식 클래스에서 override 할 수 없다.

Overriding의 효과

 만약, 객체가 부모형 참조 변수에 담겨 있다면 부모 영역에 정의한 멤버만 사용할 수 있다. 
 만약, 부모의 메서드를 자식에서 Overriding 했다면 부모형 참조 변수를 통해 자식의 메서드를 호출 할 수 있다.


fun main() {
val obj1:SuperClass = SuperClass()
overridingTest(obj1)

val obj2:SubClass = SubClass()
overridingTest(obj2)
}

open class SuperClass{
open fun superMethod() {
println("SuerMethod")
}
}

class SubClass : SuperClass() {
override fun superMethod() {
println("SubClass SuperMethod")
}
}

fun overridingTest(obj1:SuperClass) {
obj1.superMethod()
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SuerMethod
SubClass 의 SuperMethod


obj2 는 SubClass 타입으로 선언되어 있고, overridingTest 함수의 인자가 SuperClass 이지만 SubClass는 SuperClass의 자식클래스 이므로 부모클래스 타입으로 함수 호출이 가능하다.

자식클래스의 멤버변수로 인자를 받으면, 부모클래스의 메서드를 사용가능하고, 이 메서드가 override 되어 있으면 자식클래스의 메서드를 호출한다.

즉, 자식클래스는 부모클래스의 참조 변수에 담길 수 있고, 이렇게 사용하면 원래는 부모클래스의 메서드만 호출이 가능하나, override를 이용해서 자식클래스의 메서드를 사용가능하게 해준다.

Super

 메서드를 Overriding 한 경우, 부모의 메서드를 호출하고자 한다면, super 키워드를 사용한다. 부모 클래스의 정의한 메서드를 호출하고 싶을 때, 사용한다.





댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super